FileSystemObject CreateObject関数を使う方法・ 参照設定を使う方法 違いを理解してエラー防止(Excel VBA)

ファイルやフォルダは、セルやシートと違って、Excel上には存在しない外部オブジェクトです。

なので、VBAでファイルやフォルダを操作する(作成、削除、移動、コピー等)ときには、「FileSystemObject」というオブジェクトを使用しないといけません。

では、Excel上に存在しない外部オブジェクト「FileSystemObject」を使用するにはどうしたらいいのでしょうか?

方法は以下の2つになります。

CreateObject 関数を利用する方法

関数を利用して、FileSystemObjectを使えるようにする方法です。

【利用方法】

Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")

***変数「FSO」を利用した処理***

Set FSO = Nothing
  1. まず、変数「FSO」をObjectとして宣言します。
    参照設定をしていないので、「FileSystemObject」への宣言はできません。

    Dim FSO As Object

  2. 次に、CreateObject関数を利用して、変数「FSO」にFileSystemObjectをセットします。

    Set FSO = CreateObject(“Scripting.FileSystemObject”)


    この記述をすることで、変数「FSO」をFileSystemObjectとして使うことができます。

    例1:FSO.FolderExists(フォルダパス)→フォルダ存在の確認します。
    例2:FSO.GetFolder(フォルダパス)→フォルダー オブジェクトを返します。

  3. 処理の最後に、変数「FSO」を解放します。

    Set FSO = Nothing

【メリット】

  • 関数の利用だけで、簡単なコードの記述だけで利用することができます。

【デメリット】

  • VBE上でFileSystemObjectに関するインテリセンス機能(自動メンバー表示)が効かなくなります。
    FileSystemObjectはExcel上のオブジェクトではないので、参照設定をしないとインテリセンス機能が働きません。

    ↓これがインテリセンス機能(自動メンバー表示)です。

    インテリセンス機能(自動メンバー表示)が働かないと、入力ミスの可能性が生じます。
    この機能が必要な方は、参照設定をご利用ください。

参照設定を利用する方法

VBE画面の設定を利用する方法です。

【利用方法】

  1. VBE画面[ツール] ー [参照設定] をクリックします。



    「Microsoft Scripting Runtime」にチェックを入れて<OK>ボタンをクリックし
    ます。


    参照設定が完了したら、下記コードの記述が可能になります。

    Dim FSO As FileSystemObject
    Set FSO = New FileSystemObject
    
    ***変数「FSO」を利用した処理***
    Set FSO = Nothing
  2. 変数「FSO」をFileSystemObjectとして宣言します。

    Dim FSO As FileSystemObject

    変数の宣言で「Dim FSO As Object」としてしまうとVBAのエラーはでませんが、インテリセンス機能(自動メンバー表示)が利用できませんのでご注意ください。

  3. 次に、変数「FSO」にFileSystemObjectをセットします。

    Set FSO = New FileSystemObject

    この記述をすることで、変数「FSO」をFileSystemObjectとして使うことができます。

  4. 処理の最後に、変数「FSO」を解放します。

    Set FSO = Nothing

【メリット】

  • VBE上でFileSystemObjectに関するインテリセンス機能(自動メンバー表示)を使うことができます。
    メンバーが表示されるので、入力ミスが減ります。

【デメリット】

  • 参照設定をしていないと、変数「FSO」の宣言の処理でエラーが出てしまいます。

最後の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)
再帰処理とは?フォルダ内のサブフォルダのフォルダ名を全部取得(Excel VBA)
参照渡し「ByRef」と値渡し「ByVal」の違い(Excel VBA)
ファイルのフルパスからファイル名のみを取得 InStrRev関数(Excel VBA)
指定したフォルダの全ての階層のフォルダ名・サブフォルダ名・ファイル名を取得(Excel VBA)
FileSystemObjectとは?CreateObject 関数 FolderExists・GetFolderの使い方
FileSystemObject CreateObject関数を使う方法・ 参照設定を使う方法 違いを理解してエラー防止
再帰処理とは?指定したフォルダの全ての階層のフォルダ名・サブフォルダ名・ファイル名を取得(Excel VBA)
ファイルのフルパスからファイル名のみを取得 Split関数(Excel VBA)
Callステートメントとは 引数 括弧()の使い方(Excel VBA)
指定したフォルダ内から「特定の文字を含まないファイル名」を取得(Excel VBA)
ワイルドカードとは。使い方いろいろ。(Excel)
Dir関数の使い方。ファイル名やフォルダ名の取得方法。(Excel VBA)
指定したフォルダのファイル名を取得し、そのファイル名を一括で変換(Excel VBA)
Excel起動時に「コンパイルエラー」。64ビット システムで Declareステートメントに、PtrSafe属性を設定(Excel VBA )
「ファイルを開く」ダイアログボックス から ファイル名を取得(Excel VBA)
「ファイルを開く」ダイアログボックス から 複数 ファイル名を取得(Excel VBA)
指定フォルダ内のサブフォルダ全てをフォルダ構成のみ(空フォルダ)を別フォルダにコピー(Excel VBA)
再帰処理とは?指定フォルダ内のサブフォルダ全てをフォルダ構成のみ(空フォルダ)を別フォルダにコピー(Excel VBA)

■■■スポンサーリンク■■■