更新日:、 作成日:

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
最後の行に追記