更新日:、 作成日:

VBA ファイルの読み込み

はじめに

Excel VBA マクロでファイルの読み込みをする方法を紹介します。

OpenTextFile 関数を使って指定したパスのファイルを開けます。

全てのデータをまとめて、または 1 行ずつや 1 文字ずつ取得できます。

ファイルの書き込みについては「ファイルの書き込み」をご覧ください。

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", Format:=TristateTrue)  ' ファイルを UTF-16 で開く
Set ts = fso.OpenTextFile("D:\Tips.txt", Format:=TristateFalse) ' ファイルを Shift_JIS で開く

' 全てのデータを取得
Dim s As String
s = ts.ReadAll

' 1 行ずつ取得
Do Until ts.AtEndOfStream
    s = ts.ReadLine 
    Debug.Print(s)
Loop

' 1 文字ずつ取得
Do Until ts.AtEndOfStream
    s = ts.Read(1)
    Debug.Print(s)
Loop

ts.Close ' ファイルを閉じる

' 後始末
Set ts = Nothing
Set fso = Nothing

Debug.Print(s)

fso.OpenTextFile 関数で指定したパスのファイルを開きます。戻り値で TextStream オブジェクトを取得します。ファイルが存在しないとエラーになります。

第 4 (Format) 引数に TristateTrue (-1) を指定すると、UTF-16 でファイルを開きます。TristateFalse (0) または省略すると、Shift_JIS でファイルを開きます。

取得後に ts.Close 関数でファイルを閉じます。これを忘れるとファイルが開いたままになり、削除できなくなる可能性があります。

全体を一括で読み込む

TextStream オブジェクトの ts.ReadAll 関数で、ファイルのデータを一括で取得できます。

s = ts.ReadAll

次のように取得したデータを「Split 関数」を使って改行で区切ると、各行が 1 つの要素の配列になります。

s = ts.ReadAll ' 全てのデータを取得
Dim list() As String
list = Split(s, vbCrLf) ' 1 行ずつの配列に変換

1 行ずつ読み込む

Do Until ts.AtEndOfStream ' 最後の行を取得するまで
    s = ts.ReadLine ' 1 行ずつ取得
Loop

TextStream オブジェクトの ts.ReadLine 関数を呼び出すと 1 回目は 1 行目、2 回目は 2 行目のように、呼び出すたびに次の行を取得できます。

Do Until ts.AtEndOfStream で最後の行を取得するまでループできます。最後まで読み込んでいると ts.AtEndOfStream は True を返します。

次のようにして ReadAll 関数を使わないで全体の文字列を取得できます。

Dim line As String
Do Until ts.AtEndOfStream ' 最後の行を取得するまで
    line = ts.ReadLine ' 1 行ずつ取得
    ' 改行コードをつけて結合する
    If s = "" Then
        s = line
    Else
        s = s & vbCrLf & line
    End If
Loop

ts.SkipLine 関数を使って次の行の取得を飛ばせます。

1 文字ずつ読み込む

Do Until ts.AtEndOfStream ' 最後の文字を取得するまで
    s = ts.Read(1) ' 1 文字ずつ取得
Loop

TextStream オブジェクトの ts.Read 関数の引数に渡した文字数分の文字を取得します。呼び出すたびに続きの文字を取得できます。ファイルの文字数より多い文字数を指定してもエラーにはなりません。自動で最後の文字まで取得します。ただし既に最後まで読み込まれているときはエラーになります。

改行に注意が必要です。改行は vbCr と vbLf という文字でできています。そのためそれぞれの改行文字も取得されます。

Do Until ts.AtEndOfStream で最後の文字を取得するまでループできます。最後まで読み込んでいると ts.AtEndOfStream は True を返します。

次のようにして ReadAll 関数を使わないで全体の文字列を取得できます。

Dim c As String
Do Until ts.AtEndOfStream ' 最後の行を取得するまで
    c = ts.Read(1) ' 1 文字ずつ取得
    s = s & c
Loop

ts.Skip 関数に渡した文字数分の取得を飛ばせます。