階層化されたフォルダの構造を取得
今回の「Folder Navigator.xlsm」は、フォルダー内の全てのフォルダ・ファイルを取得するマクロです。使い方は、大きく2つあります。
1番目は、取得した構造をワークシートに出力します。行方不明になったファイルをExcelの検索機能を使用して探すなど、まあ、便利に使っています。
2番目は、別のマクロに仕込んでフォルダー内のすべてのファイルに対して、処理を行うときに使います。特定のフォルダ内をくまなく検索し、全てのファイルに対して処理することができます。使用方法としては、以下のようなケースが考えられます。
●すべてのファイル名の変更:ファイル名の先頭に作成日時をつける、とか
●すべてのファイルの特定のセルの値を取得し、一つのファイルにまとめる:売り上げの集計、とか
●すべてのファイルの全てのシートを一つのファイルにまとめる:営業日報の集約、とか
汎用性が高く、いろいろなマクロに仕込んで10年以上使用していますが、特に問題もなく、信頼のおけるマクロです。
ちなみに、このマクロの原型は、以前お世話になっていた会社のNAS更新時に、古いファイルの整理の必要があり、ファイルの最終更新日を確認し、新しいファイルは新NASへ、それ以外はローカルへ保存するために作成しました。ツリー構造はログとして、一覧はファイルの最終更新日の確認・移動のために使用しました。この「Folder Navigator.xlsm」は、その時のマクロの必要部分のみ取り出しています。
少し専門的な話になりますが、このマクロが、全てのフォルダ・ファイルを取得できるのは、再起処理を使っているからです。再起処理とは、プログラム(マクロ)が自分自身を呼び出すことが大きな特徴です。たとえば、5の階乗(5!=5×4×3×2×1=120)を計算するプログラムを考えます。以下のコードをご参照ください。
Function Factorial(n As Integer) As Currency
Dim Fact As Currency
'再起処理を解りやすくするために、変数 Fact を使用する
If n = 0 Then
Fact = 1
Else
Fact = n * Factorial(n - 1)
End If
Factorial = Fact
End Function
Sub CalculateFactorial()
Dim num As Integer
Dim result As Currency
' 階乗を計算する数を入力
num = InputBox("階乗を計算する数(17以下)を入力してください")
' 階乗を計算
result = Factorial(num)
' 結果を表示
MsgBox num & " の階乗は " & result & " です。"
End Sub
「CalculateFactorial」のSubプロシージャがメインのプロシージャです。このプロシージャを実行するとファンクションプロシージャ「Factorial」が呼び出されます。「Factorial」内で自分自身「Factorial」を呼び出します。「Fact = n * Factorial(n – 1)」の部分です。与えられたnから1を引いた数を引数として自分自身を呼び出しています。ツールとして使用するには、18以上でオーバーフローしますので、そのあたりの工夫が必要です。
「Folder Navigator.xlsm」では「今いるフォルダ内にフォルダがあれば、自分自身を呼びだして、その子フォルダ内を検索する。なければ、一つ上のフォルダへ戻る。」このようなイメージですべてのフォルダを検索しています。
「Folder Navigator.xlsm」を使ってみましょう
Ctrl+m(コントロールキーを押したまま、mを押す)と以下の3個のコマンドボタンが含まれるメニューが表示されます。
「1.フォルダーの構造を取得し、ツリーで出力する。」
「2.フォルダーとファイルを取得し、ツリーで出力する。」
「3.フォルダーとファイルを取得し、リストで出力する。」
それぞれのボタンを押すと、ファイル選択のダイアログが表示されますので、取得したいフォルダを指定してください。なお、アクティブシートに強制的に上書きしますので、ご利用の際には、十分注意してください。別のブックを開いている状態だと、思わぬ上書きをしてしまうこともあり得ますので、「Folder Navigator.xlsm」だけを開いている状態で使用してください。
※ゴミ箱は回避する仕様になっています。
※エラー処理はしていません。(多分、必要ないと思います。)
※マクロが使用できないなど、うまく動かない場合は、Googleで検索してみてください。
※マクロには保護をかけてあります。
※ダウンロード・ご利用に際しては、「ご利用に関して」をご理解の上、自己責任といたします。
コメント