更新日:、 作成日:
VBA FileSystemObject ファイル操作の基礎
はじめに
Excel VBA マクロの FileSystemObject を使ったファイル操作の基礎を紹介します。
ファイルの読み書きからフォルダの操作まで、ファイルに関する全ての操作ができます。
VBA にあるファイル関連の関数より使いやすく、機能も豊富です。
FileSystemObject とは
ファイルやフォルダを操作する専用のオブジェクトです。
これを使う一番のメリットは、コードがわかりやすくなることです。VBA の標準の関数を使うと、ファイルを読み込むコードは次のようになります。ファイル番号の管理が大変なのと 1 行ずつしか読み込めません。
Dim fn As Integer
fn = FreeFile ' ファイル番号の取得
Dim s As String
Dim temp As String
Open "D:\Tips.txt" For Input As #fn ' ファイルを開く
' 1 行ずつデータを取得
Do While Not EOF(fn)
Line Input #fn, temp
If s = "" Then
s = s & temp
Else
s = s & vbCrLf & temp
End If
Loop
Close #fn ' ファイルを閉じる
Debug.Print(s)
FileSystemObject を使うと次のようになります。
Const ForReading = 1
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject") ' インスタンス化
Dim ts As Object
Set ts = fso.OpenTextFile("D:\Tips.txt", ForReading) ' ファイルを開く
Dim s As String
s = ts.ReadAll ' 全てのデータを取得
ts.Close ' ファイルを閉じる
' 後始末
Set ts = Nothing
Set fso = Nothing
Debug.Print(s)
オブジェクト名.関数名 の形式で操作できるため、どのような操作をするのか直観的にわかります。また ReadAll というファイルを一括で読み込む関数があります。
FileSystemObject を使用する
FileSystemObject は VBA の標準機能ではありません。そのため、使用するには参照設定するか「CreateObject 関数」を使います。
参照設定する
[ツール] から [参照設定] をクリックします。
[Microsoft Scripting Runtime] をチェックして [OK] をクリックします。
これで参照設定できました。型として FileSystemObject を宣言できます。またインテリセンスが表示されるので、入力間違いがなくなります。
参照設定の問題点は、この VBA を実行する Excel のファイルを他のパソコンに配布したときに、その環境に参照した DLL が存在しない、または参照したバージョンが違うなどの理由により強制的にエラーになることがあります。
Excel をインストールすると Microsoft Scripting Runtime もインストールされるため、通常は問題ありません。環境によってはエラーが発生することに注意が必要です。
CreateObject する
次のように「CreateObject 関数」を使用すると、参照設定することなく FileSystemObject を使用できます。
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
ただしインテリセンスが表示されないので、関数やプロパティの入力間違いに注意が必要です。
「CreateObject 関数」を使うメリットは、Microsoft Scripting Runtime の DLL が存在しないときにエラーチェックができるところです。
もし DLL が存在しないと「CreateObject 関数」でエラーが発生します。それを無視して IF 文でチェックしています。
On Error Resume Next ' エラーを無視する
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject") ' 存在しないとエラー発生
If fso Is Nothing Then
Debug.Print("DLL が存在しません")
Exit Sub
End If
どちらの方法で使用するかは、実行する環境やエラーに対処する必要があるかなどで変わりますが、参照設定した方が開発しやすいのは間違いありません。
スポンサーリンク
後始末の必要性
FileSystemObject はクラスで作成されているのでオブジェクトです。クラスについて詳しくは「クラス」をご覧ください。
参照設定や CreateObject 関数が必要なオブジェクトについては、使用後に必ず Nothing を代入する後始末が必要です。
Dim fso As FileSystemObject
Set fso = New FileSystemObject
' Dim fso As Object
' Set fso = CreateObject("Scripting.FileSystemObject")
' fso を使用
Set fso = Nothing ' 後始末として必須
Nothing を忘れると FileSystemObject のインスタンスがメモリ上に残り続けるメモリリークという現象が発生する可能性があります。そうなるとファイルを開いたままの状態になり、削除できなくなるなどの問題が起こります。
通常は関数を抜けるときに自動で Nothing を代入する処理が行われます。しかし、なぜかそうならないときがあるため、確実にメモリを解放するために手動で Nothing を設定します。
処理中にエラーが発生しても確実に Nothing を代入するには次のようなエラー処理が必要です。
On Error Goto Catch
Dim fso As FileSystemObject
Set fso = New FileSystemObject
' 正常な処理
Set fso = Nothing
Exit Sub
Catch:
' エラー処理
Set fso = Nothing
エラー処理について詳しくは「エラー処理をする」をご覧ください。