アプリっぽい操作感でファイルを選べるマクロを組みたい!
FileDialogを使ってみましょう!
マクロで処理するファイルは、ユーザーが直感的に選べると親切!
FileDialogを使えば、あなたの組んだExcelマクロがよりアプリっぽい動作をするようになります。
【マクロの完成イメージ】ボタンクリックだけでファイルを選べる
今回紹介するマクロは、こんなことができます。
- ボタンクリックで、ダイアログを呼び出してファイルを選択する。
- 選んだファイルのフルパスをセルに書き出す。
イメージはこんな感じ。
- 1[参照]ボタンをクリック
- 2ファイル選択ダイアログが開く
- 3選択したファイルのフルパスをセルに格納する
なぜ、ファイルのフルパスを取得するマクロが必要なのでしょう?
Excelマクロでファイルを操作するには、対象ファイルのフルパスが必須だからです。
フルパスとは?ファイルにたどり着くまでの経路(Path)を示しています。最上流のドライブ名からスタートして、途中のフォルダを経由し、目的のファイルまでたどります。フォルダ名は「¥」マークで区切られます。
VBAではファイル名だけ指定しても動かないことがほとんどです。
あらかじめ対象ファイルのフルパスを取得しておくと、次のような処理を楽に実装できます。
- ファイル名のチェック
- 後から呼び出してファイルを開く
- ファイルをWorkbookのオブジェクトに格納
では、具体的なFileDialogの使い方を解説します。
FileDialog:ダイアログでファイル操作する
ファイル選択ダイアログは、このような画面を指します。
Windowsのアプリではお馴染みの画面です。
これもExcelマクロから呼び出せます。
FileDialogの呼び出し方
FileDialogは、次のような書き方で呼び出すのが基本。
'ファイルを開くダイアログ
With Application.FileDialog(msoFileDialogFilePicker)
'ダイアログを表示
If .Show = True Then
'ファイルが選択された場合の処理
Else
'ファイルが選択されなかった場合(キャンセル処理)
End If
End With
With構文でくくり、If文で分岐させています。
後述する細かい設定を追加したり、ファイルを選択しなかった場合の処理を想定しているためです。
FileDialogの機能は4種類
Application.FileDialog()は、引数に記述する内容で機能の使い分けができます。
- ファイルを開く
- msoFileDialogOpen
- 名前を付けて保存
- msoFileDialogSaveAs
- ファイルを選択
- msoFileDialogFilePicker
- フォルダを選択
- msoFileDialogFolderPicker
先頭の数字は機能に紐づいた「定数」です。
ファイルを選択するダイアログの場合は、こう書きます。
'ファイルを選択するダイアログの指定
With Application.FileDialog(msoFileDialogFilePicker)
あるいは、引数を定数(数字)で指定することもできます。
'ファイルを選択するダイアログを定数で指定
With Application.FileDialog(3)
「定数」で指定しておくと、
ライブラリの参照設定が不要です。
FileDialogは細かい設定ができる
FileDialogはプロパティが豊富。
最低限、次のプロパティを設定しておけばユーザーに優しいです。
- Title
- ダイアログのタイトルを変更
- InitialFileName
- ダイアログの初期フォルダを変更
- Filters
- 選べるファイルを拡張子で絞り込む
実際の書き方・解説は後述しています。
FileDialogのメソッド/プロパティの全容は、マイクロソフト公式サイトをお読みください。
【実装コード】FileDialogを関数化する
FileDialogを呼び出してファイルのフルパスを取得する関数を自作します。
GetFilePath関数と名付けました。
いろんなPCやExcelマクロで使い回せるように、次のような設計をしています。
- Public Functionで宣言
- Application.FileDialog(3) —> ダイアログの種類を定数で指定して、参照設定を不要に。
- キャンセル処理を記載
Functionに記述するコード
モジュールにそのままコピペして使えます。
'ファイル選択ダイアログ: ファイルパスを取得する
Public Function GetFilePath() As String
'ファイルを開くダイアログ
With Application.FileDialog(3) 'msoFileDialogFilePicker: 3
'ダイアログのタイトルを設定
.Title = "ファイルパスの取得"
'選べるファイルの種類を設定
.Filters.Clear
.Filters.Add "Excelファイル", "*.xlsx; *.xlsm"
'初期パス: このマクロブックの場所
.InitialFileName = ThisWorkbook.Path
'ダイアログを表示: ファイルが選択された場合
If .Show = True Then
'選択したファイルのフルパスを返す
GetFilePath = .SelectedItems.Item(1)
Else 'ファイルが選択されなかった場合(キャンセル処理)
'空白を返す
GetFilePath = ""
End If
End With
End Function
FileDialogプロパティの解説
関数内で使用しているFileDialogのプロパティについて解説します。
Titleプロパティ
'ダイアログのタイトルを設定
.Title = "ファイルパスの取得"
何のためのダイアログか、タイトルを付けておきましょう。
ファイル選択ダイアログのタイトルを指定しています。
Fitersプロパティ
'選べるファイルの種類を設定
.Filters.Clear
.Filters.Add "Excelファイル", "*.xlsx; *.xlsm"
ダイアログで選択できるファイルの種類を拡張子で絞り込みます。
この場合は、Excelワークブック(xlsx)と、Excelマクロ有効ワークブック(xlsm)のみ表示しています。
処理に使わないファイルは、
選べないようにしておくのが親切!
InitialFileNameプロパティ
'初期パス: このマクロブックの場所
.InitialFileName = ThisWorkbook.Path
ダイアログを開いたときに表示する最初のフォルダを指定しています。
この場合は、マクロを動かしているブックが入っているフォルダが最初に開きます。
Showプロパティ
'ダイアログを表示: ファイルが選択された場合
If .Show = True Then
.Showでダイアログを開きます。
同時に、[開く]ボタンがクリックされた(True)か、キャンセルされたか(Else)を評価して、処理を分岐させています。
SelectedItemsプロパティ
'選択したファイルのフルパスを返す
GetFilePath = .SelectedItems.Item(1)
選択されたファイルのフルパスは「.SelectedItems.Item(1)」に格納されています。
[開く]ボタンがクリックされた場合、ファイルのフルパスを変数GetFilePathに返します。
'空白を返す
GetFilePath = ""
[キャンセル]ボタンがクリックされた場合は、空白を変数GetFilePathに返します。
以上が、GetFilePath関数のコードです。
次は、GetFilePath関数を呼び出すコードを書いてみましょう。
【実装コード】FileDialogを呼び出してファイルパスを取得
GetFilePath関数を呼び出して、取得したフルパスをセルに書き出すプロシージャを記述します。
Excelワークシートの準備
マクロを正常に動かすには、次のように作成したExcelマクロ有効ワークブックを準備してください。
- シート名:[参照]
- フルパスの入力欄:セルB3〜セルG3を結合
- [参照]ボタン名:browse
[参照]ボタンとプロシージャの紐づけを忘れずに
Subに記述するコード
次のコードをモジュールにコピペしましょう。
'[参照]ボタンでファイルのフルパスを取得する
Sub Browse_Click()
'フルパスの格納先 変数
Dim targetFilePath As String
'関数を呼び出して、ファイルパスを取得する
targetFilePath = GetFilePath()
'ファイルが選択されていたら(変数が空欄でなければ)
If targetFilePath <> "" Then
'セルにファイルのフルパスを格納
ThisWorkbook.Worksheets("参照").Range("B3") = targetFilePath
End If
End Sub
解説はコード内にコメントしています
以上が、FileDialogを使ってフルパスを取得するマクロでした。
〜応用編〜 Workbookオブジェクト変数と組み合わせて、使用するファイルを一括して開く
フルパスが取得できるようになったら、いよいよワークブックを開くマクロを組みましょう。
次回の記事は応用編です。
実際の業務にありがちな、2つのファイルを同時に扱うマクロを紹介します。