[ファイルを開く]ダイアログボックスを表示して、ユーザーが選択したファイルを開く方法について説明します。
主に、以下の2つのメソッドを使用します。
- ApplicationオブジェクトのGetOpenFilenameメソッド
- WorkbooksコレクションのOpenメソッド
今回は、
- [ファイルを開く]ダイアログボックスを用いてファイルを開くプログラム例とその説明
- [ファイルを開く]ダイアログボックスに表示する拡張子の種類・数の変更方法
- [ファイルを開く]ダイアログボックスで複数のファイルを選択する方法
など
基本的な内容から応用的な使い方まで詳しく説明していきます。
[ファイルを開く]ダイアログボックスを用いてファイルを開くプログラム
Sub ファイルを開くダイアログボックスを用いてファイルを開く01() Dim OpenFileName As String OpenFileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xlsx") If OpenFileName <> "False" Then Workbooks.Open OpenFileName Else MsgBox "キャンセルされました" End If End Sub
上で示したプログラムの大まかな説明は以下のようになります。
これからこのプログラムがどのようにできているかを詳しく説明します。
GetOpenFilenameメソッドで[ファイルを開く]ダイアログボックスを表示する
[ファイルを開く]ダイアログボックスを表示する最も一般的な方法はApplicationオブジェクトのGetOpenFilenameメソッドです。
ApplicationオブジェクトのGetOpenFilenameメソッド以外にも
FindFileメソッド
FindDialogメソッド
Didlogsメソッド
でも[ファイルを開く]ダイアログボックスを表示することができます。
GetOpenFilenameメソッドはユーザーが指定したファイルのフルパス(絶対パス)を文字列で返します。戻り値はVariant型です。
このプログラムではString型の変数を宣言していますが、Variant型で変数を宣言してもOKです。
プログラムでは宣言した変数OpenFileNameにユーザーが指定したファイルのフルパスが格納されます。
[ファイルを開く]ダイアログボックスで「C:\Users\Desktop」にあるExcelファイル「テスト.xlsx」を選択した場合、変数OpenFileNameには、文字列『C:\Users\Desktop\テスト.xlsx』が格納されます。
[ファイルを開く]ダイアログボックスに表示するファイルの種類は、GetOpenFilenameメソッドの引数「FileFilter」で指定します。
引数「FileFilter」の書式は以下のようになります。
引数「FileFilter」には、
- ファイルフィルタ文字列
- ワイルドカード
の2種類の情報をペアにして、「,(カンマ)」で区切って指定します。
ファイルフィルタ文字列とワイルドカードには以下の情報を記載します。
- ファイルフィルタ文字列
- ワイルドカード
[ファイルを開く]ダイアログボックス右下の[ドロップダウンリスト]に表示される文字列になります。
[ファイルを開く]ダイアログボックスに表示されるファイルの拡張子が何なのかが分かるように、任意の文字列を指定します。
[ファイルを開く]ダイアログボックスに表示するファイルの拡張子を指定します。
また、[ファイルを開く]ダイアログボックス右下の[ドロップダウンリスト]に表示される文字列の後ろに「()(括弧)」があります。その「()(括弧)」の中に指定したワイルドカードが表示されます。
例えば、[ファイルを開く]ダイアログボックスに拡張子が「.xlsx」のExcelファイルだけを表示したい場合、引数「FileFilter」は以下のように記述します。
引数「FileFilter」の注意点
引数「FileFilter」に指定する文字列全体を「"”(ダブルコーテーション)」で囲ってください。
【誤】FileFilter:= “ファイルフィルタ文字列” , “ワイルドカード”
上のようにファイルフィルタ文字列とワイルドカードを個別に「"”(ダブルコーテーション)」で囲むとエラーとなります。
GetOpenFilenameメソッドだけではファイルを開くことはできない
GetOpenFilenameメソッドの[ファイルを開く]ダイアログボックスでは、ユーザーが指定したファイルのフルパスを文字列で返すだけで、ファイルを開くことはできません。
ファイルを開くためには、WorkbooksコレクションのOpenメソッドを用いる必要があります。
GetOpenFilenameメソッドで「キャンセル」ボタンを押された時
GetOpenFilenameメソッドでは、ユーザーが[キャンセル]ボタンを押すと「False」という値を返します。
左上の[×]ボタンでダイアログボックスを閉じた場合でも「False」が返されます。
これを利用して、7行目から11行目の
If OpenFileName <> "False" Then Workbooks.Open OpenFileName Else MsgBox "キャンセルされました" End If
において、ユーザーが[キャンセル]ボタンが押したか押さなかったかをIf文で分岐しています。
- [キャンセル]ボタンを押さなかった場合
- [キャンセル]ボタンが押された場合
WorkbooksコレクションのOpenメソッドでユーザーが指定したファイルを開きます。
MsgBoxを用いてメッセージを表示するようにしています。
GetOpenFilenameメソッドの様々な使い方
[ファイルを開く]ダイアログボックスで表示されるファイルの拡張子を選択する
プログラム例
Sub ファイルを開くダイアログボックスを用いてファイルを開く02() Dim OpenFileName As String OpenFileName = Application.GetOpenFilename(FileFilter:="Wordファイル, *.docx") If OpenFileName <> "False" Then Workbooks.Open OpenFileName Else MsgBox "キャンセルされました" End If End Sub
プログラム説明
GetOpenFilenameメソッドの引数「FileFilter」にファイルフィルタ文字列とワイルドカードを記述することで、[ファイルを開く]ダイアログボックスで表示されるファイルの拡張子を選択することができます。
例えば、ファイルフィルタ文字列とワイルドカードを
と記述することで、[ファイルを開く]ダイアログボックスで表示されるファイルの拡張子がWordファイル(*.docx)になります。
[ファイルを開く]ダイアログボックスの左上に表示される文字列を変更する
プログラム例
Sub ファイルを開くダイアログボックスを用いてファイルを開く03() Dim OpenFileName As String OpenFileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xlsx", Title:="ダイアログボックスの名前を変えられます") If OpenFileName <> "False" Then Workbooks.Open OpenFileName Else MsgBox "キャンセルされました" End If End Sub
プログラム説明
GetOpenFilenameメソッドの引数「Title」を記述することで、[ファイルを開く]ダイアログボックスの左上に表示される文字列を変更することができます。
例えば、
と記載すると、[ファイルを開く]ダイアログボックスの左上に表示される文字列は「ダイアログボックスの名前を変えられます」となります。
引数「Title」を記述しない場合はデフォルトが設定されます。デフォルトは「ファイルを開く」です。
[ファイルを開く]ダイアログボックスに表示するファイルの拡張子の数を指定する
プログラム例
Sub ファイルを開くダイアログボックスを用いてファイルを開く04() Dim OpenFileName As String OpenFileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xlsx; *.xlsm") If OpenFileName <> "False" Then Workbooks.Open OpenFileName Else MsgBox "キャンセルされました" End If End Sub
プログラム説明
引数「FileFilter」のワイルドカードを変更することで[ファイルを開く]ダイアログボックスに表示するファイルの拡張子の数を指定することができます。
- ファイルの拡張子の数を1つに指定するとき
- ファイルの拡張子の数を複数指定するとき
の書式となります。例えば、
のように記述します。
このように記述すると、[ファイルを開く]ダイアログボックスに表示される拡張子は「.xlsx」の1つのみになります。
の書式となります。1つのファイルフィルタ文字列に複数のワイルドカードを対応させるには、ワイルドカードを「;(セミコロン)」で区切って指定します。
例えば、
のように記述します。
このように記述すると、[ファイルを開く]ダイアログボックスに表示される拡張子は「.xlsx」と「.xlsm」の2種類になります。
引数「FileFilter」のワイルドカードで「?」を用いて[ファイルを開く]ダイアログボックスに表示するファイルの拡張子の数を複数にする
プログラム例
Sub ファイルを開くダイアログボックスを用いてファイルを開く05() Dim OpenFileName As String OpenFileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xls?") If OpenFileName <> "False" Then Workbooks.Open OpenFileName Else MsgBox "キャンセルされました" End If End Sub
プログラム説明
引数「FileFilter」のワイルドカードで「?」を用いることで[ファイルを開く]ダイアログボックスに表示するファイルの拡張子の数を複数にすることができます。
例えば、
と記述すると、
[ファイルを開く]ダイアログボックスに表示される拡張子は「.xls」、「.xlsx」、「.xlsm」となります。
[ファイルを開く]ダイアログボックスに表示するファイルの拡張子を切り替える
プログラム例
Sub ファイルを開くダイアログボックスを用いてファイルを開く06() Dim OpenFileName As String OpenFileName = Application.GetOpenFilename("Excelファイル,*.xlsx,全てのファイル,*.*", FilterIndex:=2) If OpenFileName <> "False" Then Workbooks.Open OpenFileName Else MsgBox "キャンセルされました" End If End Sub
プログラム説明
[ドロップダウンリスト]に登録するファイルの拡張子を増やすことで、[ファイルを開く]ダイアログボックスに表示するファイルの拡張子を切り替えることができます。
[ドロップダウンリスト]に登録するファイルの拡張子の数だけ「ファイルフィルタ文字列 , ワイルドカード」のペアを記述します。各ペアは「,(カンマ)」で区切って指定します。
例えば、以下のように記述したとします。
このように記述した場合、ユーザーが[ドロップダウンリスト]で
- 「Excelファイル」を選択
- 「全てのファイル」を選択
拡張子が「.xlsx」のファイルのみが[ファイルを開く]ダイアログボックスに表示されます。
全てのファイルが[ファイルを開く]ダイアログボックスに表示されます。
デフォルトで選択される[ドロップダウンリスト]を変える方法
「ファイルフィルタ文字列 , ワイルドカード」のセットを複数記述した場合、[ファイルを開く]ダイアログボックスが開いた時、最初に記述された「ファイルフィルタ文字列 , ワイルドカード」のセットが[ドロップダウンリスト]に表示されています。
例えば、
の場合では[ドロップダウンリスト]には「Excelファイル(*.xlsx)」が表示されます。
デフォルトで表示される「ファイルフィルタ文字列 , ワイルドカード」のセットを指定するにはGetOpenFilenameメソッドの引数「FilterIndex」を記述します。
引数「FilterIndex」の書式は以下のようになります。
この数字は「ファイルフィルタ文字列 , ワイルドカード」のセットを記述した順に1,2,...となります。
例えば、
と記述すると、[ドロップダウンリスト]には「全てのファイル(*.*)」が表示されるようになります。
GetOpenFilenameメソッドの引数「MultiSelect」を用いて複数のファイルを選択
プログラム例
Sub ファイルを開くダイアログボックスを用いてファイルを開く07() Dim OpenFileName As Variant Dim OpenFileNameTarget As Variant OpenFileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xlsx", MultiSelect:=True) If IsArray(OpenFileName) Then For Each OpenFileNameTarget In OpenFileName Workbooks.Open OpenFileNameTarget Next OpenFileNameTarget Else MsgBox "キャンセルされました" End If End Sub
プログラム説明
複数のファイルを同時に開くプログラムは以下の処理に関して便利になります。
- 月ごとのファイルデータから年間のまとめデータを作る
- 複数のファイルデータを1つのファイルにまとめる
[ファイルを開く]ダイアログボックスから複数のファイルを開く方法は少し複雑になります。
GetOpenFilenameメソッドの引数「MultiSelect」を使うことで、[ファイルを開く]ダイアログボックスから複数のファイルを選択できるようになります。
引数「MultiSelect」の書式は以下のようになります。
- 引数MultiSelectがTrueの時
- 引数MultiSelectがFalseの時
複数ファイル選択可能になります。
1つのファイルしか選択できないようになります。
ここで注意点があります。
これは[キャンセル]ボタンを押されたときの処理で重要となります。
- ファイルを選択し[開く]ボタンを押した場合
- [キャンセル]ボタンが押した場合
変数OpenFileNameにはGetOpenFilenameメソッドの戻り値が入ります。この戻り値には選択したファイルのフルパスが配列として格納されます。
変数OpenFileNameにはFalseが格納されます。
ここで言いたいことは、ファイルを選択し[開く]ボタンを押した場合と[キャンセル]ボタンを押した場合で、変数OpenFileNameに入るデータの形が変わるということです。
そのため、変数OpenFileNameはVariant型で宣言しています。
次にIsArray関数を使って変数OpenFileNameが配列かどうかを調べます。IsArray関数の書式は以下のようになります。
IsArray関数は引数として渡した変数が配列かどうかを調べます。
- 引数が配列の場合
- 引数が配列ではない場合
戻り値にTrueを返します。
戻り値にFalseを返します。
今回のプログラムでは、
- [ファイルを開く]ダイアログボックスで選択したファイルのフルパスを変数OpenFileNameに入れる
- IsArray関数で変数OpenFileNameが配列かどうか調べる
- 配列であれば、配列の数だけファイルを開く
- 配列でなければ、メッセージを表示する。
のようになっています。
ここで1点注意ですが、For Eachの制御変数OpenFileNameTargetはVariant型を宣言しています。これは、変数OpenFileNameTargetにはファイルのフルパスが入りますが、For Eachの制御変数ではString型は使えないためです。そのためVariant型を宣言しています。
開くフォルダを指定する方法
プログラム例
Sub ファイルを開くダイアログボックスを用いてファイルを開く08() Dim OpenFileName As String ChDrive "C" ChDir "C:\test" OpenFileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xlsx") If OpenFileName <> "False" Then Workbooks.Open OpenFileName Else MsgBox "キャンセルされました" End If End Sub
プログラム説明
GetOpenFilenameメソッドの[ファイルを開く]ダイアログボックスで開くフォルダはカレントフォルダ(カレントディレクトリ)になります。
カレントフォルダとはユーザーが現在作業を行っているフォルダのことです。
何かの作業をしていて、最後に開いていたフォルダがカレントフォルダになります。
カレントフォルダではなく、任意のフォルダを開くためには、[ファイルを開く]ダイアログボックスを表示するプログラムの前に、ChDriveステートメントとChDirステートメントでカレントフォルダを移動する必要があります。