更新日:、 作成日:
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 関数に渡した文字数分の取得を飛ばせます。
スポンサーリンク