更新日:、 作成日:
VBA ファイルの書き込み
はじめに
Excel VBA マクロでファイルの書き込みをする方法を紹介します。
Write 関数を使ってファイルにデータを書き込めます。
新規ファイルへの書き込みや、既存のファイルの先頭や途中や末尾に追記する方法を紹介します。
FileSystemObject について
ここでは VBA の標準の関数より便利な FileSystemObject を使った方法を紹介しています。基本的な使い方については「FileSystemObject ファイル操作の基礎」をご覧ください。
コードを見やすくするため FileSystemObject を参照設定しています。また、エラー処理は行っていません。
FileSystemObject では UTF-16 と Shift_JIS のファイルしか扱えません。UTF-8 のファイルを読み込むと文字化けします。Unicode 文字を入力するには「文字コードを変換や判定する」をご覧ください。
新しいファイルに書き込み
この方法では必ず新規ファイルとして書き込みが行われます。ファイルが既に存在するときは上書きされます。
Dim fso As FileSystemObject
Set fso = New FileSystemObject ' インスタンス化
Dim ts As TextStream
Set ts = fso.OpenTextFile("D:\Tips.txt", ForWriting, True, TristateTrue) ' ファイルを UTF-16 で開く
Set ts = fso.OpenTextFile("D:\Tips.txt", ForWriting, True, TristateFalse) ' ファイルを Shift_JIS で開く
ts.Write ("文字列") ' 文字列の書き込み
ts.WriteLine ("改行付き") ' 最後に改行を付けて書き込み
ts.WriteBlankLines (3) ' 空行を指定の数だけ書き込み
ts.Close ' ファイルを閉じる
' 後始末
Set ts = Nothing
Set fso = Nothing
fso.OpenTextFile 関数で指定したパスのファイルを開きます。戻り値で TextStream オブジェクトを取得します。ファイルが存在しないとエラーになります。
第 2 引数に ForWriting (2) を指定すると、必ず新規ファイルとして書き込みます。
第 3 引数に True を指定するとファイルが存在しないときに自動で作成します。False または何も指定しないときに、そのファイルが存在しないとエラーになります。
第 4 引数に TristateTrue (-1) を指定すると、UTF-16 でファイルを開きます。TristateFalse (0) または省略すると、Shift_JIS でファイルを開きます。
書き込み後に ts.Close 関数でファイルを閉じます。これを忘れるとファイルが開いたままになり、削除できなくなる可能性があります。
文字列の書き込み
TextStream オブジェクトの ts.Write 関数を使用すると、渡した文字列をそのまま書き込みます。
ts.Write ("1")
ts.Write ("2")
ts.Write ("3")
このように書き込むと作成されたファイルは次のようになります。
123
改行付き文字列の書き込み
TextStream オブジェクトの ts.WriteLine 関数を使用すると、渡した文字列の最後に改行を付けて書き込みます。
ts.WriteLine ("1")
ts.WriteLine ("2")
ts.WriteLine ("3")
このように書き込むと作成されたファイルは次のようになります。
1
2
3
空行の書き込み
TextStream オブジェクトの ts.WriteBlankLines 関数を使用すると、渡した数の空行を書き込みます。
ts.Write ("最初")
ts.WriteBlankLines (3)
ts.Write ("最後")
このように書き込むと作成されたファイルは次のようになります。
最初
最後
スポンサーリンク
既存のファイルに書き込み
この方法では必ずファイルの最後の位置に書き込みが行われます。先頭や途中からの書き込みはできません。
Dim fso As FileSystemObject
Set fso = New FileSystemObject
Dim ts As TextStream
Set ts = fso.OpenTextFile("D:\Tips.txt", ForAppending, True, TristateTrue) ' ファイルを UTF-16 で開く
Set ts = fso.OpenTextFile("D:\Tips.txt", ForAppending, True, TristateFalse) ' ファイルを Shift_JIS で開く
ts.WriteLine ("追記") ' 書き込み
ts.Close ' ファイルを閉じる
' 後始末
Set ts = Nothing
Set fso = Nothing
fso.OpenTextFile 関数で指定したパスのファイルを開きます。戻り値で TextStream オブジェクトを取得します。ファイルが存在しないとエラーになります。
第 2 引数に ForAppending (8) を指定すると追記できます。必ずファイルの最後の位置に書き込まれます。
第 3 引数に True を指定するとファイルが存在しないときに自動で作成します。False または何も指定しないときに、そのファイルが存在しないとエラーになります。
第 4 引数に TristateTrue (-1) を指定すると、UTF-16 でファイルを開きます。TristateFalse (0) または省略すると、Shift_JIS でファイルを開きます。
TextStream オブジェクトの ts.Write ts.WriteLine ts.WriteBlankLines 関数で書き込みできます。詳しくは上記の「新しいファイルに書き込み」をご覧ください。
書き込み後に ts.Close 関数でファイルを閉じます。これを忘れるとファイルが開いたままになり、削除できなくなる可能性があります。
書き込みの例
ts.WriteBlankLines (1) ' 空行 1 行を書き込み
ts.Write ("追記") ' 文字列の書き込み
ts.WriteLine ("改行付き") ' 最後に改行を付けて書き込み
このように書き込むと作成されたファイルは次のようになります。
書き込み前:
1
2
3
書き込み後:
1
2
3
追記改行付き
先頭や途中に書き込む
この方法ではファイル好きな位置に書き込みできます。
Dim fso As FileSystemObject
Set fso = New FileSystemObject
' 最初にファイルのデータを取得する
Dim ts As TextStream
Set ts = fso.OpenTextFile("D:\Tips.txt", ForReading, True)
' 取得しながら先頭や途中に書き込んだ文字列を作成する
Dim s As String
s = "先頭に追記"
Dim line As String
Do Until ts.AtEndOfStream ' 最後の行を取得するまで
line = ts.ReadLine ' 1 行ずつ取得
' 途中に追記
If line = "2" Then
s = s & vbCrLf & "2 の前の行に追記"
End If
' 取得した文字列を結合していく
If s = "" Then
s = line
Else
s = s & vbCrLf & line
End If
' 途中に追記
If line = "2" Then
s = s & vbCrLf & "2 の後の行に追記"
End If
Loop
s = s & vbCrLf & "最後の行に追記"
ts.Close ' 一度ファイルを閉じる
' 最後にファイルに書き込む
Set ts = fso.OpenTextFile("D:\Tips.txt", ForWriting, True)
ts.Write (s) ' 書き込み
ts.Close ' ファイルを閉じる
' 後始末
Set ts = Nothing
Set fso = Nothing
FileSystemObject にはファイルの先頭や途中に書き込む機能はありません。そこでまず、既存のファイルの中身を全て取得します。その文字列を VBA の文字列操作で最終的に書き込みたい文字列にします。最後にその文字列をファイルに上書きします。こうすると、好きな位置に書き込みできるようになります。
先頭に追記するには、s = "先頭に追記" のように、データを取得する前に文字列を設定しておくと、それが先頭に追記する文字列になります。
途中に追記するには、ts.ReadLine 関数で 1 行ずつファイルの中身を取得していきます。特定の行の前や後に文字列を追記したいときは If line = "2" Then のように判定して文字列に結合します。
最後に追記するには、s = s & vbCrLf & "最後の行に追記" のように、データを全て取得した後に文字列に追記すると、最後の位置に書き込みできます。
書き込みの例
書き込み前:
1
2
3
書き込み後:
先頭に追記
1
2 の前の行に追記
2
2 の次の行に追記
3
最後の行に追記
スポンサーリンク