Excelのセル範囲をそのままCSVやテキストとして出力するだけでなく、VBAを使って完全に自由なフォーマットでテキストファイルを作成したい、という場面があります。例えば、独自のログファイルを作成したり、特定のシステムが要求する特殊な形式のデータファイルを生成したりする場合です。
この記事では、VBAのOpen
、Print #
、Close
ステートメントを使い、文字列や変数を組み合わせて、思い通りの内容のテキストファイルを作成する方法を解説します。
完成したVBAコード
まず、解説のベースとなる完成したVBAコードをご紹介します。このコードは標準モジュールに貼り付けることで、すぐに動作を試すことができます。
Sub CreateCustomTextFile()
' 変数を宣言します
Dim outputFilePath As String
Dim fileNum As Integer
Dim recordId As String
' --- 設定値 ---
recordId = "ID-" & Format(Now, "yyyymmdd-HHmmss")
' 保存するファイルのパスとファイル名を指定します
outputFilePath = ThisWorkbook.Path & "\CustomTextOutput.txt"
' FreeFile関数で、現在使用されていないファイル番号を取得します
fileNum = FreeFile
' 指定したパスに、書き込みモード(Output)でファイルを開きます
Open outputFilePath For Output As #fileNum
' Print #ステートメントで、ファイルにテキストを書き込みます
Print #fileNum, "--- 処理レポート ---"
Print #fileNum, "作成日時: " & Now()
Print #fileNum, "" ' 空行を挿入
' 末尾にセミコロン「;」を付けると、改行せずに次の書き込みを連結できます
Print #fileNum, "レコードID: ";
Print #fileNum, recordId
' ファイルを閉じます (これを忘れるとファイルが破損する可能性があります)
Close #fileNum
MsgBox "テキストファイルの書き出しが完了しました。"
End Sub
コードの主要なポイント解説
上記のコードがどのような仕組みで動作するのか、重要な部分をステップごとに解説します。
① ファイルパスの準備
Dim outputFilePath As String
outputFilePath = ThisWorkbook.Path & "\CustomTextOutput.txt"
まず、作成するテキストファイルの保存場所と名前を、outputFilePath
という変数に格納しています。ThisWorkbook.Path
はマクロが保存されているExcelファイルと同じフォルダを指すため、実行したExcelファイルと同じ場所にCustomTextOutput.txt
という名前のファイルが作成されます。
② 安全なファイル番号の取得 (FreeFile)
Dim fileNum As Integer
fileNum = FreeFile
VBAでファイルを操作する際には、「ファイル番号」という識別番号を使います。FreeFile
関数は、他のプログラムなどが使用していない、安全に使える番号を自動で取得してくれる便利な機能です。ファイル操作の前にはFreeFile
で番号を取得する癖をつけておくと、意図せぬエラーを防ぐことができます。
③ ファイルを開く (Open…For Output)
Open outputFilePath For Output As #fileNum
Open
ステートメントで、実際にファイルを操作できる状態にします。
outputFilePath
: どのファイルを開くか(ファイルパス)For Output
: 「書き込み専用」で開くというモード指定です。ファイルが存在しない場合は新規作成され、既に存在する場合は中身が上書きされます。As #fileNum
: どのファイル番号でこのファイルを管理するかを指定します。
④ テキストを書き込む (Print #)
Print #fileNum, "--- 処理レポート ---"
Print #fileNum, "レコードID: ";
Print #fileNum, recordId
Print #
が、ファイルにテキストを書き込むための命令です。 Print #ファイル番号, 書き込みたい内容
のように記述します。
書き込みたい内容の末尾にセミコロン(;
)を付けると、改行されずに次のPrint #
の書き込みが同じ行に続きます。 これを利用することで、複数の変数や文字列を一行にまとめて出力することが可能です。セミコロンを付けなければ、書き込み後に自動で改行されます。
⑤ ファイルを閉じる (Close #)
Close #fileNum
ファイルの操作がすべて完了したら、必ずClose
ステートメントでファイルを閉じる必要があります。これを忘れると、書き込んだ内容がファイルに正しく保存されなかったり、ファイルがロックされて他のプログラムからアクセスできなくなったりする原因になります。
注意点:全角文字によるエラー
ご提示いただいた元のコードには、Print
や#
のように、文字が全角で入力されている箇所がありました。
VBAのコードは、すべて半角の英数字・記号で記述する必要があります。
Webページなどからコードをコピー&ペーストした際に、意図せず全角文字が混じってしまうことがありますが、全角文字が含まれているとマクロはエラーで停止します。もしコードがうまく動かない場合は、全角文字が混ざっていないかを確認してみてください。
まとめ
Open
ステートメントとPrint #
ステートメントを組み合わせることで、セル範囲の出力とは異なり、プログラムで組み立てた任意の文字列をテキストファイルとして自由に書き出すことができます。
- 処理のログを残す
- 定型のレポートを自動生成する
- 他のシステムと連携するためのデータファイルを作成する
など、応用範囲は非常に広いです。ぜひこの手法をマスターして、VBAでの自動化の幅を広げてみてください。