ExcelでCSVファイルを扱う機会は多いですが、「CSV内の特定のデータだけを自動で変更したい」というニーズもよくあります。そんなときに役立つのがVBA(Visual Basic for Applications)です。
本記事では、VBAを使ってCSVファイルを読み込み、指定したフィールド(列)の値を編集し、再びCSVとして保存する方法を丁寧に解説します。実務でも応用できるよう、具体的なコード例を交えて紹介しますので、ぜひ参考にしてください。
VBAでCSVを扱うには、以下のようなステップで進めるのが一般的です。
CSVはテキストファイルなので、Excelのセル操作ではなく、**ファイル入出力(File I/O)**の処理がメインになります。
まずはCSVファイルを読み込み、1行ずつ配列として取り出す基本コードを紹介します。
Sub ReadCSV()
Dim filePath As String
Dim fileNumber As Integer
Dim line As String
Dim fields() As String
filePath = "C:\sample.csv"
fileNumber = FreeFile
Open filePath For Input As #fileNumber
Do Until EOF(fileNumber)
Line Input #fileNumber, line
fields = Split(line, ",")
' ここでfields(0), fields(1), ...などにアクセス可能
Debug.Print fields(0) ' 1列目のデータを出力
Loop
Close #fileNumber
End Sub
このコードはファイルの中身を読み込むだけですが、次のステップで編集を加える処理を追加します。
では、CSVファイル内の「3列目が”Tokyo”である行の5列目を”Updated”に変更する」例を見てみましょう。
Sub EditCSVField()
Dim inputPath As String
Dim outputPath As String
Dim fileIn As Integer, fileOut As Integer
Dim line As String
Dim fields() As String
Dim editedLine As String
inputPath = "C:\input.csv"
outputPath = "C:\output.csv"
fileIn = FreeFile
Open inputPath For Input As #fileIn
fileOut = FreeFile
Open outputPath For Output As #fileOut
Do Until EOF(fileIn)
Line Input #fileIn, line
fields = Split(line, ",")
If UBound(fields) >= 4 Then ' 5列目まで存在するかチェック
If Trim(fields(2)) = "Tokyo" Then
fields(4) = "Updated"
End If
End If
editedLine = Join(fields, ",")
Print #fileOut, editedLine
Loop
Close #fileIn
Close #fileOut
MsgBox "CSV編集完了。出力ファイル:" & outputPath
End Sub
この処理では、指定条件に一致する行の特定列だけを編集しています。元のファイルを壊さないように、新しいファイルに出力しているのもポイントです。
出力ファイルを元のファイル名と同じにしてしまえば、実質的に「上書き保存」となります。ただし、途中で処理が止まってしまうとファイルが壊れる恐れがあるため、以下のように一時ファイルを使って安全に上書きする方法がおすすめです。
Name "C:\input.csv" As "C:\input_backup.csv"
Name "C:\output.csv" As "C:\input.csv"
このようにバックアップを取った上で差し替えることで、より安全にCSV編集が行えます。
VBAと聞くと「セルを操作するコード」を思い浮かべる方も多いですが、CSVファイルはExcelのシートではなく「テキストファイル」です。そのため、セルではなく文字列としての行・フィールドを操作する意識が重要です。
特に以下の点に注意しましょう:
Cells(row, col).Value
は使いません応用として、「列Aが”John”、かつ列Cが”Osaka”の場合、列Dを”Checked”に更新」するコードは次の通りです。
If fields(0) = "John" And fields(2) = "Osaka" Then
fields(3) = "Checked"
End If
条件を増やす場合は、And
, Or
を組み合わせれば自由に対応できます。
VBAによるCSV編集は、日々の業務で大量のCSVデータを処理する際に非常に便利です。マクロとして保存しておけば、再利用も簡単。今回紹介したコードをベースに、業務に応じた条件や処理内容を追加してカスタマイズしてみてください。