更新日:、 作成日:

VBA FileSystemObject ファイル操作の基礎

はじめに

Excel VBA マクロの FileSystemObject を使ったファイル操作の基礎を紹介します。

ファイルの読み書きからフォルダの操作まで、ファイルに関する全ての操作ができます。

VBA にあるファイル関連の関数より使いやすく、機能も豊富です。

関数やプロパティの一覧については「FileSystemObject の関数とプロパティの一覧」をご覧ください。

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 関数」を使います。

参照設定する

[ツール] から [参照設定] をクリックします。

5

[Microsoft Scripting Runtime] をチェックして [OK] をクリックします。

6

これで参照設定できました。型として FileSystemObject を宣言できます。またインテリセンスが表示されるので、入力間違いがなくなります。

7

参照設定の問題点は、この 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

エラー処理について詳しくは「エラー処理をする」をご覧ください。