Categories: プログラミング

【初心者必見!】VBAプログラミング講座 ファイル入出力(I/O)編

ファイル入出力について

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読み込み/書き込みランダムアクセス用

ファイル名で指定したファイルが存在しない場合に、AppendBinaryOutput、または Random モードでファイルを開くと、そのファイルが作成されます。

ファイル番号は、プログラム中で開いたファイルを識別する番号です。
複数ファイルを開く場合は、別々の番号を付与しましょう。

ファイルの読み込み

ファイルの読み込みには、いくつかの種類があります。

通常のテキストファイルの入力であれば、「Line Input #」を使用します。

構文は以下です。

Line Input #ファイル番号, 変数名

ファイル番号にInputで開いた番号を指定し、変数名には1行文のデータを格納するString型を指定します。

他の読み込みモードは特殊なファイルを読み込むときに使用し、主に自分で決めたファイルフォーマットに対応する読み込み命令になります。

読み込み命令ファイルモード説明
GetBinary、Random指定数バイト読み込み用
InputInput、Binary指定数文字列読み込み用
Input #Input、Binary決まったデータ列のデータ読み込み用
Line Input #Inputファイルの1行読み込み用

ほかの読み込み命令については、初心者向けではないので割愛します。

ファイルの書き込み

ファイルの書き込みにもいくつか種類があります。
ファイルの読み込みとファイル書き込みが対応した形で存在します。

通常のテキストファイルの書き込みの場合は、「Print #」を使用すると良いでしょう。

構文は以下です。

Print #ファイル番号, [ outputlist ]

outputlist 引数の設定は次のとおりです。
[{ Spc(n) | Tab [ (n) ]}] [ expression ] [ charpos ]

ファイル番号にOutputモードで開いたファイル番号を指定し、outputlistに書き込む文字列を指定します。細かく設定は可能ですが、通常はString型の変数名を指定します。
変数でなくてもただの文字列を指定できます。

書き込み命令ファイルモード対応読み込み命令説明
PutBinary、RandomGetBinaryデータ書き込み用
Write #Output、BinaryInput #規定フォーマット書き込み用
Print #OutputLine 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講座_書き込み

bassmania

メンサ会員 IT系企業に20年以上従事。 プログラミング・インフラ系エンジニア