ファイルやフォルダは、セルやシートと違って、Excel上には存在しない外部オブジェクトです。
なので、VBAでファイルやフォルダを操作する(作成、削除、移動、コピー等)ときには、「FileSystemObject」というオブジェクトを使用しないといけません。
では、Excel上に存在しない外部オブジェクト「FileSystemObject」を使用するにはどうしたらいいのでしょうか?
方法は以下の2つになります。
■CreateObject 関数を利用する方法
関数を利用して、FileSystemObjectを使えるようにする方法です。
【利用方法】
Dim FSO As Object Set FSO = CreateObject("Scripting.FileSystemObject") ***変数「FSO」を利用した処理*** Set FSO = Nothing
- まず、変数「FSO」をObjectとして宣言します。
参照設定をしていないので、「FileSystemObject」への宣言はできません。
Dim FSO As Object
- 次に、CreateObject関数を利用して、変数「FSO」にFileSystemObjectをセットします。
Set FSO = CreateObject(“Scripting.FileSystemObject”)
この記述をすることで、変数「FSO」をFileSystemObjectとして使うことができます。
例1:FSO.FolderExists(フォルダパス)→フォルダ存在の確認します。
例2:FSO.GetFolder(フォルダパス)→フォルダー オブジェクトを返します。
- 処理の最後に、変数「FSO」を解放します。
Set FSO = Nothing
【メリット】
- 関数の利用だけで、簡単なコードの記述だけで利用することができます。
- Excelのバージョンの違いでエラーが出ることがありません。
【デメリット】
- VBE上でFileSystemObjectに関するインテリセンス機能(自動メンバー表示)が効かなくなります。
FileSystemObjectはExcel上のオブジェクトではないので、参照設定をしないとインテリセンス機能が働きません。
↓これがインテリセンス機能(自動メンバー表示)です。
インテリセンス機能(自動メンバー表示)が働かないと、入力ミスの可能性が生じます。
この機能が必要な方は、参照設定をご利用ください。
■参照設定を利用する方法
VBE画面の設定を利用する方法です。
【利用方法】
- VBE画面[ツール] ー [参照設定] をクリックします。
「Microsoft Scripting Runtime」にチェックを入れて<OK>ボタンをクリックし
ます。
参照設定が完了したら、下記コードの記述が可能になります。Dim FSO As FileSystemObject Set FSO = New FileSystemObject ***変数「FSO」を利用した処理*** Set FSO = Nothing
- 変数「FSO」をFileSystemObjectとして宣言します。
Dim FSO As FileSystemObject
参照設定をしていないと、変数「FSO」の宣言の処理でエラーが出てしまいます。
また、変数の宣言で「Dim FSO As Object」としてしまうとVBAのエラーはでませんが、インテリセンス機能(自動メンバー表示)が利用できませんのでご注意ください。
- 次に、変数「FSO」にFileSystemObjectをセットします。
Set FSO = New FileSystemObject
この記述をすることで、変数「FSO」をFileSystemObjectとして使うことができます。
- 処理の最後に、変数「FSO」を解放します。
Set FSO = Nothing
【メリット】
- VBE上でFileSystemObjectに関するインテリセンス機能(自動メンバー表示)を使うことができます。
メンバーが表示されるので、入力ミスが減ります。
【デメリット】
- Excelのバージョンの違いでエラーがでることがあります。
参照設定の内容によっては、Excelのバージョンの違いで番号が違ったりします。
それが原因で、エラーが出てしまうことがあります。
色々な環境で利用する場合は、CreateObject関数のご利用をおすすめします。
■最後のNothingの必要性
どちらのコードも処理の最後に
Set FSO = Nothing
と、変数「FSO」を解放するコードが必要です。
FileSystemObject のインスタンスが、メモリ上にずっと残ってしまうことがあるからです。
それがどういう状況なのかはわからないのですが、私も長時間マクロ処理をしていると処理が遅くなっていく現象に見舞われることがあります。
もしかして、何かがメモリに溜まっているのかもしれません。
そんな時は、Excelと一旦閉じて再度立ち上げると、その現象は解消されます。
そんなこともあり、オブジェクト変数は最後に「Nothing」として、メモリ上から消すように心がけています。
【参考】
指定したフォルダ内のファイル名全てを取得(Excel VBA)
変数でよく使われる「buf」「tmp」の意味
Dir関数が取得するファイルの順番
指定したフォルダ内のフォルダ名全てをGetAttrを使って「エラー53 ファイルが見つかりません。」を出さずに取得(Excel VBA)
GetAttrとは?「= vbDirectory」ではなく「And vbDirectory」となるビット演算の疑問
フォルダ名だけを取得したい時に出てくる 「.」 と 「..」 とは?
指定したフォルダ内とサブフォルダ内全てのファイル名を取得(Excel VBA)
CreateObject(“Scripting.FileSystemObject”) を使ってサブフォルダを取得
再帰処理とは?フォルダ内とサブフォルダ内全てのファイル名を取得(Excel VBA)
指定したフォルダ内のサブフォルダのフォルダ名を全部取得(Excel VBA)
参照渡し「ByRef」と値渡し「ByVal」の違い(Excel VBA)
Callステートメントとは
再帰処理とは?フォルダ内のサブフォルダのフォルダ名を全部取得(Excel VBA)
指定したフォルダの全ての階層のフォルダ名・サブフォルダ名・ファイル名を取得(Excel VBA)
FileSystemObjectとは?CreateObject 関数 FolderExists・GetFolderの使い方
再帰処理とは?指定したフォルダの全ての階層のフォルダ名・サブフォルダ名・ファイル名を取得(Excel VBA)
指定したフォルダ内から「特定の文字を含まないファイル名」を取得(Excel VBA)
■スポンサーリンク
■ランキングに参加しています。 ↓このブログを気に入っていただけましたら、ポチッとお願いします。
にほんブログ村