この記事では、ExcelVBAでFileDialogを利用してファイル選択ダイアログを表示し、選択したファイルのパスを取得する方法について説明しています。
FileDialogは、すでに存在しているファイルを選択したい時に使える便利な機能です。
例えば、なにかしらのデータが入力されているファイルを選択し、そのファイルのパスを入手する時に使えます。
その入手したファイルパスをもとに、FileSystemObjectライブラリを利用して実際にそのファイルのデータを読み込むことができます。
FileSystemObjectの使い方については、以下の記事をご覧ください。
【VBA入門】FileSystemObjectを使ってテキストファイルを読み込む
【VBA入門】FileSystemObjectを使ってテキストファイルへ書き込む
【VBA入門】FileSystemObjectを使ってファイルを削除する
FileDialogには、以下の4つのダイアログモードがあります。
- すでに存在するファイルを選択できるダイアログ(今回の記事で説明)
- すでに存在するフォルダを選択できるダイアログ
- すでに存在するファイルを選択し、そのまま開くことができるダイアログ
- これから保存したいファイル名を指定できるダイアログ
また、FileDialogには他にも設定変更できるオプションがあります。
- 複数のファイルを選択できる、できない(AllowMultiSelect)
- 選択できるファイルの種類を限定する(Filters)
- ダイアログに初期表示するフォルダパス(InitialFileName)
- ダイアログに表示するタイトル(Title)
上記のオプションを利用することにより、ファイル選択の効率化が実現できます。
それでは、ファイル選択ダイアログの利用方法について、説明していきます。
もくじ
今回作成するツール画面(ファイル選択ダイアログ)
それでは、今回作成するツール画面は、以下です。
ファイル選択ダイアログに指定するオプションを5つ指定可能となっています。
- 初期フォルダパス → ファイル選択ダイアログ起動時に表示するフォルダパスを指定します。
- ダイアログタイトル → ファイル選択ダイアログのタイトルに表示するメッセージを指定します。
- ファイルタイプ → ファイル選択ダイアログで選択可能とするファイルタイプを指定します。
- ファイル拡張子 → ファイル選択ダイアログで選択可能とするファイル拡張子を指定します。
- 複数ファイル選択 → ファイル選択ダイアログで複数ファイル選択可能とするか、1つのファイルのみ選択可能とするか指定します。
ファイル選択ダイアログで選択されたファイルのパスは、B7セル以降に表示されます。
それでは、ファイル選択ツールの作成方法を説明していきます。
メインシートの作成方法(指定オプションと選択ファイル表示欄)
ファイル選択ツールのオプションと選択されたファイルを表示させる欄を作成していきます。
- 「メイン」という名前のシートを作成します。
- A1セルに「初期フォルダパス」のタイトル欄を作成します。
- B1セルに「初期フォルダパス」の入力欄を作成します。
- A2セルに「ダイアログタイトル」のタイトル欄を作成します。
- B2セルに「ダイアログタイトル」の入力欄を作成します。
- A3セルに「ファイルタイプ」のタイトル欄を作成します。
- B3セルに「ファイルタイプ」の入力欄を作成します。
- A4セルに「ファイル拡張子」のタイトル欄を作成します。
- B4セルに「ファイル拡張子」の入力欄を作成します。
- A5セルに「複数ファイル選択」のタイトル欄を作成します。
- B5セルに「複数ファイル選択」の入力欄を作成します。
- B6セルに「選択されたファイル」のタイトル欄を作成します。
メインシートは、以上です。
ファイル選択ダイアログの指定オプションの入力内容の説明
それでは、5つの指定オプションの入力内容について説明します。
初期フォルダパス
フォルダパスを入力します。
例えば、以下のような文字列を入力します。
- C:\TEST\AAA
- C:\TEST\BBB
- C:\TEST\CCC
指定するファイルが存在するフォルダやその近くのフォルダを指定すると良いです。
なぜなら、フォルダ階層をたどっていく時間を短くできるからです。
ダイアログタイトル
ダイアログタイトルとは、以下の画像の赤枠で囲んだ部分に表示される文字列のことです。
利用者にどのようなファイルを選択して欲しいかが伝わりやすい文字列を指定しましょう。
「ダイアログタイトル」(B2セル)になにも入力しなかった場合、「ファイルを開く」が表示されます。
ファイルタイプ
ファイルタイプとは、以下の画像の赤枠で囲んだ部分に表示される文字列のことです。
利用者が直感的に伝わるファイルの種類を入力しましょう。
例えば、以下のような文字列です。
- Excelファイル
- CSVファイル
- テキストファイル
「ファイルタイプ」(B3セル)になにも入力しなかった場合、ファイルタイプの文字列が表示されないだけで、ファイル選択ダイアログの動きとしては特に支障はありません。
ファイル拡張子
ファイル拡張子とは、ファイル名の末尾についている.xlsや.xlsxなどのことです。
必要ないファイルを表示しないようにし、目的にファイルをみつけやすくするために指定します。
ファイル拡張子は、「*.xls」や「*.xlsx」のように指定します。
また、複数のファイル拡張子を指定する場合、「*.xls;*.xlsx」のように「;(セミコロン)」で区切って指定します。
指定できる拡張子の例は、以下です。
- EXCELファイル(旧形式) → *.xls
- EXCELファイル → *.xlsx
- テキストファイル → *.txt
- CSVファイル → *.csv
なんでも選択可能にする場合は、「*.*」と指定します。
以下は、「*.*」を指定したときの例です。
CSVファイル、TXTファイル、エクセルファイルなど多くのファイルが表示されています。
複数ファイル選択
ファイル選択ダイアログで、複数のファイル選択を「許可する」か「許可しない」かを指定します。
「許可する」を指定した場合、複数ファイルが選択可能になります。
「許可する」以外を指定した場合、1つのファイルのみ選択可能になります。
以下の画像は、複数ファイルを選択可能にした場合の例です。
ファイル選択ダイアログ上で、エクセルファイルが3つ選択されています。
「ファイル名」欄に、選択されたファイル名が表示されます。
ファイル選択ダイアログを表示するVBAプログラムの作り方
それでは、「ファイル選択ダイアログ」を表示するVBAプログラムを作成します。
「メイン」シートで指定されたオプションを利用して、「ファイル選択ダイアログ」を表示させます。
開発タブの「Visual Basic」をクリックして、「Microsoft Visual Basic for Applications」を起動します。
「Microsoft Visual Basic for Applications」にVBAプログラムを入力します。
標準モジュールを追加して、以下のソースを書きます。
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
Public Sub Main_Proc() Dim sht As Worksheet Dim iniFolder As String Dim dialogTitle As String Dim fileType As String Dim fileExt As String Dim multiSelect As String Dim iReturn As Integer Dim maxRow As Integer Dim maxFile As Integer Dim i As Integer '1.メインシートを変数に格納する Set sht = ThisWorkbook.Sheets("メイン") '2.指定された設定を変数に格納する iniFolder = sht.Cells(1, 2) dialogTitle = sht.Cells(2, 2) fileType = sht.Cells(3, 2) fileExt = sht.Cells(4, 2) multiSelect = sht.Cells(5, 2) '3.初期フォルダパスの末尾に\を付加する If iniFolder <> "" Then If Right(iniFolder, 1) <> "\" Then iniFolder = iniFolder & "\" End If End If '4.データが入力されているB列の最終行を取得する maxRow = sht.Cells(sht.Rows.Count, 2).End(xlUp).Row '5.B列の7行目以降をクリアする If maxRow >= 7 Then sht.Range(sht.Cells(7, 2), sht.Cells(maxRow, 2)).ClearContents End If With Application.FileDialog(msoFileDialogFilePicker) '6.初期フォルダパスを指定する .InitialFileName = iniFolder '7.ダイアログのタイトルを設定する .Title = dialogTitle If fileExt <> "" Then '8.ファイルタイプ、ファイル拡張子のデフォルトをクリアする .Filters.Clear '9.ファイルタイプ、ファイル拡張子を追加する .Filters.Add fileType, fileExt End If '10.複数ファイル選択の許可設定をする If multiSelect = "許可する" Then .AllowMultiSelect = True Else .AllowMultiSelect = False End If '11.ファイル選択ダイアログを表示する(キャンセル押下→0、選択ボタン押下→-1) iReturn = .Show 'ファイルが選択された場合 If iReturn <> 0 Then '12.選択ファイル数を取得する maxFile = .SelectedItems.Count '13.選択ファイルパスをメインシートに出力する For i = 1 To maxFile sht.Cells(6 + i, 2) = .SelectedItems(i) Next End If End With MsgBox "完了" End Sub |
最後にEXCELを「◯◯◯.xlsm」というような感じでマクロ有効ブック形式で保存します。
ファイル選択ダイアログを表示する機能の使い方
それでは、ファイル選択ダイアログを表示する機能の使い方を説明します。
「メイン」シートの以下に好きな値を入力します。
- B1セル → 初期フォルダパス
- B2セル → ダイアログタイトル
- B3セル → ファイルタイプ
- B4セル → ファイル拡張子
- B5セル → 複数ファイル選択
次に、開発タブの「マクロ」をクリックします。
「Main_Proc」を選択して、「実行」ボタンをクリックします。
指定されたオプション通りに、「ファイル選択ダイアログ」が表示されます。
複数ファイル選択で「許可する」を選択しているので、複数ファイル選択可能になっています。
上記画像では、「202205.xlsx」と「202206.xlsx」を選択しています。
連続していないファイルを複数選択する場合は、CTRLボタンを押しながらファイルを選択します。
連続したファイルの場合は、CTRLボタンを押す必要はありません。
上記の状態で、OKボタンを押すと、以下の画像のように選択したファイルがB7セル以降に表示されます。
ファイル選択ダイアログを表示する機能のVBAプログラムの説明
それでは、「ファイル選択ダイアログ」を表示する機能のVBAプログラムについて、1つ1つ説明していきます。
①メインシートを変数に格納する
1 2 |
'1.メインシートを変数に格納する Set sht = ThisWorkbook.Sheets("メイン") |
そうすることにより、入力するプログラムを短くすることができるからです。
何度も「ThisWorkbook.Sheets(“メイン”)」と入力するより、「sht」と入力するほうがコードが少なくてよいからです。
また、シート名「メイン」を変更した場合も、VBAプログラムの1ヶ所を修正するだけで対応可能になります。
②指定された設定を変数に格納する
1 2 3 4 5 6 |
'2.指定された設定を変数に格納する iniFolder = sht.Cells(1, 2) dialogTitle = sht.Cells(2, 2) fileType = sht.Cells(3, 2) fileExt = sht.Cells(4, 2) multiSelect = sht.Cells(5, 2) |
具体的には、以下のオプションを変数に格納しています。
- 1行目の2列目のセル → B1セル(初期フォルダパス)
- 2行目の2列目のセル → B2セル(ダイアログタイトル)
- 3行目の2列目のセル → B3セル(ファイルタイプ)
- 4行目の2列目のセル → B4セル(ファイル拡張子)
- 5行目の2列目のセル → B5セル(複数ファイル選択)
③初期フォルダパスの末尾に\を付加する
1 2 3 4 5 6 |
'3.初期フォルダパスの末尾に\を付加する If iniFolder <> "" Then If Right(iniFolder, 1) <> "\" Then iniFolder = iniFolder & "\" End If End If |
ただし、「初期フォルダパス」が指定されており、末尾が\でないときのみです。
以下の画像は、「初期フォルダパス」に指定されたフォルダパスの末尾に\を付加しなかった場合に、表示される「ファイル指定ダイアログ」です。
フォルダ名が「ファイル名」に表示される赤い枠で囲ったところを見てください。
「data」と表示されています。
具体的には、「D:\200_work\200_data\data」の最後のフォルダ名「data」が表示されています。
フォルダパスの末尾が\でない場合、最後のフォルダ名をファイル名と勘違いしてしまうからです。
そうならないために、指定されたフォルダパスの末尾を確認し、末尾が\でない場合は\を付加するようにしています。
④データが入力されているB列の最終行を取得する
1 2 |
'4.データが入力されているB列の最終行を取得する maxRow = sht.Cells(sht.Rows.Count, 2).End(xlUp).Row |
なぜなら、ファイル選択ダイアログを1度実行すると、B7セル以降に選択されたファイルのパスが表示されているからです。
前回実行したときのファイルパスを消去するために、データが入力されているB列の最終行を取得しています。
⑤B列の7行目以降をクリアする
1 2 3 4 |
'5.B列の7行目以降をクリアする If maxRow >= 7 Then sht.Range(sht.Cells(7, 2), sht.Cells(maxRow, 2)).ClearContents End If |
最終行が7行目以降の場合、7行目以降から最終行までのB列のセルに入力されている値をクリアしています。
⑥初期フォルダパスを指定する
1 2 3 4 |
With Application.FileDialog(msoFileDialogFilePicker) '6.初期フォルダパスを指定する .InitialFileName = iniFolder |
具体的には、「メイン」シートのB1セルに入力されているフォルダパスを指定しています。
⑦ダイアログのタイトルを設定する
1 2 |
'7.ダイアログのタイトルを設定する .Title = dialogTitle |
具体的には、「メイン」シートのB2セルに入力されているダイアログタイトルを指定しています。
⑧ファイルタイプ、ファイル拡張子のデフォルトをクリアする
1 2 3 4 |
If fileExt <> "" Then '8.ファイルタイプ、ファイル拡張子のデフォルトをクリアする .Filters.Clear |
ただし、「メイン」シートのB4 セルの「ファイル拡張子」が入力されている時のみです。
つまり、「ファイル拡張子」が入力されていない時は、「ファイル選択ダイアログ」オブジェクトにデフォルトで設定されているファイルタイプおよびファイル拡張子を利用します。
⑨ファイルタイプ、ファイル拡張子を追加する
1 2 |
'9.ファイルタイプ、ファイル拡張子を追加する .Filters.Add fileType, fileExt |
具体的には、「メイン」シートのB3セルおよびB4セルに入力されているファイルタイプとファイル拡張子を指定しています。
⑩複数ファイル選択の許可設定をする
1 2 3 4 5 6 |
'10.複数ファイル選択の許可設定をする If multiSelect = "許可する" Then .AllowMultiSelect = True Else .AllowMultiSelect = False End If |
複数ファイル選択を許可する場合は、Trueを設定しています。
複数ファイル選択を許可しない場合は、Falseを設定しています。
具体的には、「メイン」シートのB5セルの値が「許可する」の場合、Trueを設定しています。
「許可する」以外の場合、Falseを設定しています。
⑪ファイル選択ダイアログを表示する
1 2 |
'11.ファイル選択ダイアログを表示する(キャンセル押下→0、選択ボタン押下→-1) iReturn = .Show |
「ファイル選択ダイアログ」の戻り値を変数に格納します。
具体的には、「ファイル選択ダイアログ」で「開く」ボタンを押された場合、変数に-1が格納されます。
「キャンセル」ボタンを押された場合、変数に0が格納されます。
⑫選択ファイル数を取得する
1 2 3 4 5 |
'ファイルが選択された場合 If iReturn <> 0 Then '12.選択ファイル数を取得する maxFile = .SelectedItems.Count |
戻り地が0でない時は、ファイルが選択された時です。
⑬選択ファイルパスをメインシートに出力する
1 2 3 4 |
'13.選択ファイルパスをメインシートに出力する For i = 1 To maxFile sht.Cells(6 + i, 2) = .SelectedItems(i) Next |
具体的には、「メイン」シートのB7セル以降に、ファイルパスを出力します。
「ファイル選択ダイアログ」を表示する方法を説明しました。
また、選択されたファイルパスを取得して、シートに出力させる方法も説明しました。
「ファイル選択ダイアログ」を利用すると、ファイル選択を素早く間違いなく行うことができるようになります。
「ファイル選択ダイアログ」を利用してみてください。
以上です。
最後まで読んでいただきありがとうございました。
この記事をシェアしていただけると喜びます。