【Excel VBA入門】FileSystemObjectを使ったファイル操作の基本を解説

【Excel VBA入門】FileSystemObjectを使ったファイル操作の基本を解説

こんにちは、業務自動化ツール開発担当の吉池(@valmore_myoshi)です。

処理が完了したファイルを移動したり、ファイルを作成する前にフォルダの存在をチェックすることはよくありますよね?そんなファイルやフォルダを操作するときに使うべきFileSystemObjectを今回は解説します!

FileSystemObjectを覚えれば、ファイルやフォルダを柔軟に操作できるようになります。本記事では、ファイルとフォルダの操作方法を一つずつ分けて解説しています。VBAを使ううえでFileSystemObjectを覚えて損はありません。ぜひマスターしてください!

FileSystemObjectとは

FileSystemObjectとは、ファイルシステムへのアクセスを提供するオブジェクトです。具体的には、ファイルやフォルダの作成、削除、移動、コピーといった基本操作を扱えます。

FileSystemObjectは外部ライブラリのため、使うときは要注意!外部ライブラリの参照設定をするか、CreateObjectを使って初めて使用できます。

Microsoft Scripting Runtimeの参照設定を利用する

外部ライブラリの参照設定はとても簡単です。VBEの開発画面、ツールから参照設定をクリックします。

「参照可能なライブラリファイル」から「Microsoft Scripting Runtime」にチェックを入れ、OKボタンを押下して完了です。

参照設定をすれば、Newキーワードを使ってFileSystemObjectのインスタンスを作れます。

Dim fso As FileSystemObject

Set fso = New FileSystemObject

参照設定するメリットはインテリセンス(自動補完機能)が使えることです。プロパティやメソッドを自動補完してくれるので、エラーもなくスムーズに開発できます。基本的には参照設定して開発するのがオススメです!

CreateObjectでインスタンスを作成する

CreateObjectを使う場合は、引数にScripting.FileSystemObjectを渡して下記のようにインスタンスを作ります。

Dim fso As Object

Set fso = CreateObject("Scripting.FileSystemObject")

CreateObjectを使う利点は外部ライブラリの参照設定が必要ないことです。つまり、配布先のExcelに参照設定がなされているかを気にしなくて済みます。

一方、インテリセンスが効かなくなるデメリットがあります。これはエラーにつながる大きなデメリットなので、開発するときは参照設定をし、配布するときにCreateObjectに書き換えるといった手も考えられます。

FileSystemObjectの使い方

FileSystemObjectを使用する準備が整ったところで、実際にどんなことができるのか見ていきましょう!コード例は参照設定している前提で書かれています。

ファイル・フォルダの作成

FileSystemObjectでは、CreateTextFileメソッドを使ってテキストファイルを作成できます。下記の例では、デスクトップにテキストファイルを作成して文字列を書き込んでいます。

Dim fso As FileSystemObject
Dim ts As TextStream

Set fso = New FileSystemObject

‘ CreateTextFileの2つ目の引数は上書き可否。
Set ts = fso.CreateTextFile("C:\Users\yoshiike\Desktop\test.txt", True)

ts.WriteLine ("This is a test.")
ts.Close

フォルダを作るときはCreateFolderメソッドを使います。下記の例では引数にデスクトップのパスを指定し、Testフォルダを作っています。

Dim fso As FileSystemObject

Set fso = New FileSystemObject
fso.CreateFolder ("C:\Users\yoshiike\Desktop\Test")

ファイル・フォルダの存在チェック

ファイルの存在チェックはFileExistsメソッドを使います。ファイルが存在すればTrue、なければFalseを返します。

よく使うのはファイル作成時にすでに同名のファイルが存在していないか確認するときです。例えば、こんな感じ。ファイルの有無に応じてIf文で処理を分けています。

Dim fso As FileSystemObject
Dim ts As TextStream

Set fso = New FileSystemObject

If fso.FileExists("C:\Users\yoshiike\Desktop\test.txt") Then
    MsgBox "ファイルが存在します!"
Else
    Set ts = fso.CreateTextFile("C:\Users\yoshiike\Desktop\test.txt", False)
    ts.WriteLine ("this is a test.")
    ts.Close
End If

フォルダの存在チェックも同様です!FolderExistsメソッドを使ってフォルダの存在チェックをしてから、そのフォルダ内にテキストファイルを作ってみます。

Dim fso As FileSystemObject
Dim ts As TextStream

Set fso = New FileSystemObject

If fso.FolderExists("C:\Users\yoshiike\Desktop\Test") Then
    Set ts = fso.CreateTextFile("C:\Users\yoshiike\Desktop\Test\test.txt")
    ts.WriteLine ("this is a test.")
    ts.Close
Else
    MsgBox "フォルダがありません!"
End If

ファイル・フォルダの削除

ファイルの削除はDeleteFileメソッドを使います。1つ目の引数に削除したいファイル名を指定します。ファイル名にはワイルドカードも指定でき、複数ファイルを削除することも可能です。2つ目の引数にはFalseがデフォルトの真偽値をとり、Trueの場合は読み取り専用ファイルも削除します。

Dim fso As FileSystemObject

Set fso = New FileSystemObject

fso.DeleteFile "C:\Users\yoshiike\Desktop\test.txt"

' ワイルドカードを使用する場合
fso.DeleteFile "C:\Users\yoshiike\Desktop\test*.txt"

フォルダ削除はDeleteFolderメソッドを使います。DeleteFileメソッド同様、1つ目の引数には削除したいフォルダパス(ワイルドカード可)、2つ目には真偽値をとり、Trueのときは読み取り専用フォルダでも削除します。

Dim fso As FileSystemObject

Set fso = New FileSystemObject

fso.DeleteFolder "C:\Users\yoshiike\Desktop\Test"

' ワイルドカードを使用する場合
fso.DeleteFolder "C:\Users\yoshiike\Desktop\Test*"

ファイル・フォルダのコピー

ファイルのコピーにはCopyFileメソッドを使います。コピー元、コピー先は必須で、3つ目の引数は上書き可否の真偽値をとります。Trueがデフォルトです。

Dim fso As FileSystemObject

Set fso = New FileSystemObject

fso.CopyFile "C:\Users\yoshiike\Desktop\test.txt", _
    "C:\Users\yoshiike\Documents\test.txt", False

フォルダのコピーにはCopyFolderメソッドを使います。CopyFileメソッド同様でコピー元、コピー先は必須。3つ目の引数はフォルダの上書き可否を決める真偽値をとります。

Dim fso As FileSystemObject

Set fso = New FileSystemObject

fso.CopyFolder "C:\Users\yoshiike\Desktop\Test", _
    "C:\Users\yoshiike\Documents\Test", False

ファイル・フォルダの移動

ファイルの移動には移動元と移動先を引数にとるMoveFileメソッドを使います。移動元にはワイルドカードを使用できるので、複数のファイルを移動できます。

Dim fso As FileSystemObject

Set fso = New FileSystemObject

fso.MoveFile "C:\Users\yoshiike\Desktop\test.txt", _
    "C:\Users\yoshiike\Documents\test.txt"

フォルダの移動はMoveFolderメソッドを使います。MoveFileメソッドと同様で、移動元と移動先を引数にとり、移動元にはワイルドカードを使用できます。

Dim fso As FileSystemObject

Set fso = New FileSystemObject

fso.MoveFolder "C:\Users\yoshiike\Desktop\Test", _
    "C:\Users\yoshiike\Documents\Test"

ファイルとフォルダの移動にはもう一つ、Moveメソッドが使えます。MoveメソッドはFileオブジェクトとFolderオブジェクトにつなげて書き、引数に移動先を指定します。MoveFileやMoveFolderとの違いはワイルドカードを使えない点です。

Dim fso As FileSystemObject
Dim f As file

Set fso = New FileSystemObject

‘ Moveメソッドを使ってファイル移動する例
Set f = fso.getfile("C:\Users\yoshiike\Desktop\test.txt")
f.Move "C:\Users\yoshiike\Documents\test.txt"

ファイル・フォルダのパス取得

ファイルやフォルダのパスを取得するにはPathプロパティを使います。下記の例では、ファイルを取得し、そのパスを表示しています。

Dim fso As FileSystemObject
Dim f As file

Set fso = New FileSystemObject
Set f = fso.GetFile("C:\Users\yoshiike\Desktop\test.txt")

Debug.Print f.Path
実行結果

まとめ

ファイルやフォルダ操作専門のFileSystemObjectを解説しました。Excelのワークブックやシートの操作は基本ですが、外部ファイルの扱いも頻繁に使います。

特に本記事で紹介した作成、削除、移動、コピーの基本操作に加え、存在チェックとパス取得はVBA開発では頻出です。コードを見て実際に手を動かすことで理解が進むので、ぜひご自身の環境で試してみてください。