【VBAでフォルダ/ファイル操作】(1)FileSytemObjectを使用する準備

ノートPC
この記事は約5分で読めます。

Excel-VBAでフォルダやファイルを操作する方法を3回の記事にわけて紹介します。

最終的にはあるフォルダの中にあるサブフォルダ内やさらにその下位にあるサブフォルダ内にあるすべてのファイルを操作する方法を紹介します。

方法としてDir関数を用いる方法もありますが、今回はFileSystemObjectを用いた方法を紹介します。

1回目の今回はFileSytemObjectを使うための準備について紹介します。

FileSystemObjectを使うための準備について

FileSystemObjectはファイルやフォルダを操作するためのオブジェクトですが、Excel-VBAの標準オブジェクトではなく外部ライブラリのオブジェクトになるため、VBAで使うための準備が必要になります。

外部ライブラリのオブジェクトを使うためにはそのライブラリを参照するバインディングをする必要があります。バインディングには「事前バインディング」と「実行時バインディング」の2通りの方法があり、どちらかの方法を実施すればよいです。

事前バインディング(参照設定をする)

事前バインディングは使用するライブラリを参照設定であらかじめ設定しておく方法です。

参照設定はVBEの「ツール」→「参照設定」で表示されるライブラリファイルから参照するライブラリを選択して適用します。

FileSystemObjectを使用するにはここで「Microsoft Scripting Runtime」を選択します。

参照設定をした場合の変数の宣言およびオブジェクトの作成のコードは次のようにします。

Dim fso As FileSystemObject    ’//変数の宣言
Set fso = New FileSystemObject  ’//オブジェクトの作成

これらを一行のまとめて「Dim fso As New FileSystemObject」と記すことも可能ですが、実はこの記述では変数の宣言と同時にオブジェクトを作成しているわけではありません。この記述だと変数がコードの中で使用されるたびに「オブジェクトが生成されているかを判別」し「生成されていなければ生成する」という処理が毎回行われます。コードの記述が一行にまとまって簡潔になったようにみえて実はプログラムとしては毎回確認処理が入るという無駄が発生してしまうのであまりお勧めできません。

参照設定をして事前バインディングをした場合はFileSystemObjectを操作して得られたファイルオブジェクトやフォルダオブジェクトを格納する変数を宣言するときも専用のオブジェクト型で宣言することができます。

Dim sFolder As Folder  ’//フォルダオブジェクトを格納する変数
Dim sFile As File    ’//ファイルオブジェクトを格納する変数

実行時バインディング(CreateObject関数を使う)

事前バインディングのように外部ライブラリへの参照をあらかじめ設定せずに、マクロを実行したときに外部ライブラリのオブジェクトを作成するにはCreateObject関数を使います。

変数の宣言はObject型で宣言しておき、その変数にCreateObject関数で作成したオブジェクトを格納します。コードは次のようになります。

Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)

この場合、ファイルオブジェクトやフォルダオブジェクトを格納する変数の宣言にも専用の型は使えないのでいずれもObject型で宣言することになります。

Dim sFolder As Object
Dim sFile As Object

事前バインディングと実行時バインディングの違い

事前バインディングと実行時バインディングのどちらかで実施すればよいのですが、どちらが優れているか一概には言えません。それぞれにメリットとデメリットがあります。

メリットデメリット
事前バインディングインテリセンスが利用できる
処理速度が若干速い
汎用性にやや難あり
実行時バインディング汎用性が高いインテリセンスが利用できない
処理速度が比較的遅い

事前バインディングをすることのメリットとして一番にあげられるのはインテリセンス(入力補完)が利用できることでしょう。自動メンバ表示が使えるのでコードの入力作業が効率的になり、スペルミスも予防できます。また、事前にライブラリを特定しているので処理速度も若干ですが事前バインディングのほうが早くなります。

デメリットとしては複数のPCで使用するときなど、それぞれのアプリケーションのバージョン違いなどによって支障がでる場合があり、やや汎用性に欠けることがあげられます。

逆に実行時バインディングではそのような心配はないので汎用性が高いことがメリットとなります。デメリットとしてはインテリセンスが利用できない、処理速度が事前バインディングと比較すると若干遅いことでしょうか。

個人利用目的など特定のPC環境下で使用するマクロを作成するなら事前バインディングをしてインテリセンス利用のメリットを享受したほうがいいでしょう。

会社などで複数のPC環境で汎用的に使用するマクロとして作成するなら実行時バインディングで作成しておくことで余計なトラブルを回避できます。

コード作成時は事前バインディングで作成し、完成してから実行時バインディングのコードに書き換えるという方法もあります。

事前バインディングで作成したマクロには「参照設定が必要」である旨をコメントで記しておくとよいでしょう。

まとめ

今回はFileSytemObjectを使用するための準備について紹介しました。次回からFileSytemObjectを使用してフォルダとファイルを操作する方法を紹介していきます。

コメント

タイトルとURLをコピーしました