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
出力:
同様に、ファイルが存在するかどうかを判断できます。 以下のコードは、指定されたフォルダーに 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
出力:
以下のコードは、システムの C ディスクに 'Test'
という名前のフォルダーを作成します (フォルダーを作成するコンピューター上のパスを指定する必要があります)。
コード:
# vba
Sub CreateNewFolder()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
MyFileSysObj.CreateFolder("D:\Test")
End Sub
出力:
このコードは適切に機能しますが、フォルダーが既に存在する場合は例外がスローされます。 以下のコードは、フォルダーが既に存在するかどうかを確認し、存在しない場合は作成します。
フォルダーが既に存在する場合は、通知が表示されます。 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
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
出力:
この例は、これまでに説明したものよりも複雑です。 Microsoft Scripting Runtime Library
を参照する場合、FileSystemObject
と他のすべてのファイルおよびフォルダー オブジェクトを使用できます。
上記の例で述べたように、FileSystemObject
、File、および 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
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
出力:
ソースフォルダ
:
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