適材適所

PowerShellやVBAなどプログラミング系の話多めで

【VBA】テキストファイルの先頭に書き込む

VBAでテキストファイルに書き込むときに追記は簡単ですが、

先頭に書き込むのは意外と面倒だったりします。

先日、基幹システムからデータを取り出してくることがあり、

CSVファイルにするところまでは基幹システム側で簡単にできたのですが、

CSVのヘッダを付与するのが、基幹システム側でやるのは

めっちゃくそ面倒だったのでPC側でやることにしました。

CSVファイルとは言えども、単なるテキストなので、

最初は先頭にヘッダを無理やり書き込めば簡単!!

などと軽く考えていましたが、

VBAでやろうとしたら簡単な方法がない・・・。

仕方がないので簡単(?)なプログラムを書いたので備忘録も兼ねて残しておきます。

テキストファイルの先頭に書き込みを行うコード

FileSystemObjectを使うので

参照設定しておく前提です。

コピペする際はお気をつけくださいませ。

 
Sub sample()
    Const ADD_STRING as String="ADD String"
    Dim fPath as String
    fPath="対象のファイルパス"
    Dim fso As FileSystemObject: Set fso = New FileSystemObject
    '読取専用で対象のファイルを開く
    Dim strm1 As TextStream: Set strm1 = fso.OpenTextFile(fPath, ForReading)
    '書き込み用のファイルを作成する
    Dim tmpName as String:tmpName=fso.GetTempName
    Dim strm2 As TextStream: Set strm2 = fso.CreateTextFile(ThisWorkbook.Path & "\" & tmpName)
    '書き込み用のファイルに追記したい文字を最初に書いてしまう
    strm2.WriteLine ADD_STRING
    '後は対象のファイルの内容を全て書き込み用ファイルに書き込む
    Do Until strm1.AtEndOfStream
        strm2.WriteLine strm1.ReadLine
    Loop
    strm1.Close
    strm2.Close
    '既存のファイルは消しちゃう
    fso.DeleteFile fPath
    '書き込みが完了したファイルの名前を既存のファイルに変名
    fso.GetFile(ThisWorkbook.Path & "\" & tmpName).Name = fso.GetFileName(fPath)
    
    Set fso = Nothing
    Set strm1 = Nothing
    Set strm2 = Nothing
End Function

なんてことはないんですが、

ただ、単純に、新しいテキストに書き込みたい文字を書き込んだ後に、

既存のデータを書き込んでるだけです。

特にひねったことはありません。

注意点

文字コード

テキストファイルを扱うときの一般的な注意点ですが、

文字コードを全く意識してないのでSJIS限定です。

意識する場合は、ADODBのStreamの利用を検討してみてください。

終わりに

Microsoftさんお願いだから、VBAでテキストファイルの先頭に書き込む便利な昨日を提供してください。

まぁVBAでの機能拡張はまずないでしょうね・・・。

仕方がないので自作機能でシコシコがんばんりましょう。

ここまでお読みいただき、ありがとうございました。

FileSystemObjectを使う他の記事

www.tekizai.net

www.tekizai.net

www.tekizai.net