VBA(Excelマクロ)でcsv・テキストファイルを編集する方法


掲載日:2022年7月5日



INFOMARTION > VBA(Excelマクロ)でcsv・テキストファイルを編集する方法

概要

VBA(Excelマクロ)でcsv・テキストファイルを編集する方法について記載したいと思います。以下の作業をプログラミングしたい人向けの記事となります。

  • 既にあるcsvファイル、テキストファイルに行追加をしたい。行の途中に文字追加をしたい。
  • 既にあるcsvファイル、テキストファイルの行削除をしたい。

目次

  1. プログラミング方法
  2. コードの説明
  3. まとめ

1. プログラミング方法

結論から言うと、FileSystemObjectには行の途中に追記や、特定の行を削除する機能が無いので自力でプログラミングする必要があります。

プログラミングの参考例は以下となります。

Functionで作成しているので、そのままコピペで持ってきて、Subからメソッド呼び出ししてもらえればと思います。

'Parameter Examples
'## filePath      C:\Users\user\Desktop\test\test.txt
'## mode          false:delete, true:write
'## targetRow     10
'## targetInput   If in write mode, any character
'## lineBreakType false:vbLf, true:vbCrLf

Function editFile(filePath As String, mode As Boolean, targetRow As Long, targetInput As String, lineBreakType As Boolean)
 
'File existence check
If Dir(filePath) = "" Then
  MsgBox "File does not exist!"
  Exit Function
End If
 
Dim tempText As String
Dim tempTextBefore As String
Dim tempTextNew As String
Dim tempTextAfter As String
Dim resultText As String
Dim i As Long
'File read
With CreateObject("ADODB.Stream")
  .Charset = "UTF-8"
  .Open
  .LoadFromFile filePath
  tempText = .ReadText
  .Close
End With
Dim tempTextBeforeRow As Long
tempTextBeforeRow = 0
For i = 1 To targetRow - 1
  If lineBreakType Then
    tempTextBeforeRow = InStr(tempTextBeforeRow + 1, tempText, vbCrLf)
  Else
    tempTextBeforeRow = InStr(tempTextBeforeRow + 1, tempText, vbLf)
  End If
Next i
If lineBreakType Then
  tempTextBeforeRow = tempTextBeforeRow + 1
End If
 
tempTextBefore = Left(tempText, tempTextBeforeRow)
'write
If mode Then
  tempTextAfter = Mid(tempText, tempTextBeforeRow + 1, Len(tempText))
  If lineBreakType Then
    tempTextNew = targetInput & vbCrLf
  Else
    tempTextNew = targetInput & vbLf
  End If
  resultText = tempTextBefore & tempTextNew & tempTextAfter
'delete
Else
  Dim tempTextAfterRow As Long
  tempTextAfterRow = 0
  For i = 1 To CInt(targetRow)
    If lineBreakType Then
      tempTextAfterRow = InStr(tempTextAfterRow + 1, tempText, vbCrLf)
    Else
      tempTextAfterRow = InStr(tempTextAfterRow + 1, tempText, vbLf)
    End If
  Next i
  If lineBreakType Then
    tempTextAfterRow = tempTextAfterRow + 1
  End If
  tempTextAfter = Mid(tempText, tempTextAfterRow + 1, Len(tempText))
  resultText = tempTextBefore & tempTextAfter
End If
 
With CreateObject("ADODB.Stream")
  .Charset = "UTF-8"
  If lineBreakType Then
    .LineSeparator = -1
  Else
    .LineSeparator = 10
  End If
  .Open
  .WriteText tempTextBefore & tempTextNew & tempTextAfter, 0
  .SaveToFile filePath, 2
  .Close
End With
End Function

使い方としては、以下の様に引数を渡します。

  • filePath・・・ファイルのフルパスとなります。例)C:\Users\user\Desktop\test\test.txt
  • mode・・・true,falseを渡します。Trueの場合、追記します。Falseの場合行削除します。
  • targetRow・・・ターゲットなる行数を指定します。追記の場合は追記する行数、削除の場合は削除する行数となります。
  • targetInput・・・追記の場合、追記する値を指定します。削除の場合は使用しないので任意の値で大丈夫です。空文字でも大丈夫です。
  • lineBreakType・・・改行の文字の設定。Trueの場合、vbCrLf。Falseの場合vbLf。ざっくり説明するとWindowsで作成したファイルの場合はTrueとなります。

文字コードはUTF-8となりますが、変更したい場合は直接Functionのコードを修正してください。2個所ありますが「.Charset = "UTF-8"」の部分です。

実際のFunctionを呼び出す実装例は以下です。

Sub test()
 
'test.txtの5行目にtest123を追記する例。(Windowsで作成したファイル)
editFile "C:\Users\user\Desktop\test\test.txt", True, 5, "test123", True
 
'test.txtの5行目を削除する例。(Windowsで作成したファイル)
editFile "C:\Users\user\Desktop\test\test.txt", False, 5, "", True
 
End Sub

csvとして追記したい場合は追記する値の引数をカンマ区切りの値にしてあげれば、カンマ区切りの値が追記されます。例)"test1,test2,test3"

2. コードの説明

使い方の説明は以上で、続いてコードの説明をします。

細かい部分はコードを見ていただきたいですが、ざっくり処理の流れは以下となります。

追記の場合

  • ①引数で渡したパスにあるテキストファイルの読み込み
  • ②引数で渡した行数までの文字数を改行の数より特定する。例えば5行目の場合、5行目より前に改行が4つあるので、4個目の改行が見つかる位置を探す
  • ③4行目までの情報を取得する。
  • ④②と同じ要領で5行目以降の情報を取得する
  • ⑤③の情報、引数で渡した追記したい情報、④の情報を合わせて合体させる。
  • ⑥⑤の情報を元にファイルを作成して上書き保存する。

削除の場合

  • ①引数で渡したパスにあるテキストファイルの読み込み
  • ②引数で渡した行数までの文字数を改行の数より特定する。例えば5行目の場合、5行目より前に改行が4つあるので、4個目の改行が見つかる位置を探す
  • ③4行目までの情報を取得する。
  • ④②と同じ要領で6行目以降の情報を取得する
  • ⑤③の情報、④の情報を合わせて合体させる。(5行目が無い状態の文字列を作成する)
  • ⑥⑤の情報を元にファイルを作成して上書き保存する。

追記、削除の場合、両方同じですが、ファイルを編集するというより、ファイルを元に必要な情報だけ抜いてきて、新しくファイルを作成して上書き保存するような作りとなります。

3. まとめ

VBA(Excelマクロ)でcsv・テキストファイルの編集にお困りの方は参考にしてみてください。

最後までご覧いただきありがとうございました。



■INFORMATION

INFORMATIONのトップページはこちらよりお願いいたします。


■PROFILE

プロフィールはこちらよりお願いいたします。


■お問い合わせ先

記事に関するお問い合わせはこちらよりお願いいたします。