VBAからCSVファイルや他のBookを操作したり、画像を取得したいときなど、ファイル選択ダイアログの組み込みは必須とも言えます。
このダイアログは、表示するファイルを拡張子で絞り込み、ユーザーが間違ったファイルを選ぶことを防ぐ助けになるのもポイントのひとつです。
そして、このダイアログはたった数行のコードで簡単に実装することができます。
このページではファイル選択ダイアログの使い方などを一通り解説し、サンプルコードをいくつか紹介します。
一読するだけでファイル選択ダイアログの概要や使い方のポイントをすべて押さえることができますので、ぜひチェックしてみてください。
GetOpenFilenameメソッドの構成
Application.GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)
構成としては上のとおりです。
特に重要なのはFileFilterの部分ですが、先に各引数を一覧で記載し、それぞれの引数については後ほど解説していきます。
引数 | 概要 | 既定値 |
---|---|---|
FileFilter | 表示するファイルのフィルタリング | “すべてのファイル(*.*),*.*” |
FilterIndex | ダイアログを開いたときに初期セットされるフィルターの番号を指定(複数のFileFilterを指定した場合に有効) | 1 |
Title | ダイアログの上部に表示するタイトル名 | “ファイルを開く” |
ButtonText | 「開く」ボタンの文字列を変更(Mac版のみ有効) | |
MultiSelect | 複数ファイルの選択の許可 | False |
なお、このGetOpenFilenameメソッドはすべての引数を省略することができ、省略した場合の引数はすべて既定値となります。
早い話、次のようにApplication.GetOpenFilenameと記載しておくだけでダイアログが開き、選択したファイルのフルパスをFilePathという変数に格納することができます。
Sub DialogBox()
Dim FilePath As Variant
FilePath = Application.GetOpenFilename
End Sub
ファイルフィルターは指定されていないので、すべてのファイルが選択対象となります。
ただ、これではあまりにおもしろくありません。GetOpenFilenameメソッドはファイルのフィルタリング表示をできるのが肝と言っても過言ではありません。
次は各引数の指定方法を解説していきます。すべて見る必要はありませんが、FileFilterくらいはどうぞ見ていってください。
各引数の意味と指定方法
FileFilter
GetOpenFilenameメソッドでは最も重要な引数です。というか、ほとんどの場合、設定するとすればここだけになるのではないでしょうか。
まずは次の画像ファイルをフィルター表示する例を見てください。
FilePath = Application.GetOpenFilename (“画像(*.png; *.jpg; *.jpeg; *.gif),*.png; *.jpg; *.jpeg; *.gif“)
5つある引数のうち、FileFilterだけを指定し、その他の引数は省略しています。
この中で、青地の部分「画像(*.png; *.jpg; *.jpeg; *.gif)」はフィルターの名前のようなもので、ダイアログの右下に表示される文字列です。(下図参照)
重要なのは赤字の部分「*.png; *.jpg; *.jpeg; *.gif」で、この記述に従ってファイルがフィルタリング表示されることになります。(この例ではダイアログに表示するファイルを4種類の拡張子で絞り込んでいます。)
表示するファイルの種類を増やしたいときは、セミコロン(;)で区切って同じように拡張子を追加していけばいいですし、逆に不要な指定を削除すれば絞り込むことができます。
FileFilterは一連の記述を「””」で囲って、表示文字列とフィルター指定を「,」で区切っています。うっかり表示文字列とフィルターをそれぞれを「””」で囲ってしまうとエラーになります。
なお、すべてのファイルを表示したい場合は前段に示したとおり、この引数を省略(削除)してください。
FilterIndex
FilterIndexはフィルターを2セット以上指定した場合で、ダイアログを開いたときの初期値に2番目以降(左側から2つ目以降)のフィルターを指定するときに番号で指定します。
例えば次のようなケースです。
FilePath = Application.GetOpenFilename(“画像(*.png; *.jpg; *.jpeg; *.gif),*.png; *.jpg; *.jpeg; *.gif,Excel(*.xls?; *.xls),*.xls?; *.xls“, 2)
少し長いですが、緑の網掛けをしている部分が1番目のフィルター、オレンジの網掛けをしている部分が2番目のフィルターです。
そして、ダイアログを開いたとき、2番目のフィルターを初期値として利用したい場合は、赤字の部分のように「2」と指定するわけです。
この場合も、フィルターは2つとも一組の「””」の中にいて、「,」で区切られているだけです。2つに分割してそれぞれ「””」で囲ったりしないように注意しましょう。
また、フィルターを2つ以上記述すると、ダイアログの右下の案内文字列をプルダウンしてフィルターを切り替えることができるようになります。
Title
タイトルはそのままの意味で、ダイアログの左上の名称です。
例えば次の2つのコードを見比べてみましょう。
Sub DialogBox1()
Dim FilePath As Variant
FilePath = Application.GetOpenFilename("画像(*.png; *.jpg; *.jpeg; *.gif),*.png; *.jpg; *.jpeg; *.gif,Excel(*.xls?; *.xls),*.xls?; *.xls", 2)
End Sub
Sub DialogBox2()
Dim FilePath As Variant
FilePath = Application.GetOpenFilename("画像(*.png; *.jpg; *.jpeg; *.gif),*.png; *.jpg; *.jpeg; *.gif", , "画像ファイルの選択")
End Sub
結果は次のとおりです。
赤枠の部分がタイトルですが、左が1つ目のコードで、右が2つ目のコードです。
Title引数を省略した場合は「ファイルを開く」と表示され、任意の文字列を指定した場合はその文字列が表示されます。
タイトルは実際の機能性には特に影響がないですが、例えば画像の取得をするためのダイアログで、タイトルが「ファイルを開く」だと人によっては少し混乱するかもしれません。
利便性を高めるためのVBAなので、適切なタイトルを付けてユーザーが直感的に操作ができるように配慮するよう心掛けましょう。
ButtonText
これはMAC版Excelで「開く」ボタンの名称を変えられるというものだそうです。
じつはこの引数、私も使ったことがありません。この引数の存在自体は知っていたのですが、Windows環境では使えないこともあり、特に気にしたこともなかったのが実情です。
この記事を書くにあたり少し調べたのですが、あまりに情報が少なく、すみませんが詳細がわかりませんでした。
MultiSelect
最後のMultiSelectの意味はそのままで、複数選択をするかどうかを決める引数です。
値に「True」を指定すれば複数選択ができるようになりますし、省略した場合の既定値は「False」となります。
引数としての指定はたったこれだけのことですが、GetOpenFilenameメソッドはあくまでファイル名を取得するだけの機能しかないため、選択したファイル(取得したフルパス)にどのような処理をさせるのかは別に指示してやる必要があります。
そして、複数選択を許可するということは、当然ながら複数のファイル(複数のフルパス)に対して処理を行わせるための仕組みが必要になります。
具体的には取得した複数のフルパスを配列化して処理させるなどの工夫が必要です。
次の項目でサンプルコードをあげておきますので参考にしてください。
サンプルコード
選択した画像ファイルを既定のアプリで開く
ダイアログで選択した画像ファイルをOSの既定の画像表示アプリで開くサンプルコードです。
Sub DialogBox_S1()
'ダイアログを開く
Dim FilePath As Variant
FilePath = Application.GetOpenFilename("画像(*.png; *.jpg; *.jpeg; *.gif),*.png; *.jpg; *.jpeg; *.gif", , "画像ファイルの選択")
'キャンセルした場合は処理を中断
If FilePath = "False" Then Exit Sub
'選択した画像を既定のアプリで開く
CreateObject("WScript.Shell").Run ("""" & FilePath & """")
End Sub
ダイアログに関してこのコードで指定している引数は2つ、FileFilterとTitleだけです。
FileFilterには“画像(*.png; *.jpg; *.jpeg; *.gif),*.png; *.jpg; *.jpeg; *.gif”を指定し、Titleには“画像ファイルの選択”と指定しています。
ここでのポイントはカンマの使い方です。
GetOpenFilenameメソッドの引数順序としては、次のように、FileFilter、FilterIndex、Title、となります。
Application.GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)
今回はFileFilterを1セットしか指定していないため、FilterIndexは指定する必要がなく省略しています。
そのため、FileFilterとTitleの間には「, ,」のようにカンマを2つ並べて、FilterIndexを省略したことを暗に指定しています。
このカンマをひとつしか記載していないと“画像ファイルの選択”というTitle引数が、本来数値しか指定できないFilterIndexの位置に記載されているということになりエラーが出ます。
なお、カンマを並べて省略を示さなくてもいい指定方法も存在しますが、そちらは最後に紹介します。
選択したExcelファイルを開く
こちらはタイトルのとおり、選択したExcelファイルを開くという、たぶんよく使われるコードです。
Sub DialogBox_S2()
'ダイアログを開く
Dim FilePath As Variant
FilePath = Application.GetOpenFilename("Excel(*.xlsx; *.xlsm; *.xls),*.xls?; *.xls")
'キャンセルした場合は処理を中断
If FilePath = "False" Then Exit Sub
'選択したファイルを開く
Workbooks.Open FilePath
End Sub
こちらは引数にFileFilterをひとつ指定しているだけです。
シンプルな利用方法ですが、しいてポイントを述べるとすればワイルドカードの指定です。
「*.xls?」という部分について、「*」は1文字以上の文字列、「?」は1文字の文字列、という意味があります。
部分 | 意味 |
---|---|
* | ファイル名での絞り込みはしない |
.xls? | .xlsx/.xlsmなどが対象 |
表のとおり、ファイル名でのフィルタリングはせず、拡張子部分については「.xls+1文字」であればすべてダイアログに表示します。
Excelの「.xls」を含む4文字の拡張子は3つありますが、「*.xls?」という指定で、少なくとも主だった「.xlsx」と「.xlsm」の拡張子はカバーできることになるわけです。
また、引数のTitleを省略していますが、省略した場合にダイアログに表示されるタイトルは「ファイルを開く」です。
このサンプルコードでやろうとしていることは、「選択したExcelファイルを開く」ということです。タイトルはデフォルトのものでも何の違和感のないため、省略しています。
選択した複数の画像ファイルをすべて既定のアプリで開く
こちらは少し複雑に見えますが、複数の画像ファイルをすべて既定のアプリで開くというものです。ポイントはタイトルのとおり、複数選択ができる点です。
Sub DialogBox_S3()
'ダイアログを開く
Dim FilePath As Variant
FilePath = Application.GetOpenFilename("画像(*.png; *.jpg; *.jpeg; *.gif),*.png; *.jpg; *.jpeg; *.gif", , "画像ファイルの選択", , True)
'選択した画像を既定のアプリで開く
If IsArray(FilePath) Then
For Each FileOpen In FilePath
CreateObject("WScript.Shell").Run ("""" & FileOpen & """")
Next FileOpen
Else
Exit Sub 'キャンセルした場合は処理を中断
End If
End Sub
GetOpenFilenameの指定部分が少し長くなっていますが、複数選択を有効化するには最後の引数MultiSelectをTrueにしてやる必要があります。具体的には次のように指定します。
(“画像(*.png; *.jpg; *.jpeg; *.gif),*.png; *.jpg; *.jpeg; *.gif”, , “画像ファイルの選択”, , True)
こちらも、MultiSelectが5番目の引数のため、カンマを並べて省略した引数の存在を示している点にご注意ください。
あと、複数のファイルを選択するということは、当然ながら複数のファイルのフルパスを取得するということになります。
複数のファイルのフルパスを処理するには配列化して処理する必要がありますが、このあたりの詳細は今回は割愛します。
とりあえず現時点ではCreateObject(“WScript.Shell”).Run (“””” & FileOpen & “”””)の部分を他の内容に差し替えることで、画像を開くのではなく、他の目的にカスタマイズできるという程度にご理解ください。
選択した複数ファイルのリストを作成する
最後に、選択した複数ファイルのリスト作成コードです。フォルダ内のファイルすべてなど、選択した複数のファイルのフルパスをA列にリストアップします。
Sub DialogBox_S4()
'ダイアログを開く
Dim FilePath As Variant
FilePath = Application.GetOpenFilename(, , "選択したファイルリストの作成", , True)
'選択したファイルのリストを作成
If IsArray(FilePath) Then
Dim i As Long
i = 1
For Each FileList In FilePath
ActiveSheet.Cells(i, "A") = FileList
i = i + 1
Next FileList
Else
Exit Sub 'キャンセルした場合は処理を中断
End If
End Sub
引数の指定はTitleとMultiSelect以外省略でさっぱりしていますね。
まず、冒頭でも記載したとおり、FileFilterを省略するとダイアログにはすべてのファイルが表示されるようになります。
また、ダイアログのタイトルが「ファイルを開く」ではわかりにくいので、引数Titleには「選択したファイルリストの作成」と指定しています。
あとはMultiSelecに「True」を指定しているだけです。
なお、引数を見ていただければわかると思いますが、こちらも引数の省略をカンマで示しています。
指定している引数が、5つある引数の3番目と5番目であることを、カンマで区切ることで明らかにしています。
GetOpenFilenameメソッドは、名前付き引数として指定することもできます。
今回のサンプルコードで例に示すと次のような形です。
Application.GetOpenFilename(Title:=“選択したファイルリストの作成”, MultiSelect:=True)
カンマで区切る代わりに、このように引数の名前を付けて指定するというわけです。
なお、名前付き引数で指定する場合は順序が変わっても問題ありません。
このメソッドは引数がたった5つでシンプルな構成ですし、カンマ区切りで順番に指定するほうが合理的とは思いますが、そのあたりは好みで選んで大丈夫です。
まとめ
ファイル選択ダイアログは簡単なコードで組み込めることもあり、用途も多いと思います。
こういった機能を組み込むことで、利便性の向上だけでなく、ただのExcelファイルを一気にソフトっぽい印象にしてくれます。ぜひ積極的に活用していきましょう。
GetOpenFilenameメソッドについて、あらためてポイントをまとめておきます。
ポイント | ポイント |
---|---|
できること | フルパスの取得 |
キャンセルした場合 | “False”が返る |
引数 | すべて省略可 |
複数選択 | 可(配列化が必要) |
しつこいようですが、ファイル選択ダイアログでできるのはフルパスの取得だけです。
取得したフルパスに対して何らかの命令を与えることで初めて意味(価値)が出てきます。
今回紹介したサンプルコードではごく簡単なことしかできませんが、ぜひ有意義な活用方法を検討してみてください。
コメント