■ VBAステートメントによるファイル操作1
以前、FileSysytemObject(FSO)を使用したファイル操作方法について解説しました。
※ エクセルからファイルを操作してみよう!1,2,3
FileSysytemObjectは、非常に強力なファイル操作のメソッド・プロパティを提供するオブジェクトですが、VBAの中にも、ファイル操作を行うためのステートメントが用意されています。
今回は、より手軽にファイル操作を行うためのVBAステートメントについて解説してみたいと思います。
■ファイル関連の操作
Openステートメント
Open pathname For mode [Access access] [lock] As [#]
filenumber [Len=reclength]
ファイルを開きます。ファイルに入出力するためのバッファを割り当て、アクセスモードを決定します。
・引数pathnameには、ファイル名を指定します。フォルダ名、ドライブ名を含めて指定ができます。
・引数modeには、ファイルモードを指定します。ファイルモードは次のいずれかです。
Append |
追加モードで開きます |
Binary |
バイナリモードで開きます |
Input |
入力モードで開きます |
Output |
出力モードで開きます |
Random |
ランダムアクセスモードで開きます |
・引数Accessには、開くファイルに対する処理を指定します。Read、Write、Read Writeのいずれかのキーワードを指定します。
・引数lockには、他のプロセスからの制御を表す、Shared、Lock Read、Lock Write、Lock Read Writeのいずれかのキーワードを指定します。省略可能です。
・引数filenameには、1〜511の範囲で任意のファイル番号を指定します。1〜255のファイル番号を割り当てると、そのファイルは他のアプリケーションからアクセスできません。256〜511のファイル番号を割り当てた場合、他のアプリケーションからもアクセスできます。
・引数reclengthには、32,767バイト以下の数値を指定します。ランダムアクセスファイルではレコード長を表し、シーケンシャルファイルではバッファ容量を表します。省略可能です。
※引数pathnameに指定したファイルが存在しないとき、引数modeにAppend、Binary、Output、Randomを指定した場合は、新しいファイルが作成されます。
※引数modeにBinary、Input、Randomを指定した場合、ファイルを開いたまま、別のファイル番号で同時に開くことができます。Append、Outputを指定した場合は、いったんファイルを閉じないと別のファイル番号で開くことはできません。
(例)
Sub test()
Open "C:\Users\test.txt" For Output As #1
Write #1, Range("A1")
Close #1
End Sub
上の例では、C:\Usersフォルダにあるtest.txtをOutputモードで開き、A1セルの内容を出力し閉じています。 |
Closeステートメント
Close [filenumberlist]
ファイルを閉じます。引数filenumberlistには、閉じるファイル番号を指定します。カンマで区切ることで、複数のファイル番号を同時に指定できます。省略すると現在開いているすべてのファイルを閉じます。
Lock、UnLockステートメント
Lock [#]filenumber[,recordrange]
UnLock [#]filenumber[,recordrange]
Lockステートメントは他プロセスからのアクセスをロックします、UnLockステートメントでロックを解除します。
引数filenumberには、ロックまたはロックを解除するファイル番号を指定します。
引数recordrangeには、ロックまたはロックを解除するレコード番号を指定します。省略可能です。
Input #ステートメント
Input #filenumber,varlist
Inputモードで開いたファイルからデータを読み込んで変数に格納します。引数filenumberには、任意のファイル番号を指定します。引数varlistには、データを読み込む変数を指定します。カンマで区切ることで、複数の変数を指定できます。
Write #ステートメント
Write #filenumber,[outputlist]
Output、Appendモードで開いたファイルにデータを書き込みます。出力したデータはカンマで区切られ、文字列は""で囲まれます。引数filenumberには、任意のファイル番号を指定します。引数outputlistには、出力するデータをカンマで区切って指定します。省略可能です。
(例)
Sub test()
Dim tmp1 As String
Dim tmp2 As String
Open "C:\Users\test.txt" For Input As #1
Open "C:\Users\test2.txt" For Output As #2
Input #1, tmp1, tmp2
Write #2, tmp1 & tmp2
Close #2
Close #1
End Sub
上の例では、C:\Usersフォルダにあるtest.txtの内容を同じフォルダのtest2.txtに出力しています。test.txtの内容が、"Microsoft","Excel"だった場合、test2.txtには、"MicrosoftExcel"が出力されます。 |
Line Input #ステートメント
Line Input #filenumber,varname
Inputモードで開いたファイルから行単位で読み込み、変数に代入します。引数filenumberには、任意のファイル番号を、引数varnameには、データを読み込む変数を指定します。
(例)
Sub test()
Dim MyStr As String
Open "C:\Users\test.txt" For Input As #1
Do Until EOF(1)
Line Input #1, MyStr
Debug.Print MyStr
Loop
Close #1
End Sub
上の例では、C:\Usersフォルダにあるtest.txtの内容を1行ずつ読み込み、イミディエイトウィンドウに出力します。 |
Print #ステートメント
Print #filenumber,[outputlist]
Outputモードで開いたファイルに、データを書き込みます。引数filenumberには、任意のファイル番号を指定します。引数outputlistには、次の形式で出力するデータを指定します。省略可能です。
形式 |
[{Spc(n) | Tab[(n)]}] [expression] [charpos] |
Spc(n) |
n個のスペースを挿入します。省略可能です |
Tab(n) |
n番目の桁位置に出力します。nを省略すると次の印字領域の先頭に出力します。省略可能です |
expression |
出力するデータを指定します。省略可能です |
charpos |
次の文字を出力する桁位置を指定します。";"を指定すると最後に出力された文字の直後に出力されます。省略すると次の行の先頭に出力されます |
(例)
Sub test()
Dim i As Long
Open "C:\Users\test.txt" For Output As #1
For i = 1 To 2
Print #1, "TestData" & i
Next i
For i = 3 To 4
Print #1, "TestData" & i;
Next i
Close #1
End Sub
上の例では、C:\Usersフォルダにあるtest.txtに、1行目はTestData1、2行目はTestData2、3行目はTestData3TestData4と出力されます。 |
Width #ステートメント
Width #filenumber,width
ファイルに出力する行の幅を設定します。引数filenumberには、任意のファイル番号を指定します。引数widthには、1行に表示される文字数を指定します。
(例)
Sub test()
Dim i As Long
Open "C:\Users\test.txt" For Output As #1
Width #1, 5
For i = 1 To 10
Print #1, "A";
Next i
Close #1
End Sub
上の例では、C:\Usersフォルダにあるtest.txtの、1行目と2行目にAAAAAを出力します。 |
Getステートメント
Get [#]filenumber,[recnumber],varname
ファイルからデータを読み込み変数に格納します。引数filenumberには、任意のファイル番号を指定します。引数recnumberには読込を始めるレコード番号やバイト位置を指定します。省略可能です。引数varnameには、データを読み込む変数を指定します。
Putステートメント
Put [#]filenumber,[recnumber],varname
ファイルに変数の内容を書き込みます。引数filenmberには、任意のファイル番号を指定します。引数recnumberは書き込みを始めるレコード番号やバイト位置を指定します。省略可能です。引数varnameには、書き込むデータの変数を指定します。
(例)
Sub test()
Dim MyStr As String * 4
Open "C:\Users\test.txt" For Binary As #1
Open "C:\Users\test2.txt" For Binary As #2
Get #1, , MyStr
Put #2, , MyStr
Close #2
Close #1
End Sub
上の例では、C:\Usersフォルダにあるtest.txtのデータをバイナリモードで読み込み、同じフォルダのtest2.txtに出力しています。test.txtの内容が、ABCDEFGだった場合、test2.txtには、ABCDが出力されます。 |
Seekステートメント
Seek [#]filenumber,position
書き込みまたは読み込み位置を設定します。引数filenumberには、任意のファイル番号を指定します。引数positionには、書き込みまたは読み込む位置を指定します。
※ファイルの末尾より後ろの位置を指定して書き込みを行うと、ファイルの末尾に追加されます。
※GetおよびPutステートメントで指定したレコードは、Seekステートメントよりも優先されます。
次回も引き続き、ファイル操作、ディレクトリ・ドライブ操作のステートメントについて解説していきたいと思います。
|