CSVファイル内にあるデータの中から指定した文字列を検索し、該当した行だけをExcelに書き出すマクロを紹介します。
今回の事例では「test2.csv(事前準備必要)」ファイル内の列名”品目”の列に”リンゴ”という文字列が存在している行のみをExcelに書き出す処理を行います。
Sub CSVファイル内の文字列検索該当行のみExcelに書き出す()
Dim fso As Object
Dim file As Object
Dim filePath As String 'ファイル名とパスを指定
Dim filename As Object 'CSVファイル名を取得する用
Dim line As String '読み込み用変数の宣言
Dim searchtitle As String '検索する列名の文字列
Dim searchString As String '検索対象の文字列
Dim searchcolmun As Integer '検索対象の列
Dim j, k, m '繰り返し用の変数
'ファイルのパスを指定する
filePath = "C:\test\test2.csv"
Set fso = CreateObject("Scripting.FileSystemObject")
Set file = fso.OpenTextFile(filePath)
Set filename = fso.GetFile(filePath)
'検索対象の列名を指定する
searchtitle = "品目"
'検索対象の文字列を指定する
searchString = "リンゴ"
'CSVファイルのデータを書き出すExcelの行(k=1行目スタート)
k = 1
'csvファイルを最終行目まで繰り返す
Do Until file.AtEndOfStream
line = file.readline
Data = Split(line, ",")
If k = 1 Then
For j = LBound(Data) To UBound(Data)
If InStr(Data(j), searchtitle) > 0 Then
'検索対象の列名を指定する
searchcolmun = j
'列名をExcelに書き出す
For m = LBound(Data) To UBound(Data)
Cells(k, m + 1) = Data(m)
Next m
'列名が検索でヒットしたらk=1にしてフラグ立て
k = k + 1
'列名の検索がヒットしたのでfor(j)の繰り返しから抜ける
j = UBound(Data)
End If
Next j
'列名が見つからない場合はマクロを終了
If k = 0 Then
MsgBox "検索対象の列名が見つかりません"
Exit Sub
End If
Else 'k<>1(検索対象列確定後)
If InStr(Data(searchcolmun), searchString) > 0 Then
'検索文字列がヒットしたCSVファイルの行をExcelに書き出す
For j = LBound(Data) To UBound(Data)
Cells(k, j + 1).Value = Data(j)
Next j
k = k + 1 'Excelに書き出す行を1行進める
End If
End If
Loop
'csvファイルを閉じる
file.Close
End Sub
マクロを実行すると下図のようにエクセルにCSVから該当する行だけ書き出されます。
今回は1個のCSVファイル内の処理でしたが、複数ファイルが検索対象になる場合は上記コードの対象を応用することで対応できます。
コメント