ファイルシステムオブジェクトはVBAに組み込まれているオブジェクトではなく外部のオブジェクトライブラリ(scrrun.dll)により提供されています。このページではそのオブジェクトライブラリへの参照設定について説明します。
参照設定とは
参照設定とは外部ライブラリとして提供されるオブジェクトを使用する場合に、事前にその外部ライブラリへの参照を設定しておくことを言います。この設定は必須ではないので読み飛ばしていただいても問題ありません。ただ、この参照設定によっていくつかメリットが得られますので、ファイルシステムオブジェクトを使用するのなら設定しておいて損はないでしょう。
参照設定のメリット
自動クイックヒントが表示されるようになる
オブジェクト変数を宣言する際に、Object型ではなく最適な型で宣言することで自動クイックヒントが表示されるようになります。ファイルシステムオブジェクトには多くのプロパティおよびメソッドが存在していますので、コードを記述する際に自動クイックヒントが表示されるのは大きなメリットになります。
処理パフォーマンスの向上
オブジェクト変数を最適な型で宣言することで、処理のパフォーマンスが向上するようです。
(Excel2007ヘルプ情報)
参照設定の方法(Excel2007)
VBEメニューの ツール から 参照設定 を選択する。
表示された参照設定ダイアログから “Microsoft Scripting Runtime” にチェックを入れて OK ボタンを押下する。
最適な型による宣言
前ページの使用例では参照設定をしていない前提なので、変数の型をすべて Object 型にしていました。参照設定の恩恵を最大限受けるには Object 型ではなく以下に記載した最適な型で宣言する必要があります。
- ファイルシステムオブジェクト ・・・ FileSystemObject 型
- ファイルオブジェクト ・・・ File 型
- ファイルコレクション ・・・ Files 型
- フォルダオブジェクト ・・・ Folder 型
- フォルダコレクション ・・・ Folders 型
- ドライブオブジェクト ・・・ Drive 型
- ドライブコレクション ・・・ Drives 型
- テキストストリーム ・・・ TextStream 型
前ページのサンプルマクロ sample_fs012_1 を最適な型で宣言すると以下のようになります。
Sub sample_fs013_1()
'ファイルシステムオブジェクトへの参照を格納するための変数
Dim fso As FileSystemObject
'ファイルオブジェクトへの参照を格納するための変数
Dim fileObj As File
'フォルダオブジェクトへの参照を格納するための変数
Dim folderObj As Folder
'ファイルシステムオブジェクトの生成と変数への格納
Set fso = CreateObject("Scripting.FileSystemObject")
'カレントフォルダ内にある"test.txt"のファイルオブジェクトを取得
Set fileObj = fso.GetFile("test.txt")
'"test.txt"の作成日時、最終更新日時を表示
MsgBox "作成日時 :" & fileObj.DateCreated & vbLf & _
"最終更新日時:" & fileObj.DateLastModified
'カレントフォルダのフォルダオブジェクトを取得
Set folderObj = fso.GetFolder(CurDir)
'カレントフォルダ内のファイルとフォルダ数を表示
MsgBox "ファイル数:" & folderObj.Files.Count & vbLf & _
"フォルダ数:" & folderObj.SubFolders.Count
End Sub
補足
FileSystemObject型を宣言する際にキーワード New を使用すると、オブジェクトの初回参照時にインスタンスが自動的に生成されます。このため、CreateObject関数でインスタンスを生成する手順を省略することができます。
(※省略しなくても全く問題ありません。)
Sub sample_fs013_2()
'ファイルシステムオブジェクトへの参照を格納するための変数
Dim fso As New FileSystemObject
'ファイルオブジェクトへの参照を格納するための変数
Dim fileObj As File
'フォルダオブジェクトへの参照を格納するための変数
Dim folderObj As Folder
' CreateObjectは省略可能
''ファイルシステムオブジェクトの生成と変数への格納
'Set fso = CreateObject("Scripting.FileSystemObject")
'カレントフォルダ内にある"test.txt"のファイルオブジェクトを取得
Set fileObj = fso.GetFile("test.txt")
'"test.txt"の作成日時、最終更新日時を表示
MsgBox "作成日時 :" & fileObj.DateCreated & vbLf & _
"最終更新日時:" & fileObj.DateLastModified
'カレントフォルダのフォルダオブジェクトを取得
Set folderObj = fso.GetFolder(CurDir)
'カレントフォルダ内のファイルとフォルダ数を表示
MsgBox "ファイル数:" & folderObj.Files.Count & vbLf & _
"フォルダ数:" & folderObj.SubFolders.Count
End Sub
以降のページに掲載するサンプルマクロについて
このページでは参照設定することをお勧めしました。しかし、当サイトを訪問したすべての方々が参照設定を行っていることはおそらくないと思います。参照設定をしていない方々がこのページを必ず閲覧するとも限らないですし、閲覧したからと言って必ず参照設定するとも限らないでしょう。
このような理由からこれ以降のサンプルマクロについては参照設定をしていない状態でも動くコードを記述したいと思っております。参照設定を行っている方は必要に応じてサンプルマクロ内の型を最適な型へ修正していただくよう、お願い致します。