VBAで再帰処理を実行
最近、ExcelVBAの再帰処理の方法を人から教えてもらったので、以前断念したフォルダ一覧の取得をVBAで試してみました。
使い方の基本さえわかっていればかなり便利に使用できますのでこちらでご紹介します。
再帰処理とは
再帰処理とはあるプログラムの中で自分自身を呼び出して繰り返し処理を行うことです。
繰り返しの数があらかじめ定まっていない、ネストの階層がわからない場合など一般的な繰り返しが適用しにくい場合に有効な処理となります。
スポンサーリンク
再帰処理の実例
再帰処理はいつでもどこでも使うものというより特定の状況で知っておくとめちゃくちゃ便利なものだと思います。
今回は再帰処理を用いて「フォルダの一覧を取得」するコードをご紹介します。
Sub フォルダとファイル一覧を取得()
'参照設定「MicrosoftScriptingRuntime」を有効にしておく
Dim fso As New FileSystemObject
'参照設定「Windows Script Host Object Model」を有効にしておく
Dim wsh As New WshShell
Dim tarPath As String: tarPath = wsh.SpecialFolders("Desktop") & "\マクロ"
Dim tarFolder As Folder: Set tarFolder = fso.GetFolder(tarPath)
Call recursion(tarFolder)
Set fso = Nothing
Set wsh = Nothing
End Sub
Sub recursion(ByRef f As Folder)
Dim tarSubFolder As Folder
For Each tarSubFolder In f.SubFolders
Debug.Print tarSubFolder.Path
Call recursion(tarSubFolder)
Next
End Sub
デスクトップにある「マクロ」ファイルの下部にあるサブフォルダを全階層にわたり取得してイミディエイトに出力するコードになります。
Subプロシージャの「recursion」(再帰)の中で、 ①サブフォルダを取得して、②そのフォルダオブジェクトを引数にして自分自身をCallで呼び出す作りになっています。
Subプロシージャが自分自身を呼び出すことができることに自分では考えが至らず、教わったときに衝撃を受けました。
この処理は対象となるフォルダが多いと終了するまでに時間がかかるのでご注意ください。
普通にデスクトップのパスを文字列で指定してもいいのですが、Windowsのユーザー名に依存せずにデスクトップを指定するためにWSH(Windows Scripting Host)のSpecialFoldersを使用しています。
Debug.printでイミディエイトウィンドウに表示する代わりに、配列に入れたりワークシートに出力することでより高速に処理ができるようになります。
ちなみにPythonではglobというライブラリを使用すれば、以下の1行で再帰処理を実行して全フォルダを取得することができます。
print(glob.glob('C:/Users/<ユーザー名>/Desktop/マクロ/**', recursive=True))
この辺りはまた別の記事でご紹介できればと思います。
今回の目的だけならPythonを使った方が便利そうですが、VBAでも再帰処理ができるというのは大きな発見でした。


コメント