Excel VBA ファイルを開くダイアログについて(1)ファイル1つだけ開くタイプのダイアログ

Excel マクロ、VBA

スポンサーリンク

はじめに

※今回の記事は、Excel VBAの変数とかはある程度知識があるよって人向けです。

以前の記事でもちょっと取り上げたのだけど、Excel VBAではファイルやフォルダを扱うのに
Application.FileDialog(○○)
というやつでダイアログを出すことができる。

上記の括弧()内には、後述する4つの中からどれかを入れることになる。
今回はその中で、ファイルを開くものを扱うことにする。

Excel VBA フォルダを複数一括新規作成する手抜きマクロ 個人用マクロブックに組み込めるよ

2018年8月23日

Application.FileDialogについて

さて、
Application.FileDialog(○○)
の括弧内には、4種類の入れるものがあって、用途によって使い分けるわけだけど、それらは次のようになる。

名称機能
msoFileDialogFolderPickerフォルダを選択する
msoFileDialogFilePickerファイルを選択する
→「開く」のではなく「選択する」だけ
msoFileDialogOpenファイルを開く
→Excelで「開く」わけなので、「Excelで開く」ことができないならエラーになる。
「選択」するというmsoFileDialogFilePickerとの、微妙な違い。
msoFileDialogSaveAsファイルを保存する

この中で、ファイルを開くということになると、

msoFileDialogFilePicker
msoFileDialogOpen
のどちらかを使うことになる。

私も、あまり両者の違いを意識してなくて、割とどちらも使うけどね。
ただ厳密に(?)考えると、msoFileDialogOpenは「Excelで」ファイルを開くことに特化してるので、ちょっと用途が狭くなる気がする。

だからmsoFileDialogFilePickerで、まずファイルを選択することだけやっといて、開くプロセスは後で別にやる方が良いかなと思う。

ちなみに、ファイルを開くダイアログというのでは、Application.FileDialogを使うやつ以外にも、
Application.GetOpenFilename
とかいうやつもあるけどね。

ひとまずはApplication.FileDialogだけを覚えておけば良いだろう。

このApplication.FileDialogの方が、ソースコード中にコメントを色々と書き込めたり、扱いやすい感じなんだよね。

サンプルソースコード

では、Application.FileDialogを使ってファイルを開くダイアログについて、ソースコードを書いてみる。

ソースコードの中に結構やかましくコメントを書きまくったけど、このコメントごとコピペして利用していただいて構わないレベルにしたつもり。

下記のコードは、ファイルを1つだけ開くダイアログについてのもの。

ファイルを複数いっぺんに開くことができるダイアログがあって、それもApplication.FileDialogでやれるんだけど、それは次回の記事で別途取り上げる。

上記のコードは、単に

ファイルをExcelで開いてみる
→メッセージボックスでそのファイルの名前を出す
→Excelを閉じる

というだけのもの。

このApplication.FileDialogは、WithEnd Withで囲んだ部分の中に色々と書くことができる。

で、上記に示した以外にも書ける要素はあるんだけど、それらはさほど重要でないと思ったので省いた。
必ず覚えておくべきものに絞ったつもり。

ソースコード解説

Filtersについて

まず最初の方の
.Filters.Add
については解説しておきたい。

要するに、ファイルの拡張子を指定して、どういう種類のファイルを開けるのかを指定・フィルタリングするわけだけど、最初に
.Filters.Clear
でフィルタをクリアするっていうのは、必ずこうするものだと単に習慣づければ良い。

で、次がちょっと面倒なんだけど、

    .Filters.Add Description:=“ExcelかCSVのファイル”, Extensions:=“*.xls* ; *.csv”
    .Filters.Add “テキストファイル”, “*.txt”

この2行について
Description:=
Extensions:=
という文言を、書いてるのと書いてないのに分けている。

Excel VBAではこういった文言を、引数のオプション名とか言うのだけど、書いても書かなくても正常に動作はする。

ただ、どこにどういうものを書くのか覚えにくい場合などは、詳しくこのオプション名を書くようにすると良いだろう。

たとえばメッセージボックスを出すMsgBoxについても、普通に書くと

    MsgBox “メッセージです”, vbInformation, “メッセージボックスです”

という感じになるけど、vbInformationて何のことかだし、下手すると最後の”メッセージボックスです”の部分も何のことかとなる。

で、これを詳しくオプション名っていうやつを付けて書くと

    MsgBox Prompt:=“メッセージです”, Buttons:=vbInformation, Title:=“メッセージボックスです”

というようになる。

Promptというのは、普段あまり使わない英語だろうが、要はメッセージボックスのメッセージ部分のこと。

それはともかく「Buttons」「Title」という解説が加わって、それぞれ何を示すか分かりやすくなったはず。

で、このオプション名を明記するときは、Title:= のように
:=
というのを付けて書く。
これも慣れない内は間違いやすいだろうが、「=」ではなく「:=」だ。

オプション名の明記のときは「:=」記法をするのだと、覚えておこう。

さて話は元に戻って

    .Filters.Add Description:=“ExcelかCSVのファイル”, Extensions:=“*.xls* ; *.csv”

の部分で「Description」は良いとして「Extensions」の部分がなかなか馴染みにくいと思う。
ダブルクォーテーション””で囲んで、その中身をセミコロン「;」で区切るというのがどうもね。

しかもその中に、アスタリスク「*」まであるし。

アスタリスク「 * 」について

まずアスタリスク「 * 」は、任意の長さの任意の文字列を示す。
だから「 *.xls* 」という場合、1つ目の「 * 」は任意のファイル名部分ということを示す。

で、2つ目の「 * 」が何を示すかって、Excelファイルの拡張子には

    xls
    xlsx
    xlsm
    xlsb

とかあって「xls」で始まり何か続くという点では共通だから、それを「 * 」で示してるわけ。

だから「xls*」以外の拡張子のやつは、単に「csv」とか書いて「 * 」を付けていない。

これらFiltersの設定とか、

    .Title = “目的のファイルを開く”

とかを反映させた「ファイルを開く」ダイアログが次のようになる。

セミコロン「;」について

次にセミコロン「;」で区切る書き方

    .Filters.Add Description:=“ExcelかCSVのファイル”, Extensions:=“*.xls* ; *.csv”

色んな記号が入り混じって分かりにくいが、これはもう、こういうものとしか。

無理にこの書き方を習得しなくても良いだろう。私もイマイチ覚えきれてない。

というように、行を分けて丁寧に書いていっても、全然問題ない。
自分が分かりやすい方法で行こう。

=True や =False は省略しよう

次に

    If Not .Show Then Exit Sub

の部分。

要はこれは、ファイルを開くよう促したダイアログにおいて「キャンセル」を押して、ファイルを開くのをやめた場合には全部処理を終わる(Exit Sub)という記述だけど、多分

    If .Show = False Then Exit Sub

と書く人も多いだろう。

しかし「= False」よりは「Not」を使った書き方の方がスマートとされる。

ちなみに、これは「キャンセル」ボタンを押された時の挙動記述だけど、普通に「開く」ボタンを押された時については

    If .Show Then

と書けば良い。これは、

    If .Show = True Then

の「= True」を省略したわけだけど、明らかにスマートになっている。

この辺については別記事でも述べている。

Excel VBA 処理実行前にチェックを通すソースコードの記入方法例

2018年4月13日

取得されたSelectedItemsは変数へ

最後に

    strOpenFile = .SelectedItems(1)

の部分。

SelectedItemsというのが文字通り、ダイアログで選択されたファイルのことだけど、これは配列という形式になるので、最後の(1)も必ず付けよう。

そして、strOpenFileという変数に代入しているわけだけど、これも必ずやるようにしよう。
なんというかそれをしないと、「With」を「End With」で閉じるタイミングを逸することになりかねないというか。
あるいは、最初に宣言したApplication.FileDialog(msoFileDialogFilePicker)を閉じきれないというか。

まあとにかく、次回の記事で取り上げる複数選択可能なダイアログなんかでもそうなんだけど、変数にこまめに代入することで、手軽に使いやすくなるんだよね。

Excel VBA ファイルを開くダイアログについて(2)ファイルを複数いっぺんに開くタイプのダイアログ

2019年4月4日

スポンサーリンク