VBAでファイルの有無を確認したり、フォルダをコピーしたり、テキストファイルの内容を読み書きしたりと、高度なファイルシステム操作を行いたい場合、**FileSystemObject
(FSO)**という機能を利用するのが一般的です。
FSOは、VBAにもともと備わっているMkDir
やFileCopy
といった命令よりもはるかに高機能で、柔軟なファイル・フォルダ操作を実現します。
この記事では、FSOをVBAで利用可能にするための「おまじない」とも言える、オブジェクトを生成する2つの準備方法を解説します。
FileSystemObjectのオブジェクトモデル
FSOを使いこなすには、まずその構造を理解するのが近道です。FSOは、以下のような階層的なオブジェクトで構成されています。
FileSystemObject
: すべての操作の起点となる、最も重要な親オブジェクト。Drives
コレクション: PCに接続されている全ドライブの集まり。Drive
オブジェクト: 個々のドライブ(Cドライブなど)。
Folders
コレクション: ある場所にある全フォルダの集まり。Folder
オブジェクト: 個々のフォルダ。
Files
コレクション: あるフォルダにある全ファイルの集まり。File
オブジェクト: 個々のファイル。
TextStream
オブジェクト: テキストファイルの読み書きを専門に行うオブジェクト。
まずは、親となるFileSystemObject
オブジェクトを生成できなければ、何も始まりません。
FSOオブジェクトを生成する2つの方法
FSOオブジェクトを生成するには、「レイトバインディング」と「アーリーバインディング」という2つの方法があります。
方法1:レイトバインディング (CreateObject
を使う)
事前の準備が不要で、手軽に利用できる方法です。
Sub PrepareFSO_LateBinding()
' 変数を宣言します
Dim fso As Object
' CreateObject関数で、FSOオブジェクトを生成します
Set fso = CreateObject("Scripting.FileSystemObject")
' 生成できたかを確認
If Not fso Is Nothing Then
MsgBox "FileSystemObjectが正常に生成されました。(レイトバインディング)"
' ここに、fsoを使ったファイル操作のコードを記述していく
End If
' オブジェクトを解放
Set fso = Nothing
End Sub
- 長所: 事前の「参照設定」が不要なため、コードを記述すればすぐに使えます。
- 短所: VBAエディタの入力補完(IntelliSense)が効かないため、メソッド名などを正確に覚えておく必要があります。
方法2:アーリーバインディング (New
を使う – 推奨)
VBAに「これからFSOという機能を使いますよ」と事前に教えてあげる方法です。一手間かかりますが、コードが書きやすくなるなど多くのメリットがあるため、こちらの方法を強く推奨します。
【重要】事前準備:参照設定
- VBE(
Alt
+F11
)を開き、メニューのツール
>参照設定
をクリックします。 - 一覧の中から**「Microsoft Scripting Runtime」**を探し、チェックを入れて「OK」をクリックします。
完成したVBAコード
'参照設定: Microsoft Scripting Runtime
Sub PrepareFSO_EarlyBinding()
' 変数を宣言します
Dim fso As FileSystemObject
' Newキーワードで、FSOオブジェクトを生成します
Set fso = New FileSystemObject
' 生成できたかを確認
If Not fso Is Nothing Then
MsgBox "FileSystemObjectが正常に生成されました。(アーリーバインディング)"
' ここに、fsoを使ったファイル操作のコードを記述していく
End If
' オブジェクトを解放
Set fso = Nothing
End Sub
- 長所: 入力補完が完全に機能するため、
fso.
と入力すると、使えるメソッドやプロパティの一覧が表示され、コーディングが非常に楽になります。また、処理速度もレイトバインディングより若干高速です。 - 短所: 事前に参照設定を行う必要があります。
まとめ
方法 | 事前準備 | 入力補完 | 推奨度 |
レイトバインディング | 不要 | 効かない | 低 |
アーリーバインディング | 参照設定が必要 | 効く | 高(強く推奨) |
Google スプレッドシートにエクスポート
結論として、これからFSOを使った開発を始めるのであれば、最初に**「Microsoft Scripting Runtime」への参照設定**を行い、アーリーバインディングでコーディングを進めるのが最も効率的で間違いのない方法です。
この準備さえできれば、ファイルの存在確認、コピー、移動、削除、テキストファイルの読み書きなど、VBAでできることの幅が大きく広がります。