説明
機能
Openステートメントで使用するファイル番号の空き番号を整数型 (Integer)で返します。
構文
FreeFile[(rangenumber)]
オプションのrangenumberは通常指定しません。
指定する場合は、0か1が指定出来ます。
0を指定すると、1~255、1を指定すると、256~511の範囲の空いているファイル番号が返ります。
補足
Openステートメントを使ったファイル入出力は、アクセスするファイルにファイル番号を付けて処理を行います。
ファイル番号は、プログラマーが任意の整数(1~511)を採番してもよいですが、FreeFile関数を使用すると、その時点で空いているファイル番号が取得出来るので、ファイル番号の重複による障害の可能性を無くします。
従って、ファイル番号設定時は、必ず使うようにしたいものです。(たとえ取り扱うファイルがひとつでも)
使用例
EX01 空いてるファイル番号を取得する
EX02 空いてるファイル番号を取得する(rangenumberに0を指定)
EX03 空いてるファイル番号を取得する(rangenumberに1を指定)
EX04 FreeFile関数の具体的な使い方(ファイルを入力する)
EX01 空いてるファイル番号を取得する
コード
Dim fileno As Integer fileno = FreeFile Debug.Print fileno
実行結果
1
メモ
他に使用中のファイル番号がない場合は1が返ります。
EX02 空いてるファイル番号を取得する(rangenumberに0を指定)
コード
Dim fileno As Integer fileno = FreeFile(0) Debug.Print fileno
実行結果
1
メモ
EX01と同じ結果になります。
EX03 空いてるファイル番号を取得する(rangenumberに1を指定)
コード
Dim fileno As Integer fileno = FreeFile(1) Debug.Print fileno
実行結果
256
メモ
rangenumberに1を指定した場合で他に使用中のファイル番号がない場合は256が返ります。
EX04 FreeFile関数の具体的な使い方(ファイルを入力する)
コード
Dim fileno As Integer ' ファイル番号 Dim buf As String ' 入力データエリア 'ファイル番号の取得 fileno = FreeFile '入力ファイルの処理 Open "c:\vbatest\test01.txt" For Input As #fileno While Not EOF(fileno) Line Input #fileno, buf Debug.Print buf Wend Close #fileno
解説
5:空いているファイル番号を取得する。
8:取得したファイル番号でファイル「test01.txt」を入力モードでオープンする。
9:ファイル番号のファイルが読める間、10-11の処理を繰り返す。
10:ファイル番号のファイルから1行入力する。
13:ファイル番号のファイルを閉じる。
実行結果
test01.txtの内容
メモ
この例で取り扱いの出来るファイルは、Shift-JIS形式(改行コード:CRLF)のテキストファイルになります。
補足情報
ワンポイントアドバイス
FreeFile関数を使うべき理由
ファイル番号は任意の整数を設定するため、FreeFile関数を使わなくてもプログラミング出来ますが、保守性、拡張性の点から、ファイル番号はわかりやすい名前を付けた変数を定義し、FreeFile関数で設定して使うことをおすすめします。特に業務利用のコードを記述する場合は、必須と考えていいと思います。たとえ取り扱いするファイルがひとつでもです。
FreeFile関数を使わない例(値指定)
Open "c:\vbatest\test01.txt" For Input As #1 While Not EOF(1) Line Input #1, buf Wend Close #1
FreeFile関数を使った例(変数指定)
fileno = FreeFile Open "c:\vbatest\test01.txt" For Input As #fileno While Not EOF(fileno) Line Input #fileno, buf Wend Close #fileno
rangenumber=1を使う状況は?
私は、rangenumberパラメータを指定したプログラミングをしたことがありません。何に使うのだろう?と思っていたのですが、FreeFile関数を使わずにファイル番号を直接値指定したプログラムに、新たなファイル入出力のコードを追加する際に使えるかもしれないなあ、と思いました。
(大抵の場合、既存のプログラムは、ファイル番号の値を1から採番しており、rangenumber=1指定時のFreeFile関数の戻り値256~と衝突を防げるので)
類似機能
ADODB.Streamオブジェクトによるファイル入出力
FileSystemObjectオブジェクトによるファイル入出力