今回はVBAで、ダイアログボックスを開いて指定されたファイルを開く方法をご説明します。
このケースはユーザーにファイルを指定してもらったり、必ずしもファイル名や保存フォルダが固定ではない時に便利です。
また、同じフォルダにある複数のファイルを選択して、一括で開いく方法も併せてご説明します。
他の方法でファイルを開くは場合はこちらをご覧ください。
1.ダイアログボックスの表示方法
ダイアログボックスを表示させるには、Applicationオブジェクトの「GetOpenFilename」を使用します。
次のように記述します。
GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)
もっともシンプルにダイアログを開く場合は次のように書きます。
Sub Sample1()
Dim FileName As String
FileName = Application.GetOpenFilename("Excelブック,*.xlsx")
Workbooks.Open FileName
End Sub
「GetOpenFilename」は引数は以下の通りです。
2.GetOpenFilenameの引数
簡単にGetOpenFilenameメソッドの引数について一覧にしました。
引数名 | 省略 | データ型 | 説明 |
FileFilter | 可能 | Variant | ファイルの候補を指定する文字列を指定します。 |
Filter Index | 可能 | Variant | FileFilterで指定した文字列の中で、1から何番目の値を規定値とするか指定します。 この引数を省略するか、ファイルフィルター文字列の数より大きい数直を指定すると、 最初のファイルフィルター文字列が既定値となります。 |
Title | 可能 | Variant | ダイアログボックスのタイトルを指定します。 省略すると「ファイルを開く」が既定値となります。 |
ButtonText | 可能 | Variant | Macintoshでのみ指定できます。 |
MultiSelect | 可能 | Variant | Trueを指定すると複数のファイルを選択でき、Falseを指定すると、1つのファイルのみ 選択できます。 既定値はFalseです。 |
3.表示するファイルの種類(拡張子)を指定する
ダイアログボックスに表示するファイルの種類(拡張子)を指定する方法です。
種類(拡張子)とはExcelだと「.xls」、「.xlsx」、CSVだと「.csv」、テキストだと「.txt」のようにファイルの形式を識別した文字列の事です。
「FileFilter:=”任意のファイルの種類の文字列,*.拡張子”」と書きます。
引数名の「FileFilter:=」は省略できます。
Excelを指定する場合は次のように書きます。
「GetOpenFilename(“Excelブック,*.xls?”)」となり、Excelの部分は任意で指定できます。
末尾の「?」はワイルドカードで「.xls/.xlsx/.xlsm」などが表示されます。
注意点として「”任意のファイルの種類の文字列,*.拡張子”」をまとめて””で括ります。
一般的に使用頻度の高そうな拡張子一覧です。(※これ以外にもたくさんあります。)
ファイル形式 | 拡張子 |
Excelブック | .xlsx |
Excelマクロ有効ブック | .xlsm |
Excel97-Excel2003ブック | .xls |
Excelアドイン | .xlam |
テキスト | .txt |
CSV | .csv |
この、ファイルの種類は全て個別に記載する必要がなく、省略した場合は引数一覧にもありますように「すべてのファイル」が規定値となります。
4.表示するファイルの種類(拡張子)を複数指定する
ファイルの指定方法はわかりましたので、次は一度に複数のファイルの種類(拡張子)を表示させる方法をご説明します。
複数と言っても、「拡張子だけ」を複数表示させる場合と、「任意のファイルの種類の文字列と拡張子」とあります。
拡張子だけ複数表示する
任意のファイルの種類の文字列1つに対して、拡張子だけを複数表示させる方法です。
複数指定するには「;」を使用して、連結します。
わかりやすく、Excelを使用して記載してみます。
GetOpenFilename("Excelブック,*.xls;*.xlsx:*.xlsm")
上の様にExcelブックというファイルの種類に対して、xls、xlsx、xlsmの3つを指定しています。
複数の任意のファイルの種類の文字列と拡張子
拡張子ごとにファイルの種類も複数指定する場合は、次のように指定します。
「,」で指定したいファイルの種類と拡張子を追加します。
ここでも「””」はひとまとめで括ります。
Sub Sample3()
Dim FileName As Variant
FileName = Application.GetOpenFilename("Excelブック,*.xlsx,Excelマクロ,*.xlsm,テキスト,*.txt")
Workbooks.Open FileName
End Sub
5.キャンセル処理
「GetOpenFilename」メソッドで開いたダイアログボックスでファイルを選択せず「×」で閉じたり、キャンセルを押した場合、処理を組み込んでいないとエラーになります。
GetOpenFilenameメソッドはキャンセルや閉じられた場合は「False」を返します。
ですので、False判定で処理を分岐できます。
Sub Sample4()
Dim FileName As Variant
FileName = Application.GetOpenFilename("Excelブック,*.xlsx,Excelマクロ,*.xlsm,テキスト,*.txt")
If FileName <> "False" Then
Workbooks.Open FileName
End If
End Sub
6.複数のファイルを選択可能にする
複数のファイルを同時に選択する場合には「MultiSelect」をTrueにします。
複数選択した場合、一度に一括で開くのではなく半数に格納されたファイルを1つずつ開いていきます。
また、複数選択した場合変数「Filename」は配列扱いとなり、キャンセルや「×」ボタンで閉じた場合の判定を「IsArray(変数名)」で判定します。
コードは次のようになります。
Sub Sample5()
Dim FileName As Variant
Dim OpenFile As Variant
FileName = Application.GetOpenFilename("Excelブック,*.xlsx,Excelマクロ,*.xlsm,テキスト,*.txt", MultiSelect:=True)
If IsArray(FileName) Then
For Each OpenFile In FileName
Workbooks.Open OpenFile
Next
End If
End Sub
このSample5をひな形としてしまえば1つの選択でも複数でも、対応可能なのでこちらの方法を覚えておくことをおすすめします。
7.予めフォルダを指定する
ダイアログボックスは開かれた際に、最初に開くフォルダはカレントフォルダとなります。
毎回、関係ないフォルダから始まると、使用頻度が高いと目的のフォルダまで移動が地味に面倒だったりします。
ツール上ファイルを指定したいフォルダが固定されている場合などに、事前にファイルをカレントフォルダに設定しておく場合に便利です。
「CurrentDirectory 」で指定する事ができます。
こちらは共有ネットワークへカレントフォルダを指定できるため意図してこちらを使用しています。
Sub Sample6()
Dim FileName As Variant
Dim OpenFile As Variant
With CreateObject("WScript.Shell")
.CurrentDirectory = "C:\Sample\"
End With
FileName = Application.GetOpenFilename("Excelブック,*.xlsx,Excelマクロ,*.xlsm,テキスト,*.txt", MultiSelect:=True)
If IsArray(FileName) Then
For Each OpenFile In FileName
Workbooks.Open OpenFile
Next
End If
End Sub