目次
よく使うコードのメモです。
Excel などで、あるフォルダ以下のファイル一覧を出力したいときに使うコードです。 言語は VBA です。
VBA は オブジェクト指向的 に書くこともできるのですが、 急遽必要だったので、「とりあえず動けばいい!」というスタイルで作りました。
プログラムの流れ
- シート上のボタンをクリックします。
- フォルダ選択ダイアログを表示します。
- 選択されたフォルダ以下のファイルを再帰的にリストにします。
- リストになったファイル一覧を、フォーム(またはシート)に出力します。
やること
- モジュールを作成して、次の関数を作成します。
- ファイル一覧を取得する
- フォルダ選択ダイアログを処理する
- 結果を出力するダイアログを作る。
- シートにボタンを作ってクリックしたときの処理を追加する。
VBA で モジュールファイル を作成して 次の2種類の関数を記述します。
ファイル一覧取得
getFileAndDirectories
が ファイル一覧 を取得して 文字列 に 変換するメソッドです。 1行1ファイルで、ファイルの数だけ改行されます。 フォルダの区切り文字は “/
” になっていますが パラメータにして可変にするのもありです。 (仕事の都合上 “/
” になっています。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
Public Function getFileAndDirectories( _ ByVal folderPathString$, _ Optional ByVal prefixString$ = "") As String Dim fso As Object Dim fol As Object Set fso = CreateObject("Scripting.FileSystemObject") Set fol = fso.GetFolder(folderPathString) Dim resultString$ resultString = "" If prefixString <> "" Then prefixString = prefixString & "/" End If For Each fil In fol.Files resultString = resultString & prefixString & fil.Name & vbNewLine Next Dim sfol As Object For Each sfol In fol.subFolders resultString = resultString & getFileAndDirectories(sfol.path, prefixString & sfol.Name) Next Set fol = Nothing Set fso = Nothing Set sfol = Nothing getFileAndDirectories = resultString End Function |
フォルダ選択
先の関数でファイル一覧を取得するのですが、どのフォルダ以下のファイル一覧を取得するのか決めなければいけません。 そこでフォルダを選択するためのメソッドです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Public Function OpenFolderDialog(Optional ByVal title$ = "フォルダ選択") As String Dim FolderDlg As Office.FileDialog Dim NewFolderPath As String Dim Result As Integer NewFolderPath = "" Set FolderDlg = Application.FileDialog(msoFileDialogFolderPicker) With FolderDlg .AllowMultiSelect = False .title = title End With Result = FolderDlg.Show() If Result = -1 Then NewFolderPath = FolderDlg.SelectedItems(1) End If Set FolderDlg = Nothing OpenFolderDialog = NewFolderPath End Function |
ここまででモジュールの編集は終了です。
実行結果の出力フォーム
実行結果を出力するフォームを作成します。
ここではフォームにひとつだけ TextBox
を配置した textViewForm
に結果を出力するものとして話を進めます。 TextBox
は 複数行を扱えるようにするなど、 適宜プロパティを調整してください。
出力する結果はテキストデータなので、 シートに直接出力することもできます。
ここからはシート上にボタンを配置し、クリックした時に処理を開始するようにしていきます。
シートにボタン設置
シートにボタンを設置してください。 そして下のコードを追加して、 シートのボタンからファイル一覧を取得できるようにします。 エラーハンドリングが完全ではありませんので注意してください。
1 2 3 4 5 6 7 8 |
Private Sub listFiles_Click() Dim path As String path = OpenFolderDialog("フォルダを選択してください。") textViewForm.outputTextBox.text = getFileAndDirectories(path) textViewForm.Show End Sub |