サイトについて      連絡先   検索

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

参照設定する

VBE の [ツール] をクリックして [参照設定] をクリックします。

1

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

2

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

3

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

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

関連ページ