ファイルを選んで、そのファイルに何らかの編集やマクロの適用などをしたいときに使うファイルダイアログですが
今回は、ダイアログを開く方法に加え、デフォルトで表示する拡張子を指定したり等自由にカスタマイズできる部分についても解説していきたいと思います。
目次
ソースコード
引数に行と列を指定することで特定のセルにダイアログで選択したファイルのアドレスを出力します。
既にセルにアドレスがある場合は、そのファイルを選択した状態でダイアログが開きます。ネットワークドライブでも有効なのでいちいちマイドキュメント等に戻される手間を回避できます。
ボタンに登録するときには、'SelectFile 2,2'のようにします。
Sub SelectFile(ByVal wRow As Integer, ByVal wCol As Integer) Dim OpenFile As String Dim FSO As New Scripting.FileSystemObject ThisWorkbook.ActiveSheet.Cells(wRow, wCol).Select OpenFile = ActiveCell.Value With Application.FileDialog(msoFileDialogFilePicker) .Filters.Clear .Filters.Add "すべてのファイル", "*.*" .Filters.Add "Excel ブック", "*.xlsx" .Filters.Add "Excel マクロ有効ブック", "*.xlsm" .Filters.Add "Excel 97-2003 ブック", "*.xls" .FilterIndex = 1 .AllowMultiSelect = False If FSO.FileExists(OpenFile) = True Then .InitialFileName = OpenFile End If If .Show = True Then ActiveCell.Value = .SelectedItems(1) End If End With End Sub
フィルターの設定
ファイルを選択する際にプルダウンメニューから選択できるフィルターです。
Filters.Clearでフィルターを初期化し、Filters.Addで追加していきます。
最後にFilterIndexでダイアログを開いた時、デフォルトで設定するフィルターを選択します。
With Application.FileDialog(msoFileDialogFilePicker) .Filters.Clear .Filters.Add "すべてのファイル", "*.*" .Filters.Add "Excel ブック", "*.xlsx" .Filters.Add "テキストファイル", "*.txt" .FilterIndex = 1 End With
単一ファイル選択または複数ファイル選択
AllowMultiSelectがFalseなら単一ファイル選択、
AllowMultiSelectがTrueなら複数ファイル選択です。
今回は特定セルに出力しているので単一ファイルとしていますが、
場合によっては複数ファイル選択して処理しても良いでしょう。
With Application.FileDialog(msoFileDialogFilePicker) .AllowMultiSelect = False End With
初期選択ファイルを設定(前回のファイルを参照)
InitialFileNameにフルパスを指定することで、ファイルを選択した状態でダイアログを開くことができます。
さらにそのファイルのあるフォルダまで遷移した状態になります。
フルパス(前回の情報)をどこかに保存しておく必要がありますが、再選択にかかる時間を削減できるとても便利な機能です。
※ファイルが削除・移動などされている可能性を考慮し、FilesystemobjectのFileExistsでファイルの存在を再確認しましょう。
With Application.FileDialog(msoFileDialogFilePicker) If FSO.FileExists(OpenFile) = True Then .InitialFileName = OpenFile End If End With
選択したファイルを取得する
ダイアログで選択したファイルをセルへ出力するには以下のようにします。
Showでダイアログの表示を確認し、SelectedItemsから選択したファイル情報を取得します。
With Application.FileDialog(msoFileDialogFilePicker) If .Show = True Then ActiveCell.Value = .SelectedItems(1) End If End With
参照設定
使用の際には以下参照設定が必要となります。CreateObjectでも代用可能です。
(開発タブ>Visual Basic>ツール(T)>参照設定)
・Microsoft Scripting Runtime

検証環境
Microsoft Office Excel 2010 および 2016で検証しています。