VBAマクロで処理した結果を、Excel形式ではなく、他のシステムと連携しやすいシンプルなテキストファイル(.txt
)として出力したい、という場面は頻繁にあります。
FileSystemObject (FSO)
を使えば、テキストファイルの新規作成から、内容の書き込みまでを、オブジェクト指向で分かりやすく行うことができます。
この記事では、FSOの**CreateTextFile
メソッドと、書き込みを行うTextStream
オブジェクト**の基本的な使い方を解説します。
【準備】参照設定
FSOを快適に利用するため、VBAエディタでツール
> 参照設定
を開き、**「Microsoft Scripting Runtime」**にチェックを入れておくことを推奨します。
完成したVBAコード
以下は、マクロブックと同じフォルダに「Log.txt」という名前のテキストファイルを新規作成し、2行の文字列を書き込むVBAコードです。
'参照設定: Microsoft Scripting Runtime
Sub CreateAndWriteTextFile()
' 変数を宣言します
Dim fso As New FileSystemObject
Dim textStreamObj As TextStream
Dim filePath As String
'--- 設定 ---
' 作成するテキストファイルのパス
filePath = ThisWorkbook.Path & "\Log.txt"
'--- 設定ここまで ---
'--- 1. テキストファイルを新規作成し、TextStreamオブジェクトを取得 ---
' 第2引数(Overwrite)をTrueにすると、同名ファイルが存在する場合に上書きします
Set textStreamObj = fso.CreateTextFile(Filename:=filePath, Overwrite:=True)
'--- 2. TextStreamオブジェクトを使い、ファイルに書き込む ---
With textStreamObj
' .WriteLine は、文字列を書き込んだ後に改行を入れます
.WriteLine "--- 処理ログ ---"
.WriteLine "レポート作成日時: " & Now()
' .Write は、改行を入れずに書き込みます
.Write "処理ステータス: "
.Write "正常終了"
' .Close を実行した時点で、ファイルへの書き込みが確定します
.Close
End With
' オブジェクトを解放
Set textStreamObj = Nothing
Set fso = Nothing
MsgBox "テキストファイルの作成と書き込みが完了しました。"
End Sub
コードのポイント解説
① テキストファイルの作成: .CreateTextFile
Set myStream = fso.CreateTextFile(Filename:="ファイルパス", Overwrite:=True)
fso
オブジェクトのCreateTextFile
メソッドは、指定したパスに新しいテキストファイルを作成し、そのファイルを操作するための**TextStream
オブジェクト**を返します。
Filename
: 作成するファイルのフルパスを指定します。Overwrite
(任意):True
を指定すると、もし同名のファイルが既に存在していた場合に、ファイルを上書きします。False
(既定値)の場合はエラーになります。
② ファイルへの書き込み: TextStream
オブジェクト
取得したTextStream
オブジェクトには、ファイルにテキストを書き込むためのメソッドが用意されています。
.WriteLine "文字列"
: 指定した文字列をファイルに書き込み、最後に改行コードを自動で追加します。一行ずつ書き込んでいく場合に非常に便利です。.Write "文字列"
: 指定した文字列を書き込みますが、改行はしません。 複数の要素を連結して一行の文字列を作りたい場合に使います。.Close
: これが最も重要なメソッドです。Write
やWriteLine
で書き込んだ内容は、メモリ上に一時的に保持されているだけです。.Close
を実行することで、初めてすべての内容がファイルに書き込まれ、ファイルが閉じられます。これを忘れると、中身が空のファイルができてしまうので注意してください。
【応用】セル範囲の値をテキストファイルに出力する
このテクニックを応用すれば、Excelシート上のデータをテキストファイルに書き出すことも簡単です。
Sub ExportRangeToTextFile()
Dim fso As New FileSystemObject
Dim ts As TextStream
Dim dataRange As Range
Dim cell As Range
Set dataRange = Range("A1:C10")
Set ts = fso.CreateTextFile(ThisWorkbook.Path & "\ExportData.txt", True)
' 範囲内の各セルをループ
For Each cell In dataRange
' セルの値を書き込み(改行なし)
ts.Write cell.Value & vbTab ' タブ区切りで書き出し
' 各行の最後のセルなら改行
If cell.Column = dataRange.Columns.Count Then
ts.WriteLine "" 'WriteLineに空文字を渡して改行だけ行う
End If
Next cell
ts.Close
MsgBox "データのエクスポートが完了しました。"
End Sub
まとめ
FSOを使ってテキストファイルを新規作成・書き込みする手順は以下の通りです。
- **
fso.CreateTextFile("パス")
**でファイルを作成し、TextStream
オブジェクトを取得する。 TextStream
オブジェクトの**.WriteLine
(改行あり)や.Write
**(改行なし)で内容を書き込む。- 最後に、必ず**
.Close
**メソッドでファイルを閉じて、書き込みを確定させる。
この方法は、VBAの処理結果のログを出力したり、他のプログラムに渡すためのデータファイルを作成したりと、幅広い用途に使える強力なテクニックです。