VBA のファイル システム オブジェクト

Iqra Hasnain 2024年2月15日
  1. VBA のファイル システム オブジェクト
  2. VBA でのFileSystemObjectの作成
VBA のファイル システム オブジェクト

例を挙げて VBA で File System Object を紹介します。

VBA のファイル システム オブジェクト

FileSystemObject (FSO) は、ラップトップのファイル システムにアクセスするためのさまざまな操作を提供します。 このオブジェクトを使用すると、ファイル、ディレクトリ、およびドライブにすばやくアクセスして、それらの読み取りと書き込みを行うことができます。

FSO は、世界標準とシステム設定に従って動作します。 Excel アプリケーションを国際的に共有している場合、FSO は、コードが処理するのに苦労する可能性がある国間の設定の違いを処理します。

FSO を使用すると、Windows ファイル エクスプローラーで実行できるほとんどすべての操作を VBA コードで実行できます。 実際、Windows ファイル システムを完全に制御できます。

VBA でのFileSystemObjectの作成

Excel VBA には FileSystemObject が含まれていません。 おそらく、遅延バインディング オブジェクトを構築することにより、VBA で FSO を使用できます。

コード:

# vba
Sub CreateFileSysObj()

Set MyFileSysObj = CreateFileSysObj("Scripting.FileSystemObject")

End Sub

VBA に FSO ライブラリへの参照を含めることもできます。 アーリー バインディングは、コードの実行時にオブジェクトを生成する必要がないため、レイト バインディングより高速です。

リンクを追加するには、Alt-F11 を押して Visual Basic Editor (VBE) を開き、VBE メニューから 'Tools|References' を選択します。 これにより、適切な参照を選択できるポップアップ ウィンドウが表示されます。

アクセス可能な参照の列内にMicrosoft Scripting Runtimeが見つかるまで、一番下までスクロールします。 ボックスを選択し、[OK] をクリックして、アプリケーションにライブラリを含めます。

DLL ライブラリ ファイルは、C:Windows\SysWOW64\scrrun.dll にあります。

プログラムを他の同僚や場所に送信する場合は、このファイルが PC の適切な場所にあることを確認してください。そうしないと、コードが失敗します。 Dir コマンドを使用して、WorkbookOpen イベントのエラー トラップにファイルが存在することを確認することをお勧めします。

見つからない場合は、メッセージを表示して Excel ファイルを終了します。 参照を挿入したら、次のコードで FSO を生成できます。

コード:

# vba
Sub TestFileSysObj()

Dim MyFileSysObj As New FileSystemObject

End Sub

次のコードは、'Test' という名前のフォルダーが (特定の場所に) 存在するかどうかを判断します。 フォルダが存在する場合、IF 条件は True となり、メッセージ ボックスに 'The Folder Exists.' と表示されます。存在しない場合、テキスト 'The Folder Does Not Exist' が表示されます。

コード:

# vba
Sub FolderExistCheck()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")

If MyFileSysObj.FolderExists("D:\Test") Then
    MsgBox"This Folder Exists"
Else
    MsgBox"This Folder Doest Not Exists"
End If
End Sub

出力:

ファイル システム オブジェクトを使用して VBA でフォルダーの存在を確認する

同様に、ファイルが存在するかどうかを判断できます。 以下のコードは、指定されたフォルダーに Test.xlsx という名前のファイルが存在するかどうかを判断します。

コード:

# VBA
Sub CheckFileExist()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")

If MyFileSysObj.FileExists("D:\Test\Test.xlsx") Then
    MsgBox "This File Exists In Folder"
Else
    MsgBox "This File Does Not Exist In Folder"
End If
End Sub

出力:

VBA でファイル システム オブジェクトを使用してフォルダー内のファイルをチェックする

以下のコードは、システムの C ディスクに 'Test' という名前のフォルダーを作成します (フォルダーを作成するコンピューター上のパスを指定する必要があります)。

コード:

# vba
Sub CreateNewFolder()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
MyFileSysObj.CreateFolder("D:\Test")
End Sub

出力:

VBA でファイル システム オブジェクトを使用して新しいフォルダーを作成する

このコードは適切に機能しますが、フォルダーが既に存在する場合は例外がスローされます。 以下のコードは、フォルダーが既に存在するかどうかを確認し、存在しない場合は作成します。

フォルダーが既に存在する場合は、通知が表示されます。 FSO の Folder Exists メソッドを使用して、フォルダーが存在するかどうかを判断しました。

コード:

# vba
Sub CreateNewFolder()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
If MyFileSysObj.CreateFolder("D:\Test") Then
    MsgBox "This Folder Exists Already"
Else
    MyFileSysObj.CreateNewFolder("D:\Test")
End If
End Sub

出力:

VBA でファイル システム オブジェクトを使用して新しいフォルダーを作成する

次のコードは、すべてのファイルをルート フォルダーから指定したフォルダーにコピーします。

コード:

# vba
Sub FetchFileName()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
Dim FileInFolder
Dim SysFolder

Set SysFolder = MyFileSysObj.GetFolder("D:\Test")

For Each FileInFolder In SysFolder.Files
    Debug.Print FileInFolder.Name
Next FileInFolder

End Sub

出力:

VBA でファイル システム オブジェクトを使用してフォルダーからファイル名を確認

この例は、これまでに説明したものよりも複雑です。 Microsoft Scripting Runtime Library を参照する場合、FileSystemObject と他のすべてのファイルおよびフォルダー オブジェクトを使用できます。

上記の例で述べたように、FileSystemObjectFile、および Folder の 3つのオブジェクトを使用しました。 これにより、必要なフォルダー内の各ファイルを調べることができ、name プロパティを使用してすべてのファイル名のリストを取得します。

Debug.Print を使用してすべてのファイルの名前を取得していることに注意してください。 必要なフォルダー内のすべてのサブフォルダーの名前を指定する別の例に進みましょう。

考え方は、上記の例で説明したものと同じです。 これらの例では、ファイルの代わりにサブフォルダーを使用します。

コード:

# vba
Sub FetchSubFolder()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
Dim FileInFolder
Dim SysFolder
Dim SysSubFolder

Set SysFolder = MyFileSysObj.GetFolder("D:\Test")

For Each SysSubFolder In SysFolder.SubFolders
    Debug.Print SysSubFolder.Name
Next SysSubFolder

End Sub

出力:

VBA でファイル システム オブジェクトを使用してフォルダからサブ フォルダ名を確認

以下に示すように、ファイルを上書きする別の例について説明しましょう。

コード:

# vba
Sub CopyFiles()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
Dim SysFile
Dim SrcFolder
Dim FinalFolder
Dim SysFolder
Dim SysSubFolder

SrcFolder = "D:\Test\Src"
FinalFolder = "D:\Test\Dst"

Set SysFolder = MyFileSysObj.GetFolder(SrcFolder)

For Each SysFile In SysFolder.Files
    MyFileSysObj.CopyFile Source:=MyFileSysObj.GetFile(SysFile), _
    Destination:=FinalFolder & "\" & SysFile.Name, Overwritefiles:=False
Next SysFile

End Sub

出力:

ソースフォルダ:

VBA のファイル システム オブジェクトを使用して src から dst にファイルを転送するための src フォルダ

Dst フォルダ:

VBA でファイル システム オブジェクトを使用して src から dst にファイルを転送した後の dst フォルダー

MyFileSysObj.CopyFile 関数で Overwritefiles プロパティを False に設定していることに注意してください (これはデフォルトで true です)。 これにより、ファイルがフォルダーに既に存在する場合、ファイルが複製されないことが保証されます (エラーが発生します)。

おそらく、これを True に設定するか Overwritefiles を削除すると、正確な名前の最終フォルダー内のすべてのファイルが書き換えられます。 ファイルを転送するときは、ファイルを上書きするリスクが常にあります。

このシナリオでは、名前と一緒にタイムスタンプを提供することをお勧めします。 これにより、ファイル名が常に一意になり、どのファイルがいつコピーされたかを追跡できます。

特定の拡張子を持つファイルのみを複製したい場合は、IF and Then ステートメントを使用して、拡張子が Microsoft スプレッドシートの Excel ファイルであるかどうかをテストします。

コード:

# vba
Sub CopyXlFiles()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
Dim SysFile
Dim SrcFolder
Dim FinalFolder
Dim SysFolder
Dim SysSubFolder

SrcFolder = "D:\Src"
FinalFolder = "D:\Dst"

Set SysFolder = MyFileSysObj.GetFolder(SRCFolder)

For Each SysFile In SysFolder.Files
    If MyFileSysObj.GetExtensionName(SysFile) = "xlsx" Then
        MyFileSysObj.CopyFile Source:=MyFileSysObj.GetFile(SysFile), _
    Destination:=FinalFolder & "\" & SysFile.Name, Overwritefiles:=False
    End If
Next SysFile

End Sub