VBAで複数データファイルを読込、対象データのみ書込方法

プログラム

前回作成したVBA 複数CSVファイル読込 対象データのみ書込
修正しました。
綺麗なデータファイルだったら前回のでもよかったんですけど、
空白行、コメント行などデータとは関係ない行があると
ファイルを上手く読み込めなかったので直しました。

修正点

  • INPUTファイル:CSVファイル→CSVファイル、TEXTファイル
  • INPUTファイルに空白行が存在した場合、読み飛ばす
  • INPUTファイルに区切り文字が存在しない行が存在した場合、読み飛ばす
    (コメント行等)
  • 検索キー列を指定する
  • INPUTファイルの区切り文字を指定する

VBA 複数データファイル読込 対象データのみ書込

Data_read:
 メインモジュールです。
 INPUTファイルの読込、エクセルへのデータ出力を実施しています。

Sub Data_read()
'読込行&列指定
    Dim buf As Variant
    Dim Fnames As Variant
    Dim fn As Variant
    Dim FNo As Integer
    Dim TextLine As String
    Dim SplitType As String
    Dim Key As Variant
    Dim KeyColumn As Integer
    Dim TargetColumn As Variant
    
    Const RowMax As Long = 99
    Const ColMax As Long = 29
    flg = False
    
    ReDim Outline(RowMax, ColMax)
    
    Application.ScreenUpdating = False ' 描画を停止する
    
    Call GetKey(Key, KeyColumn, TargetColumn, SplitType)
    
    Fnames = Application.GetOpenFilename _
        ("DataFile, *.csv;*.txt", 1, "ファイルインポート", , True)
    If VarType(Fnames) = vbBoolean Then Exit Sub

    For Each fn In Fnames
    
        FNo = FreeFile(0)
        Open fn For Input As #FNo
    
        Do While Not EOF(FNo)
            Line Input #FNo, TextLine
            buf = Split(TextLine, SplitType)
            '対象データを格納
            If UBound(buf) > 0 Then
                Call DataSet(Key, KeyColumn, TargetColumn, buf, Outline, ColMax)
            End If
        Loop
    Close #FNo
    Next fn
    
    Application.ScreenUpdating = True  ' 描画を再開する
    
    '2シート目を選択:【前提】2シート目にTEXTの内容を出力
    Worksheets(2).Select
    Range("A1").Resize(100, 30) = Outline

    '出力した値がそのままexcel上で計算できないので数値の1を乗算する
    Sheets("key").Select
    Range("F2").Select
    Selection.Copy
    Sheets("Output").Select
    Range("B1").Select
    Range(Selection, Selection.End(xlDown)).Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlMultiply, _
        SkipBlanks:=False, Transpose:=False
End Sub

DataSet:
 指定したキーワード行の対象データを配列に格納してます。

Public Function DataSet(ByVal Key As Variant, ByVal TargetColumn As Variant, ByVal buf As Variant, ByRef Outline As Variant, ByVal ColMax As Long)

    Dim i As Long
    Dim j As Long
    Dim k As Long
    Dim flg As Boolean
    
    '対象キーワードの値を配列に格納
    For i = 1 To UBound(Key)
        If buf(0) = Key(i, 1) Then
            For j = 0 To UBound(Outline)
                If Outline(j, 0) = "" Then
                    If UBound(buf) >= TargetColumn - 1 Then
                        Outline(j, 0) = Key(i, 1)
                        Outline(j, 1) = "'" & buf(TargetColumn - 1)
                        flg = True
                    End If
                    Exit For
                End If
                If Outline(j, 0) = Key(i, 1) Then
                    For k = 1 To ColMax
                       If Outline(j, k) = "" Then
                            If UBound(buf) >= TargetColumn - 1 Then
                                Outline(j, k) = "'" & buf(TargetColumn - 1)
                                flg = True
                            End If
                            Exit For
                        End If
                    Next k
                End If
                If flg = True Then
                    flg = False
                    Exit For
                End If
            Next j
            If flg = True Then
                flg = False
                Exit For
            End If
        End If
    Next i

End Function

GetKey:
 1シート目に記入した下記を取得します。
 ・検索文字列
 ・検索キー列
 ・取得対象データ列
 ・INPUTファイルの区切り文字(カンマ、半角スペース等)
 取得対象データ列はこの関数単体では複数の値を取得する作りにしていますが
 メインモジュールは取得対象データ列は1列しかないことを前提に
 処理を記載しています。

Public Function GetKey(ByRef SearchKey As Variant, ByRef column As Variant, ByRef SplitType)

    '1シート目を選択:【前提】1シート目のA列に検索キーを書く
    Worksheets(1).Select
    'A列の検索キーを取得(A1は除く)
    SearchKey = Range("A2", Cells(Rows.Count, 1).End(xlUp)).Value
    'B列の対象データ列を取得(B1は除く)
    column = Range("B2", Cells(Rows.Count, 2).End(xlUp)).Value
    'C2の対象データを取得
    SplitType = Cells(2, 3).Value

End Function

使い方

前回(VBA 複数CSVファイル読込 対象データのみ書込)からの変更点は
下記を指定できるようにした部分のみです。
・B列に検索キー列
・D列にINPUTファイルのデータ区切り文字
詳細は前回の記事を参照お願いします。