ダイアログボックスを開いてユーザーにファイルを選択してもらう際、
複数のファイルを一括で選択できるダイアログを表示する方法を解説します。
GetOpenFilenameメソッドを使用する方法と、
FileDialogオブジェクトを使用する方法の2種類があります。
GetOpenFilenameメソッドの方がコードが簡単ですので、
基本はこちらを使っておけばOKです。
FileDialogオブジェクト限定の機能が必要になった場合にこちらを使用してください。
詳しい使い方と機能の違いはこちらの記事をセットでどうぞ。
www.limecode.jp
GetOpenFilenameメソッド
サンプルコード
' ダイアログボックスで複数のファイルを選択してもらう Dim Arr処理ファイルパス As Variant Arr処理ファイルパス = Application.GetOpenFilename( _ FileFilter:="Excelファイル,*.xls*", _ Title:="処理ファイルをすべて選択してください。", _ MultiSelect:=True) ' キャンセルを押された場合は処理を中止 If Arr処理ファイルパス = False Then Exit Sub ' 選択されたすべてのファイルに処理を実行 Dim path処理ファイル For Each path処理ファイル In Arr処理ファイルパス ' ここに各ファイルへの処理 Dim wb処理ブック As Workbook Set wb処理ブック = Workbooks.Open(path処理ファイル) Next
解説
GetOpenFilenameメソッドの引数MultiSelectにTrueを渡すことで、
複数選択可能なダイアログを表示させることができます。
この時のダイアログはCtrlキーを押しながらの複数選択や、
Shiftキーを押しながら一括選択を行うことが可能です。
結果値には選ばれたファイル群のファイルパスの配列が返されます。
配列の要素には文字列が入ることしかありませんが、
型自体はVariant型の配列である点にご注意ください。
ダイアログがキャンセルされた場合はFalseが返りますので、
受け取る変数はVariant型で受け取っておくのが良いでしょう。
GetOpenFilename(MultiSelect)のありがたい仕様として、
Trueを渡した場合は選択が1ファイルでも結果が配列になります。
もし「1ファイルの場合は返り値がStringの単独値」だったとしたら、
そのための分岐も書かなければいけなかったところです。
この仕様にしていただいて感謝ですね。
FileDialogオブジェクト
ファイルをダイアログボックスから選択する方法には、
FileDialogオブジェクトを使用する方法もあります。
こちらの方が高機能ですが、コードが多少複雑です。
カレントディレクトリを変更せずに初期表示フォルダを指定したり、
実行ボタンテキストやフォルダの表示形式を変えたい場合はこちらをご利用ください。
サンプルコード
With Application.FileDialog(msoFileDialogFilePicker) ' 初期表示フォルダ .InitialFileName = ThisWorkbook.Path ' ファイルの種類 .Filters.Clear .Filters.Add "Excelファイル", "*.xlsx" .Filters.Add "Excelファイル", "*.xls" .Filters.Add "Excelファイル", "*.xlsm" ' ダイアログのタイトル .Title = "処理するファイルを選択してください。" ' 複数選択を許可 .AllowMultiSelect = True ' ダイアログを表示してファイルパスを取得(キャンセルはExit) Dim ユーザー指定ファイルパス As String If .Show = False Then Exit Sub ' 選択されたすべてのファイルに処理を実行 Dim path処理ファイル For Each path処理ファイル In .SelectedItems ' ここに各ファイルへの処理 Dim wb処理ブック As Workbook Set wb処理ブック = Workbooks.Open(path処理ファイル) Next End With
解説
FileDialogオブジェクトで複数選択ダイアログを開く場合は、
AllowMultiSelectプロパティをTrueにしてからShowを実行します。
といいつつ実はこのプロパティは規定がTrueのため、
普段から複数選択ができるダイアログが開いていたりします。
よって省略しても複数選択できるダイアログは開くのですが、
複数選択を明示した方が読みやすいため書いておきましょう。
FileDialogオブジェクトは選択結果が元々コレクションになっており、
単独選択時でも
ユーザー指定ファイルパス = .SelectedItems(1)
と、(1)を書いて結果を取得していました。
これが複数になってもこのSelectedItemsをForEachするだけなので、
ほとんどコードは変わらないですね。
GetOpenFilenameメソッドの方がコードが簡単ですので、
基本はあちらを使っておけばOKです。
FileDialogオブジェクト限定の機能が必要になった場合はこちらを使用してください。
詳しい違いについてはこちらの記事をどうぞ。
www.limecode.jp