和風スパゲティのレシピ

日本語でコーディングするExcelVBA

FileSystemObject

FileSystemObject入門-ファイル一覧の取得

FileSystemObjectでフォルダ内のファイル一覧を取得する方法について解説します。FSOはファイル・フォルダをオブジェクトとして扱えるのが特長で、フォルダ内のFileオブジェクトは「Folderオブジェクト.Files」で取得でき、これにForEach文が使えます。

Dir関数でサブフォルダの一覧を取得する方法

Dir関数を使ってサブフォルダの一覧を取得する方法を解説します。これは非推奨な方法で、FileSystemObjectを使った方が簡単なことに注意してください。Dirの場合は相対パスとファイルも検索されてしまい、これをはじくコードが必要になります。

空のフォルダを一括削除するマクロ

空のフォルダを一括で削除する方法を解説します。親フォルダのSubFoldersをForEachでループし、FilesとSubFoldersのCOuntが共に0である子フォルダをDeleteすることで実行できます。下層フォルダまで検索する場合は、再帰呼出を追加します。

フォルダが空か判定する

フォルダが空かどうか判定する方法を解説します。フォルダの中にファイルがなく、かつフォルダの中にフォルダない場合に空のフォルダと判定します。Folderオブジェクトに対して、.Files.Count = 0と.SubFolders.Count = 0を判定すればOKです。

RmDirとFSO.DeleteFolderの違い

フォルダを削除する際に使用する、RmDirとFileSystemObject.DeleteFolderの違いを解説します。実はこの二つはほとんど違うもの、RmDirは空のフォルダを削除するステートメントですが、DeleteFolderは中身ごとフォルダを削除するメソッドです。

フォルダを削除する - FSO.DeleteFolder

中のファイル・フォルダごとフォルダを削除する場合はFileSystemObject.DeleteFolderメソッドを使い、FSO.DeleteFolder 削除フォルダパス というコードを実行します。これは空フォルダしか削除できないRmDirで行えないため、FSO必須の処理になります。

KillとFSO.DeleteFileの違い

ファイルを削除する際に使用する、KillステートメントとFileSystemObject.DeleteFileメソッドの違いを解説します。両者はほとんど同じ仕様で、引数(削除するファイルのパス)、使えるワイルドカード、エラーが発生する条件などの挙動もほぼ同じです。

FileSystemObject.DeleteFileメソッド

FileSystemObjectにてファイルを削除する、DeleteFileメソッドの使い方を解説します。FSO.DeleteFile 削除したいファイルのパス で実行できます。Killステートメントと同様、ワイルドカード*を利用して、該当ファイルの一括削除を行うこともできます。

FileSystemObject入門-参照設定と変数宣言

ファイル・フォルダ操作の便利ツール「FileSystemObject」を使うための事前準備として行う、「Microsoft Scripting Runtime の参照設定」と、「FileSystemObjectのオブジェクト変数のSet」の2つの設定について、やり方を解説していきます。

FileSystemObjectの呼び出しを短縮する方法

FileSystemObjectはとても便利なのですが、CreateObjectやNewを使った参照・宣言部分が面倒です。これを簡単に行う方法として、Public FSO As New FileSystemObjectとPublic変数でNewまで済まし、全プロシージャで使いまわす方法があります。

変数宣言(Dim)とNewを1行で済ませてよいか

Collection/Dictionary/FileSystemObject/自作クラスを使用するとき、Dim x As X、Set x = New Xと2行で宣言する方法と、Dim x As New X と1行で宣言する方法があります。この違いはNothing時の動きと、Initializeの実行タイミングに現れます。

フォルダを部分一致(ワイルドカード)で検索する

フォルダを部分一致で検索する方法を解説します。フォルダの検索にはFileSystemObjectを使うのがおすすめです。Dir関数はワイルドカードが使えますが、引数にvbDirectoryを指定してもファイルまで一緒に検索するためコードが煩雑になります。

ファイルを部分一致(ワイルドカード)で検索する

ファイル名を部分一致検索する方法を解説します。単純な部分一致であればDir関数にワイルドカード(*?)を指定することで実行できます。文字数や文字種を絞った部分一致まで行いたい場合は、候補のファイルすべてをLike演算子で比較します。

DirとFSO.FolderExistsの違い

フォルダが存在するか判定する、Dir関数(vbDirectory)と、FileSystemObject.FolderExistsメソッドの違いを解説します。一番の違いは返り値で、True/Falseを返すFolderExistsに対し、フォルダ名を返すDir関数は="",<>""で判定する必要があります。

DirとFSO.FileExistsの違い

ファイルが存在するか判定する、Dir関数とFileSystemObject.FileExistsメソッドの違いを解説します。まずは返り値が異なり、Dir関数は=""<>""での判定が必要になります。また、Dir関数はワイルドカード*を使用した部分一致検索が可能です。

FileSystemObject.FileExistsメソッド

FileSystemObjectにてファイルの存在を判定する、FileExistsメソッドについて解説します。If FSO.FileExists(判定したいファイルのパス) Thenが基本形です。返り値もBooleanとわかりやすい仕様ですが、Dir関数と違ってワイルドカードは使えません。

FileSystemObject入門-FSOって何が便利なの?

ファイル・フォルダを扱うFileSystemObjectについて、何が便利で、何のために使うオブジェクトなのかを解説します。FSOとはファイル管理の便利ツール集であり、「フォルダやファイルをオブジェクトとして扱うことができる」ことが特長です。

FileSystemObject.FolderExistsメソッド

FileSystemObjectにてフォルダの存在を判定する、FolderExistsメソッドについて解説します。If FSO.FolderExists(判定したいフォルダのパス) Thenが基本形です。引数もフォルダパスひとつで、返り値もBooleanと、仕様がわかりやすいメソッドです。

深い階層のフォルダ作成を再帰関数で行う

MkDirステートメントやFileSystemObjectのCreateFolderメソッドは、作りたいフォルダの親フォルダがないとエラーになります。この対策は[\]でSplitしてからのForEach文がストレートですが、再帰関数を使用した方法もあるため紹介します。

FileSystemObject.CreateFolderメソッド

FileSystemObjectにてフォルダを作成する、CreateFolderメソッドについて解説します。作りたいフォルダのパスを渡すとそのフォルダを作成してるメソッドで、通常実行する分には、MkDirステートメントとエラー含めてほとんど同じ動きをします。

MkDirとFSO.CreateFolderの違い

フォルダを作成するときに使用する、MkDirステートメントとFileSystemObject.CreateFolderメソッドの違いを解説します。両者はほとんど同じものと思ってOKで、引数、省略時のカレントフォルダ指定、エラーの発生条件も全く同じ仕様です。

Dirループ中は別関数であっても他のDirは使えない

知らずに落ちると抜け出せなくなるVBAの落とし穴です。Dir関数が途中で止まる、逆に無限ループする、「プロシージャの呼び出し、または引数が不正です。」エラーを出す、あたりにお悩みの方は、この落とし穴に落ちていないかご確認ください。