F0000021_ファイルダイアログを開き、複数の任意のファイルを選択させる

ファイルダイアログを開き、複数の任意のファイルを選択させる 関数リファレンス

この関数について

csvファイルを開くときのアプリケーションとしてデフォルトでExcelを選択している方は多いです。私のツールのユーザーを見ると、Excelとcsvとは同じデータだとして扱っている方が多いように感じます。例えば、基幹システムからデータ抽出するときにファイル形式をcsvかExcelかを選択できる会社があるとして、基幹システムから抽出したデータをExcelVBA(マクロ)に読み込み、加工・集計するというRPAツールを考えるとき、開発者である皆さんはcsvとExcelは明確に別物であると理解しているため、「csvファイルを選択する」よう説明文を入れればユーザーは素直に指示に従ってくれるように思うかもしれません。しかしそんなことはありません。「csvファイルのみ」という制限は理解されず、ファイルが表示されないという問い合わせを生みます。最初からcsvファイルもExcelファイルも選択できるように設計することがベターです。前置きが長くなりましたが、この関数はファイルダイアログを表示しマクロの実行者が選択した複数のファイルの絶対パスを取得することができます。

使い方 ①引数

■引数1:title
 ファイルダイアログに表示するタイトルを指定できます。下記画像を参照

■引数2:initial_folder_path
 ファイルダイアログが表示されたときにデフォルトで開くフォルダを指定できます。

■引数3:var_type_code
 ファイルパスが格納された配列(返値)の型を指定できます。「vbString」「vbVariant」のいずれか。それ以外を指定してもVariant型で返します。指定しない場合のデフォルトはString型です。

■引数4:based_index
 ファイルパスが格納された配列(返値)の最小のインデックス(添え字)を指定できます。指定しない場合のデフォルトは1です。

使い方 ②返値

マクロ実行者がファイルを選択した場合、ファイルの絶対パスを配列に格納して返します。選択しなかった場合、未定義の配列を返します。そのため、返値の配列が初期化されているか調べる(F0000010)ことで選択したかどうかを判定できます。

使い方 ③呼び出し方例(サンプルコード)

Public Sub Test_OpenFileDialogAnythingMulti()

Dim wb As Workbook
Dim file_path() As String
Dim extension_str As String
Dim cnt As Long, i As Long

file_path = OpenFileDialogAnythingMulti("ファイルをすべて選択する", ThisWorkbook.Path)
If IsInitArray(file_path) Then
cnt = 0
For i = LBound(file_path, 1) To UBound(file_path, 1) Step 1
extension_str = Mid(file_path(i), InStrRev(file_path(i), "."))
Select Case extension_str
Case ".csv"
'■なにか処理
Case ".xlsx", ".xls", ".xlsm"
'■なにか処理
Case Else
cnt = cnt + 1
End Select
Next i
Call MsgBox(cnt & "個のcsvとExcel以外のファイルが検出されました。", vbInformation)
Else
Call MsgBox("ファイルが選択されませんでした", vbInformation)
End If

End Sub

'■配列が初期化されているか調べる(F0000010)
Public Function IsInitArray(ByRef arr As Variant) As Boolean
On Error GoTo UnDefined

IsInitArray = IsNumeric(UBound(arr, 1))
Exit Function

UnDefined:

IsInitArray = False

End Function

【結果】複数のファイルの絶対パスを取得できました

サンプルコードを実行すると、選択したファイルのうち、「csvファイル」もしくは「Excelファイル」ではないファイルの数を数えてメッセージを表示します。実務では、意図しないファイルが選択された場合、数を数えるのではなく処理をスキップしたり、警告して終了したりするようにします。

この関数は関数リファレンスからコピペ可能です!

この記事のタイトルを検索窓へ貼り付けて関数を検索してみましょう。 表示されたコードをクリックするだけでコピー完了! あとは自身で作成したモジュールに貼り付けるだけでこの関数を利用できます。サンプルコードもあり! 関数リファレンストップへ

Comment