Using VBA FileSystemObject (FSO) in Excel – Easy Overview & Examples

VBA を Excel で使う場合、そのほとんどは作業の自動化のためです。

これは、ほとんどの場合、セルや範囲、ワークシート、ワークブック、その他 Excel アプリケーションに含まれているオブジェクトで作業するということも意味します。

しかし、VBA はもっと強力で、Excel 以外のものを扱うのにも使用できます。

このチュートリアルでは、VBA FileSystemObject (FSO) を使用して、システムまたはネットワーク ドライブ上のファイルやフォルダーを操作する方法を紹介します。

FileSystemObject(FSO)を使用すると、コンピュータのファイルシステムにアクセスすることができます。

たとえば、Excel VBA で FileSystemObject を使用してできることは次のとおりです。

  • ファイルまたはフォルダが存在するかどうかを確認する。
  • あるフォルダーから別のフォルダーにファイルをコピーする。

おわかりいただけたでしょうか。

これらすべての上記の例(さらにもっと)をこのチュートリアルで後で取り上げます。

Note: FSO can only be used in Excel 2000 and later versions.

FileSystemObject を通してアクセスできるすべてのオブジェクトは何ですか。

上で述べたように、VBA の FileSystemObject を使用してファイルやフォルダーにアクセスし、変更することができます。

以下の表は、FSO を使用してアクセスおよび変更できる最も重要なオブジェクトを示しています:

Object Description
Drive ドライブ オブジェクトにより、存在するかどうか、パス名、ドライブ タイプ(取り外し可能、固定)、サイズなどドライブについての情報を取得することができます。
Folder Folder オブジェクトは、システム内にフォルダーを作成したり変更したりすることができます。 例えば、このオブジェクトを使用してフォルダの作成、削除、名前の変更、コピーを行うことができます。
File Fileオブジェクトは、システム内のファイルを操作できるようにするものです。 例えば、このオブジェクトを使用してファイルの作成、オープン、コピー、移動、削除を行うことができます。
TextStream TextStreamオブジェクトはテキストファイルを作成または読み込むことを可能にします。

上記の各オブジェクトには、これらを操作するために使用できるメソッドがあります。

例を挙げると、フォルダを削除したい場合、FolderオブジェクトのDeleteFolderメソッドを使用することになるでしょう。 同様に、ファイルをコピーしたい場合は、FileオブジェクトのCopyFileメソッドを使用します。

これが圧倒的で、理解しにくいと感じても心配しないでください。

参考までに、このチュートリアルの最後に、すべての FileSystemObject メソッド (各オブジェクト) を説明しました。

Excel VBA で FileSystemObject を有効にする

FileSystemObject は Excel VBA ではデフォルトで使用できません。

私たちは Excel アプリケーションの外にあるファイルおよびフォルダーを扱っているので、まずこれらのオブジェクト(ドライブ、ファイル、フォルダー)を保持するライブラリへの参照を作成する必要があります。

ここで、Excel VBA で FileSystemObject を使い始めるには 2 つの方法があります。

  1. Microsoft Scripting Runtime Library (Scrrun.dll)
  2. コード自体からライブラリを参照するオブジェクトを作成する

これらの方法はどちらも機能しますが(この方法を次に紹介します)、最初の方法を使うことをお勧めします。

Note: FileSystemObject を有効にすると、その中のすべてのオブジェクトにアクセスできます。 これには、FileSystemObject、Drive、Files、Folders などのオブジェクトが含まれます。

Microsoft Scripting Runtime Library への参照を設定する

Scripting Runtime Library への参照を作成すると、ファイルとフォルダーのすべてのプロパティとメソッドへのアクセスを Excel VBA に許可することになります。 これが完了すると、Excel VBA 内からファイル/フォルダー/ドライブ オブジェクトを参照できます(セル、ワークシート、またはワークブックを参照できるのと同じように)。

以下は、Microsoft Scripting Runtime Library への参照を作成する手順です:

  1. VB Editor で、[ツール]をクリック。
  2. [参照]をクリックします。
  3. [参照]ダイアログボックスが表示されたら、使用できる参照をスクロールして、「Microsoft Scripting Runtime」オプションをチェックします。
  4. [OK]をクリックします。

以上の手順で、Excel VBA から FSO オブジェクトを参照できるようになりました。

コード内に FileSystemObject のインスタンスを作成する

スクリプト FileSystemObject ライブラリへの参照を設定したら、コード内に FSO オブジェクトのインスタンスを作成する必要があります。

これを作成したら、VBA で使用できます。

以下は、オブジェクト変数 MyFSO を FileSystemObject オブジェクトとして設定するコードです。

Sub CreatingFSO()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectEnd Sub

このコードでは、まず変数 MyFSO を FileSystemObject 型オブジェクトとして宣言しています。 これは、Microsoft Scripting Runtime Libraryへの参照を作成したからこそ可能なことです。

2 行目では、2 つのことが起こります。

  1. NEW キーワードは、FileSystemObject のインスタンスを作成します。 これは、ファイルやフォルダを操作するために、FileSystemObject のすべてのメソッドを使用できるようになったことを意味します。 このインスタンスを作成しないと、FSO のメソッドにアクセスできません。
  2. SETキーワードは、オブジェクト MyFSO を FileSystemObject のこの新しいインスタンスに設定します。 これにより、このオブジェクトを使用してファイルやフォルダーにアクセスできるようになります。 たとえば、フォルダーを作成する必要がある場合、MyFSO.CreateFolder メソッドを使用できます。

必要であれば、次のように上記の 2 つのステートメントを 1 つにまとめることもできます。

Sub CreatingFSO()Dim MyFSO As New FileSystemObjectEnd Sub

この方法 (Microsoft Scripting Runtime Library への参照を設定する) の大きな利点は、コード内で FSO オブジェクトを使用すると、オブジェクトと関連するメソッドやプロパティを示す IntelliSense 機能を使用できるようになる (次のようになる) 点にあります。

コード内から参照を作成する場合(次に取り上げます)、これは不可能です。

コードからオブジェクトを作成する

FSO への参照を作成するもうひとつの方法は、コードから行う方法です。 この方法では、(前の方法で行ったように)参照を作成する必要はありません。

コードを書いているとき、コード内からオブジェクトを作成し、Scripting.FileSystemObject を参照することができます。

以下のコードでは、オブジェクト FSO を作成し、これを FileSystemObject タイプにします。

Sub FSODemo()Dim FSO As ObjectSet FSO = CreateObject("Scripting.FileSystemObject")End Sub

これはより便利に見えますが、この方法を使用する大きな欠点は、FSO でオブジェクトを操作するときに IntelliSense を表示しないことでしょう。 私にとってはこれは大きなマイナスであり、FSO を有効にする以前の方法 (「Microsoft Scripting Runtime」への参照を設定する方法) を常に使用することをお勧めします。

例1:ファイルまたはフォルダが存在するかどうかをチェックする

次のコードは、名前 ‘Test’ のフォルダが(指定した場所に)存在するかどうかをチェックします。

Sub CheckFolderExist()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectIf MyFSO.FolderExists("C:\Users\sumit\Desktop\Test") Then MsgBox "The Folder Exists"Else MsgBox "The Folder Does Not Exist"End IfEnd Sub

同様に、ファイルが存在するかどうかもチェックできます。

次のコードは、指定したフォルダーに Test.xlsx という名前のファイルが存在するかどうかをチェックします。

Sub CheckFileExist()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectIf MyFSO.FileExists("C:\Users\sumit\Desktop\Test\Test.xlsx") Then MsgBox "The File Exists"Else MsgBox "The File Does Not Exist"End IfEnd Sub

例2:指定した場所に新しいフォルダを作成する

以下のコードは、私のシステムのCドライブに「Test」という名前のフォルダを作成します(フォルダを作成するシステム上のパスを指定する必要があります)。

Sub CreateFolder()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectMyFSO.CreateFolder ("C:\Users\sumit\Desktop\Test")End Sub

このコードは正常に動作しますが、フォルダーがすでに存在する場合はエラーが表示されます。 フォルダがすでに存在する場合は、メッセージを表示します。

Sub CreateFolder()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectIf MyFSO.FolderExists("C:\Users\sumit\Desktop\Test") Then MsgBox "The Folder Already Exist"Else MyFSO.CreateFolder ("C:\Users\sumit\Desktop\Test")End IfEnd Sub

例3:フォルダ内の全ファイルのリストを取得する

以下のコードは、指定したフォルダ内の全ファイルの名前を表示します。

このチュートリアルで前述したように、「Microsoft Scripting Runtime Library」を参照すると、FileSystemObject だけでなく、他のすべてのオブジェクト (Files や Folders など) も使用できます。

上記のコードでは、3 つのオブジェクト (FileSystemObject, File, および Folder) を使用しています。 これにより、指定されたフォルダー内の各ファイルを調べることができます。

すべてのファイルの名前を取得するために Debug.Print を使用していることに注意してください。 これらの名前は、VB Editor の immediate window にリストされます。

例 4: フォルダ内のすべてのサブフォルダのリストを取得する

次のコードは、指定したフォルダ内のすべてのサブフォルダの名前を表示します。 ロジックは上記の例とまったく同じです。

Sub GetSubFolderNames()Dim MyFSO As FileSystemObjectDim MyFile As FileDim MyFolder As FolderDim MySubFolder As FolderSet MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder("C:\Users\sumit\Desktop\Test")For Each MySubFolder In MyFolder.SubFolders Debug.Print MySubFolder.NameNext MySubFolderEnd Sub

例5:ある場所から別の場所にファイルをコピーする

次のコードは、「ソース」フォルダからファイルをコピーして、「デスティネーション」フォルダにコピーします。

ソースファイルにはコピーしたいファイルのアドレスを、DestinationFolder 変数にはファイルをコピーするフォルダーのアドレスを入れます。

ファイルをコピーするときは、コピー先のフォルダー名を与えるだけでは不十分なことに注意してください。 また、ファイル名も指定する必要があります。 ファイル名は同じものを使ってもいいですし、変えてもかまいません。 上記の例では、ファイルをコピーしてSampleFileCopy.xlsx

例6:あるフォルダから別のフォルダへすべてのファイルをコピーする

次のコードは、ソースフォルダから宛先フォルダへすべてのファイルをコピーします。

Sub CopyAllFiles()Dim MyFSO As FileSystemObjectDim MyFile As FileDim SourceFolder As StringDim DestinationFolder As StringDim MyFolder As FolderDim MySubFolder As FolderSourceFolder = "C:\Users\sumit\Desktop\Source"DestinationFolder = "C:\Users\sumit\Desktop\Destination"Set MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder(SourceFolder)For Each MyFile In MyFolder.Files MyFSO.CopyFile Source:=MyFSO.GetFile(MyFile), _ Destination:=DestinationFolder & "\" & MyFile.Name, Overwritefiles:=FalseNext MyFileEnd Sub

上記のコードは Source フォルダから Destination Folder にすべてのファイルをコピーします。

MyFSO.CopyFile メソッドで、「Overwritefiles」プロパティを False に指定していることに注意してください(デフォルトでは True になっています)。 これにより、万が一、すでにそのファイルがフォルダー内にある場合、そのファイルはコピーされません (そして、エラーが表示されます)。 Overwritefiles’ を削除するか、またはこれを True に設定すると、万一、宛先フォルダーに同じ名前のファイルがある場合、これらは上書きされます。

Pro Tip: ファイルをコピーするとき、常にファイルを上書きする可能性があります。 この場合、名前と一緒にタイムスタンプを追加するのが良いアイデアです。

特定の拡張子のファイルのみをコピーしたい場合、IF Then ステートメントを使用して拡張子が xlsx かどうかをチェックすることでそれを行うことができます。

Sub CopyExcelFilesOnly()Dim MyFSO As FileSystemObjectDim MyFile As FileDim SourceFolder As StringDim DestinationFolder As StringDim MyFolder As FolderDim MySubFolder As FolderSourceFolder = "C:\Users\sumit\Desktop\Source"DestinationFolder = "C:\Users\sumit\Desktop\Destination"Set MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder(SourceFolder)For Each MyFile In MyFolder.Files If MyFSO.GetExtensionName(MyFile) = "xlsx" Then MyFSO.CopyFile Source:=MyFSO.GetFile(MyFile), _ Destination:=DestinationFolder & "\" & MyFile.Name, Overwritefiles:=False End IfNext MyFileEnd Sub

FileSystemObject (FSO) Methods

以下に、各オブジェクトに使用できるメソッドを紹介します。 これはあくまで参考のためで、あまり気にする必要はありません。 これらのうちのいくつかの使用法は、上で取り上げた例で示されています。

ドライブが存在するかどうかチェックする

指定したフォルダーを削除する。

指定したパスを元にフォルダオブジェクトのインスタンスを返す

GetParentFolderName

する。

ファイルのインスタンスを返す

FSO Methods For Object Description
DriveExists Drive
GetDrive Drive 指定したパスをもとにドライブオブジェクトのインスタンスを返す
GetDriveName Drive ドライブ名を再検索
BuildPath File/Folder 既存のパスと名前からパスを生成
CopyFile ファイル/フォルダ ファイルをコピー GetAbsolutePathName File/Folder パスの正規表現を返す
GetBaseName File/Folder パスからベース名を返す Folder File/Folder PathName ABS GetBase Name File/Folder ABS
GetTempName File/Folder 一時ファイル名に使用できる名前を生成します
CopyFolder Folder ある場所からフォルダをコピーする。
CreateFolder Folder 新しいフォルダを作成する
DeleteFolder フォルダを削除する
FolderExists Folder フォルダが存在するかどうかを調べる
GetFolder Folder
Folder 指定したパスをもとに親フォルダーの名前を取得します
GetSpecialFolder Folder 各種システムフォルダーの位置を取得することが可能です。
MoveFolder Folder フォルダをある場所から別の場所に移動する
DeleteFile ファイルを削除する
FileExists File ファイルが存在するかどうかを調べる
GetExtensionName File ファイルの拡張子を返す
GetFile File
GetFileName File ファイル名を返します
GetFileVersion File ファイルのバージョン
MoveFile File ファイルを移動する
CreateTextFile テキストファイルを作成する
GetStandardStream ファイル 標準入力に取得された値です。 出力またはエラーストリーム
OpenTextFile File テキストストリームとしてファイルを開く

あなたは、次のようにもあります Excel チュートリアル:

  • フォルダーからファイル名のリストを取得する & サブフォルダー(Power Queryを使用)。
  • Excelでフォルダーからファイル名のリストを取得する(VBAを使用する場合としない場合)
  • Excel VBAのデータ型(変数と定数)を理解する
  • Excel VBAでユーザー定義関数(UDF)を作成する

コメントを残す

メールアドレスが公開されることはありません。