指定のファイルを開いて、ファイルへの入出力ができるようにするステートメントです。
ステートメント仕様
構文 |
Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength] |
引数 |
引数 |
省略 |
説明 |
pathname
|
不可 |
オープンするファイル名を指定します。
ドライブ名、フォルダ名を含んだフルパスでの指定が可能です。
|
mode
|
不可 |
ファイルをオープンする際のモードを指定します。
省略した場合、自動で Random が設定されます。
キーワード |
説明 |
Append
|
書き込み(追記)モード
|
Binary
|
バイナリモード
|
Input
|
読み込みモード
|
Output
|
書き込み(上書き)モード
|
Random
|
ランダムアクセスモード(既定値)
|
|
Access
|
可 |
開くファイルに対する処理を指定します。
省略した場合、モードやファイルの状態により、システムが自動で可能なアクセス方法を設定します。
キーワード |
説明 |
Read
|
読み込みのみ行う
|
Write
|
書き込みのみ行う
|
Read Write
|
読み書き両方行う
|
|
lock
|
可 |
開くファイルに対する他のプロセスからのアクセス制限を指定します。
省略した場合、Shared が既定値となります。
キーワード |
説明 |
Shared
|
他プロセスからの読み書きを可とする(既定値)
|
Lock Read
|
他プロセスからの読み込みを不可とする
|
Lock Write
|
他プロセスからの書き込みを不可とする
|
Lock Read Write
|
他プロセスからの読み書きを不可とする
|
|
filenumber
|
不可 |
1 ~ 511 の範囲で任意のファイル番号を指定します。
|
reclength
|
可 |
ランダム アクセス ファイルの場合はレコード長を、シーケンシャル ファイルの場合はバッファの容量を、32,767 バイト以下の数値で指定します。
|
|
このステートメントは引数で指定したファイルを開き、ファイルへの入出力ができるようにするステートメントです。 引数には開くファイル名とファイルを開く際のアクセス モード、ファイル No などを指定します。
Open "Sample.txt" For Input As #1
As # 節で指定するファイル No は 1 ~ 511 の範囲で任意の番号を指定します。 数字をそのまま指定することもできますが、通常は FreeFile 関数を使用して、使用可能なファイル番号を取得し、その番号を使用します。
Dim n As Integer
n = FreeFile
Open "Sample.txt" For Input As #n
上記例はシーケンシャル入力モード(読み込みモード)で「Sample.txt」ファイルをオープンしています。
モードには Input, Output, Append, Binary, Random のいずれかのキーワードを指定し、指定されたキーワードによってファイルへのアクセス方法が決定します。 モードは必須項目ですが省略した場合は、ランダム アクセス モード (Random) が自動で設定されます。 なお、ファイルを開く際に指定のファイルが存在しない場合は、モードが Output, Append, Binary, Random の場合は新規にファイルが作成され、モードが Input の場合は、エラーが発生します。
【指定のファイルが存在しない場合のモードごとの動作】
モード |
ファイルが存在しない
場合の動作
|
Output
|
指定ファイル名で
新規にファイルを作成
|
Append
|
Binary
|
Random
|
Input
|
エラー
|
また、シーケンシャル入力モード(読み込みモード)およびバイナリ モード、ランダム アクセス モードのいずれかでファイルを開いた場合、ファイルを開いたまま、別のファイル No で同時に同じファイルを開くことができますが、シーケンシャル出力モード(上書きまたは追加書き込みモード)でファイルを開いた場合は、同時に同じファイルを開くことはできません。 一度ファイルを閉じる必要があります。
【モード別 同時アクセスの可否】
モード |
同時アクセス
|
Input
|
可
|
Binary
|
Random
|
Output
|
不可
|
Append
|
※シーケンシャル出力モード(Output, Append)でファイルを開いた場合は一度ファイルを閉じる必要があります。
引数 access は開くファイルに対して行う処理を指定します。 通常、シーケンシャル入出力モードではモード指定で動作が決定する為、この引数は省略しますが、バイナリ モードやランダム アクセス モードで明示的にアクセス方法を示す場合に指定します。 バイナリ モードやランダム アクセス モードでこの引数を省略した場合は、システムが自動で可能なアクセス方法を決定しますが、予期しない動作を防ぐ為にも、これらのモードではアクセス方法を指定しておくことが推奨されます。
Open "Sample.txt" For Binary Access Write As #1
※上記例はアクセス方法を「書き込み限定(Write)」のバイナリ モードでファイルを開いています。
引数 access に指定できるキーワードは上記【ステートメント仕様】を参照下さい。
引数 lock は開くファイルに対する、他のプロセスからのアクセスを制御する場合に指定します。 キーワードにより、他のプロセスからの読み込み禁止、書き込み禁止、読み書き禁止などを指定することができます。 省略した場合は Shared が既定値となり、他のプロセスからのアクセスが可能となります。
Open "Sample.txt" For Output Lock Write As #1
※上記例は「他のプロセスからの書き込みを不可(Lock Write)」を指定して上書きモードでファイルを開いています。
引数 lock に指定できるキーワードは上記【ステートメント仕様】を参照下さい。
引数 Len 節はランダム アクセス モードではレコード長を指定し、シーケンシャル入出力モードではバッファの容量を指定します。 バイナリ モードではこの値は無視されます。 通常、この引数はランダム アクセス モードでファイルを開く際に使用し、それ以外のモードでは省略します。
Open "Sample.txt" For Random As #1 Len = Len(MyRecord)
※上記例はレコード長に MyRecord 変数の長さを設定しています。
動作検証
条件 |
例 |
動作結果 |
読み込みモード(Input)でファイルを開き
ファイルを読み込む場合
※ファイル内容は以下とする
text1 text2 text3
|
Dim strText As String
Open "Sample.txt" For Input As #1
Do Until EOF(1) Input #1, strText Debug.Print strText Loop
Close #1
|
text1 text2 text3
※ファイルの中身が表示される
(ファイルが存在しない場合は
エラー)
|
書き込みモード(Output)でファイルを開き
ファイルを書き込む場合
※ファイルは存在しないとする
|
Open "Sample.txt" For Output As #1
Write #1, "ABCDE" Write #1, "あいうえお"
Close #1
|
※新規にファイルが作成され、
以下内容が出力される
(ファイルが存在する場合は
上書きされる)
ABCDE
あいうえお
|
書き込みモード(Append)でファイルを開き
ファイルを書き込む場合
※元のファイル内容は以下とする
ABCDE
あいうえお
|
Open "Sample.txt" For Append As #1
Write #1, "CDEFG" Write #1, "かきくけこ"
Close #1
|
※ファイル内容は以下になる
(ファイルが存在しない場合は
新規に作成される)
ABCDE
あいうえお
CDEFG
かきくけこ
|
バイナリ モード(Binary)でファイルを開き
ファイルを書き込む場合
※ファイルの中身は以下とする
12345
|
Open "Sample.txt" For Binary Access Write As #1
Put #1, , "67890"
Close #1
|
※ファイル内容が上書きされる
(ファイルが存在しない場合は
新規に作成される)
67890
|
ランダム アクセス モード(Random)で
ファイルを開き、書き込みをする場合
※ファイルは存在しないとする
|
Private Type MyType No As Integer Date As Date Text As String * 20 End Type
Dim i As Integer
Dim MyRecode As MyType Open "Sumple.txt" For Random As #1 Len = Len(MyRecode) For i = 1 To 3 MyRecode.No = i MyRecode.Date = DateAdd("d", i, Date) MyRecode.Text = "メッセージ" & i Put #1, i, MyRecode Next i
Close #1
|
※新規にファイルが作成され
レコードが3つ記録される
(ファイルが存在する場合は
指定のレコードに上書きする)
1,日時,メッセージ1
2,日時,メッセージ2
3,日時,メッセージ3
(上記は書き込みイメージ)
|
ランダム アクセス モード(Random)で
ファイルを開き、読み込みをする場合
※上記ファイルの2レコード目を読み込むとする
|
Private Type MyType No As Integer Date As Date Text As String * 20 End Type
Dim strData As String
Dim MyRecode As MyType
Open "Sample.txt" For Random As #1 Len = Len(MyRecode) Get #1, 2, MyRecode strData = MyRecode.No & ":" & _ Format(MyRecode.Date, "MM/DD") & ":" & _ MyRecode.Text Debug.Print strData
Close #1
|
2:11/12:メッセージ2
|