EXCEL VBAでは、通常のコンピュータ言語と同様にファイルの読み込み、書き込みが使えます。
本記事では、EXCEL VBAについてのファイル入出力の基本操作を記載します。
ファイルの入出力を行う際には、最初にファイルのオープンを行い、読み込み/書き込み、最後にファイルのクローズを行う必要があります。
ファイルは、ファイルの内容であるデータと、ファイルの終端を示すEOF(End of File)で構成されています。
あとは自由な形式になっています。
通常のテキストファイルであれば、データが改行コードで区切られており、最後にEOFが来ます。
バイナリファイルであれば、改行コードがなく、延々とデータが続き、最後にEOFが来ます。
ファイルをオープンする際に、いくつかの方法が準備されています。
実際の構文は以下です。
↓正確な構文
Open pathname For mode [ Access access ] [ lock ] As [ # ] filenumber [ Len = reclength ]
↓よく使う構文
Open ファイル名(フルパス) For モード As ファイル番号
モードは、以下の表の通りですが、普通に使用する分にはInput/Outputで十分です。
モード | I/O区分 | 用途 |
Input | 読み込み | 入力用 |
Output | 書き込み | 出力用 |
Append | 書き込み | 追記書き込み用 |
Binary | 読み込み/書き込み | バイナリファイル用 |
Random | 読み込み/書き込み | ランダムアクセス用 |
ファイル名で指定したファイルが存在しない場合に、Append、Binary、Output、または Random モードでファイルを開くと、そのファイルが作成されます。
ファイル番号は、プログラム中で開いたファイルを識別する番号です。
複数ファイルを開く場合は、別々の番号を付与しましょう。
ファイルの読み込みには、いくつかの種類があります。
通常のテキストファイルの入力であれば、「Line Input #」を使用します。
構文は以下です。
Line Input #ファイル番号, 変数名
ファイル番号にInputで開いた番号を指定し、変数名には1行文のデータを格納するString型を指定します。
他の読み込みモードは特殊なファイルを読み込むときに使用し、主に自分で決めたファイルフォーマットに対応する読み込み命令になります。
読み込み命令 | ファイルモード | 説明 |
Get | Binary、Random | 指定数バイト読み込み用 |
Input | Input、Binary | 指定数文字列読み込み用 |
Input # | Input、Binary | 決まったデータ列のデータ読み込み用 |
Line Input # | Input | ファイルの1行読み込み用 |
ほかの読み込み命令については、初心者向けではないので割愛します。
ファイルの書き込みにもいくつか種類があります。
ファイルの読み込みとファイル書き込みが対応した形で存在します。
通常のテキストファイルの書き込みの場合は、「Print #」を使用すると良いでしょう。
構文は以下です。
Print #ファイル番号, [ outputlist ] outputlist 引数の設定は次のとおりです。 [{ Spc(n) | Tab [ (n) ]}] [ expression ] [ charpos ]
ファイル番号にOutputモードで開いたファイル番号を指定し、outputlistに書き込む文字列を指定します。細かく設定は可能ですが、通常はString型の変数名を指定します。
変数でなくてもただの文字列を指定できます。
書き込み命令 | ファイルモード | 対応読み込み命令 | 説明 |
Put | Binary、Random | Get | Binaryデータ書き込み用 |
Write # | Output、Binary | Input # | 規定フォーマット書き込み用 |
Print # | Output | Line Input # | 1行書き込み用 |
ほかの書き込み命令については、初心者向けではないので割愛します。
Open命令で開いたファイルをクローズします。
命令自体はシンプルにCloseと開いたファイル番号の指定のみです。
ファイル番号は複数指定可能です。指定はカンマ区切りで指定します。
Close [ ファイル番号リスト]
ファイルクローズを忘れてしまうと、次にファイルオープンしようとしても「すでにファイルがオープンされています」というエラーが発生してファイルのオープンがエラーになるので、プログラムの最後には必ず指定しましょう。
実際にテキストファイルの入出力のサンプルを記載します。
ファイルの入力して、メッセージボックスに1行ごとに出力するコード
テキストファイルの中身は以下です。
テスト用 初心者向け EXCEL VBA講座
Public Sub main() Dim InFile As String Dim wkStm As String ' ファイルパス設定 InFile = "D:\EXCEL VBA\test.txt" ' ファイルオープン(入力モード) Open InFile For Input As #1 ' ファイルの終端までループ Do While (EOF(1) = False)' 1行読み込み
Line Input #1, wkStm
MsgBox (wkStm)
Loop 'ファイルクローズ Close #1 End Sub
ちなみにテキストファイルをメモ帳で作ったら文字コードがUTF-8になっていた為、文字化けが発生していました。
EXCEL VBAでUTF-8の文字コードを使用する場合、ちょっと特殊なやり方が必要です。
次に書き込みのプログラム
先ほど使用した入力ファイルを読み込んで、読み込んだ内容に”_書き込み”を付けて出力。
Public Sub main2() Dim InFile As String Dim OtFile As String Dim wkStm As String ' ファイルパス設定(入力用) InFile = "D:\EXCEL VBA\test.txt" ' ファイルパス設定(出力用) OtFile = "D:\EXCEL VBA\test_out.txt" ' ファイルオープン(入力モード) Open InFile For Input As #1 ' ファイルオープン(入力モード) Open OtFile For Output As #2 ' ファイルの終端までループ Do While (EOF(1) = False)' 1行読み込み
Line Input #1, wkStm
wkStm = wkStm & "_書き込み"
Print #2, wkStm
Loop 'ファイルクローズ Close #1, #2 End Sub
↓出力結果
テスト用_書き込み 初心者向け_書き込み EXCEL VBA講座_書き込み