Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3156 / 13646 ツリー ←次へ | 前へ→

【63859】桁数に合わせてるやりかた やす 09/12/23(水) 11:33 質問[未読]
【63862】Re:桁数に合わせてるやりかた Hirofumi 09/12/23(水) 13:39 回答[未読]
【63863】Re:桁数に合わせてるやりかた Hirofumi 09/12/23(水) 13:43 回答[未読]
【63872】Re:桁数に合わせてるやりかた やす 09/12/24(木) 21:12 お礼[未読]

【63859】桁数に合わせてるやりかた
質問  やす  - 09/12/23(水) 11:33 -

引用なし
パスワード
   質問します。

A列に以下のように数値が入っているとします。
1
10
100

↑これを読み数値の部分を桁数合わせて前にゼロを補充しテキストファイルに以下のように出力したいのですが、
よくわかりません。教えてもらえませんでしょうか?

項番1△△0001
項番2△△0010
項番3△△0100

△:空白の意味

【63862】Re:桁数に合わせてるやりかた
回答  Hirofumi  - 09/12/23(水) 13:39 -

引用なし
パスワード
   A列先頭行は列見出しとします

Option Explicit

Public Sub Sample()

  Dim i As Long
  Dim lngRows As Long
  Dim rngList As Range
  Dim vntData As Variant
  Dim vntFilename As Variant
  Dim dfn As Integer
  Dim strFilter As String
  Dim strBuff As String
  Dim strProm As String

  'フィルタ文字列を作成
  strFilter = "Text File (*.txt),*.txt"

  '出力ファイル名を取得
  vntFilename = Application.GetSaveAsFilename(, strFilter)
  If VarType(vntFilename) = vbBoolean Then
    strProm = "マクロがキャンセルされました"
    GoTo Wayout
  End If

  '◆Listの先頭セル位置を基準とする(先頭列の列見出しのセル位置)
  Set rngList = ActiveSheet.Range("A1")

  With rngList
    '行数の取得
    lngRows = .Offset(Rows.Count - .Row).End(xlUp).Row - .Row
    If lngRows <= 0 Then
      strProm = "データが有りません"
      GoTo Wayout
    End If
    '列データを配列に取得
    vntData = .Offset(1).Resize(lngRows + 1).Value
  End With
  
  '出力ファイルをOpen
  dfn = FreeFile
  Open vntFilename For Output As dfn
  
  'Key列に就いて繰り返し
  For i = 1 To lngRows
    strBuff = Right(String(4, "0") & vntData(i, 1), 4)
    Print #dfn, "項番" & i & AdjustData(strBuff, 6, "R")
  Next i
  
  Close #dfn
  
  strProm = "処理が完了しました"
   
Wayout:

  Set rngList = Nothing
   
  MsgBox strProm, vbInformation
     
End Sub

Private Function AdjustData(ByVal strData As String, _
              ByVal lngLength As Long, _
              Optional ByVal strAlign As String = "L") As String

'  Dataをフィールド長に調整

'  lngLengthはフィールドの長さを半角何文字分(バイト単位)で
'  strDataはデータを文字列の型で
'  strAlignは、右詰なら"R"、"r"で、 左詰なら"L"、"l"で(ディフォルトは"L")

  Dim strSpace As String
  Dim strTmp As String
  Dim i As Long
  Dim lngCount As Long

  If strData = "" Then
    AdjustData = Space(lngLength)
    Exit Function
  End If

  If Len(strData) > lngLength Then
    strData = Left(strData, lngLength)
  End If
  '文字列を Unicode からシステムの既定のコード ページに変換します
  strTmp = StrConv(strData, vbFromUnicode)

  'フィールド長よりDataが長い場合、2バイト文字の処理を行います
  i = 1
  Do Until LenB(strTmp) <= lngLength
    strTmp = StrConv(Left(strData, Len(strData) - i), vbFromUnicode)
    i = i + 1
  Loop

  'Spaceで調整する必要がある場合
  If lngLength > LenB(strTmp) Then
    '長さ調整用のスペースを作成します
    strSpace = StrConv(String$(lngLength, " "), vbFromUnicode)
    '中央揃えの場合
    If strAlign = "C" Or strAlign = "c" Then
      'Spaceを文字列で置き換えます
      MidB(strSpace, ((lngLength - LenB(strTmp)) \ 2) + 1) = strTmp
    Else
      'Dataをフィールド長に調整します
      If strAlign = "R" Or strAlign = "r" Then
        'Spaceを文字列で置き換えます
        MidB(strSpace, lngLength - LenB(strTmp) + 1) = strTmp
      Else
        'Spaceを文字列で置き換えます
        MidB(strSpace, 1) = strTmp
      End If
    End If
    'システムの既定のコード ページを使って文字列を Unicode に変換します
    AdjustData = StrConv(strSpace, vbUnicode)
  Else
    'システムの既定のコード ページを使って文字列を Unicode に変換します
    AdjustData = StrConv(strTmp, vbUnicode)
  End If


End Function

【63863】Re:桁数に合わせてるやりかた
回答  Hirofumi  - 09/12/23(水) 13:43 -

引用なし
パスワード
   固定長レコードを意識しないならこんなでも

Option Explicit

Public Sub Sample_2()

  Dim i As Long
  Dim lngRows As Long
  Dim rngList As Range
  Dim vntData As Variant
  Dim vntFilename As Variant
  Dim dfn As Integer
  Dim strFilter As String
  Dim strBuff As String
  Dim strProm As String

  'フィルタ文字列を作成
  strFilter = "Text File (*.txt),*.txt"

  '出力ファイル名を取得
  vntFilename = Application.GetSaveAsFilename(, strFilter)
  If VarType(vntFilename) = vbBoolean Then
    strProm = "マクロがキャンセルされました"
    GoTo Wayout
  End If

  '◆Listの先頭セル位置を基準とする(先頭列の列見出しのセル位置)
  Set rngList = ActiveSheet.Range("A1")

  With rngList
    '行数の取得
    lngRows = .Offset(Rows.Count - .Row).End(xlUp).Row - .Row
    If lngRows <= 0 Then
      strProm = "データが有りません"
      GoTo Wayout
    End If
    '列データを配列に取得
    vntData = .Offset(1).Resize(lngRows + 1).Value
  End With
  
  '出力ファイルをOpen
  dfn = FreeFile
  Open vntFilename For Output As dfn
  
  'Key列に就いて繰り返し
  For i = 1 To lngRows
    strBuff = Right(String(4, "0") & vntData(i, 1), 4)
    Print #dfn, "項番" & i & " " & strBuff
  Next i
  
  Close #dfn
  
  strProm = "処理が完了しました"
   
Wayout:

  Set rngList = Nothing
   
  MsgBox strProm, vbInformation
     
End Sub

【63872】Re:桁数に合わせてるやりかた
お礼  やす  - 09/12/24(木) 21:12 -

引用なし
パスワード
   なるほど助かりました。

▼Hirofumi さん:
>固定長レコードを意識しないならこんなでも
>
>Option Explicit
>
>Public Sub Sample_2()
>
>  Dim i As Long
>  Dim lngRows As Long
>  Dim rngList As Range
>  Dim vntData As Variant
>  Dim vntFilename As Variant
>  Dim dfn As Integer
>  Dim strFilter As String
>  Dim strBuff As String
>  Dim strProm As String
>
>  'フィルタ文字列を作成
>  strFilter = "Text File (*.txt),*.txt"
>
>  '出力ファイル名を取得
>  vntFilename = Application.GetSaveAsFilename(, strFilter)
>  If VarType(vntFilename) = vbBoolean Then
>    strProm = "マクロがキャンセルされました"
>    GoTo Wayout
>  End If
>
>  '◆Listの先頭セル位置を基準とする(先頭列の列見出しのセル位置)
>  Set rngList = ActiveSheet.Range("A1")
>
>  With rngList
>    '行数の取得
>    lngRows = .Offset(Rows.Count - .Row).End(xlUp).Row - .Row
>    If lngRows <= 0 Then
>      strProm = "データが有りません"
>      GoTo Wayout
>    End If
>    '列データを配列に取得
>    vntData = .Offset(1).Resize(lngRows + 1).Value
>  End With
>  
>  '出力ファイルをOpen
>  dfn = FreeFile
>  Open vntFilename For Output As dfn
>  
>  'Key列に就いて繰り返し
>  For i = 1 To lngRows
>    strBuff = Right(String(4, "0") & vntData(i, 1), 4)
>    Print #dfn, "項番" & i & " " & strBuff
>  Next i
>  
>  Close #dfn
>  
>  strProm = "処理が完了しました"
>   
>Wayout:
>
>  Set rngList = Nothing
>   
>  MsgBox strProm, vbInformation
>     
>End Sub

3156 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free