VBAマクロでファイルを読み込む

VBAでは、指定の位置にあるファイルを読み書きすることができます。ファイル形式に特に制限はなく、CSV、テキスト、バイナリと自由にその内容を読み込んだり、VBAで作成したデータを書き込むことが可能です。

VBAでファイルからデータを読み込み、エクセルのセルに入れて集計やグラフ表示を行う……「外部のデータ」を利用できるようになれば、「エクセルで出来ること」が一気に広がりそうですね。今回は、とりあえず適当なテキストファイルをVBAのコードで開いて読み込み、先頭一行の内容を表示してみましょう。

ファイルを開くには、ファイルのパスを指定してOpen関数を呼び出します。Openでは、開くファイルに「番号」を付けますが、その番号はFreeFile関数を呼び出すことで「空いている番号」が返されるので、それをそのまま使いましょう。
たとえば、d:\test.txtというファイルを開くには

fn = FreeFile

Open "d:\test.csv" For Input As #fn

とするわけです。For Inputというのは、アクセスモードの指定でこの場合は「読み込み専用」にファイルを開く意味になります。

ファイルをOpenしたら、続いて内容を読み込んでみましょう。

今回は、テキストファイルなので「一行読み込む」Line Inputを使ってみることにします。Line InputにOpen時に指定した番号と読み込んだ内容を格納する変数を指定すると、ファイルから一行読み込まれ、その内容が指定の変数に格納されます。

たとえば、文字列変数strLineに一行読み込むなら

Line Input #fn, strLine

とするわけです。一度Line Inputで読み込んだ後、続いてLine Inputを呼び出すと、「次の行」の内容を読み出すことになります。

ファイルを使い終わったら、ファイル番号を指定してCloseで閉じます。VBAに限らずプログラムで開いたファイルをCloseし忘れると、思わぬ不具合につながることもあるので、「開いたファイルは必ず閉じる」コーディング習慣を身に付けておきましょう。

というわけで、以上をまとめると、「テキストファイルd:\test.txtを読み込んで、先頭の一行をダイアログ表示する」VBAマクロは、以下のように書けます。

Sub test()

    Dim strLine As String
    
    fn = FreeFile

    Open "d:\test.csv" For Input As #fn

    Line Input #fn, strLine

    Close #fn

    MsgBox strLine

End Sub

エクセル上でVBAマクロを登録し実行してみると、テキストファイルが読み込まれダイアログが表示されたと思います。

ファイル読み込み処理を行う場合は、「ファイルがなかった」「ファイルの読み込みに失敗した」「ファイルの内容が想定していたものと違っていた」など、様々なエラーが起こる可能性があります。ファイル操作などの入出力は「必ず成功する」という前提でプログラムを組むと、VBAマクロの処理中断やエクセルのセルに出力するデータが壊れるなど「おかしな動作」を引き起こす場合があるので注意してください。
読み込みが成功したか、データに異常がないか確認し必要なエラー処理を組み込むようにしましょう。


エクセルVBA練習帳