スポンサーリンク
はじめに
※今回の記事は、Excel VBAの変数とかはある程度知識があるよって人向けです。
以前の記事でもちょっと取り上げたのだけど、Excel VBAではファイルやフォルダを扱うのに
Application.FileDialog(○○)
というやつでダイアログを出すことができる。
上記の括弧()内には、後述する4つの中からどれかを入れることになる。
今回はその中で、ファイルを開くものを扱うことにする。
Application.FileDialogについて
さて、
Application.FileDialog(○○)
の括弧内には、4種類の入れるものがあって、用途によって使い分けるわけだけど、それらは次のようになる。
名称 | 機能 |
---|---|
msoFileDialogFolderPicker | フォルダを選択する |
msoFileDialogFilePicker | ファイルを選択する →「開く」のではなく「選択する」だけ |
msoFileDialogOpen | ファイルを開く →Excelで「開く」わけなので、「Excelで開く」ことができないならエラーになる。 「選択」するというmsoFileDialogFilePickerとの、微妙な違い。 |
msoFileDialogSaveAs | ファイルを保存する |
この中で、ファイルを開くということになると、
msoFileDialogOpen
のどちらかを使うことになる。
私も、あまり両者の違いを意識してなくて、割とどちらも使うけどね。
ただ厳密に(?)考えると、msoFileDialogOpenは「Excelで」ファイルを開くことに特化してるので、ちょっと用途が狭くなる気がする。
だからmsoFileDialogFilePickerで、まずファイルを選択することだけやっといて、開くプロセスは後で別にやる方が良いかなと思う。
ちなみに、ファイルを開くダイアログというのでは、Application.FileDialogを使うやつ以外にも、
Application.GetOpenFilename
とかいうやつもあるけどね。
ひとまずはApplication.FileDialogだけを覚えておけば良いだろう。
このApplication.FileDialogの方が、ソースコード中にコメントを色々と書き込めたり、扱いやすい感じなんだよね。
サンプルソースコード
では、Application.FileDialogを使ってファイルを開くダイアログについて、ソースコードを書いてみる。
ソースコードの中に結構やかましくコメントを書きまくったけど、このコメントごとコピペして利用していただいて構わないレベルにしたつもり。
下記のコードは、ファイルを1つだけ開くダイアログについてのもの。
ファイルを複数いっぺんに開くことができるダイアログがあって、それもApplication.FileDialogでやれるんだけど、それは次回の記事で別途取り上げる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
Sub openDialogTestSingle() '単一ファイルを開くダイアログ Dim strOpenFile As String 'Application.FileDialogの種類 '(1)msoFileDialogFolderPicker→フォルダを選択する '(2)msoFileDialogFilePicker→ファイルを「選択」する。「開く」のではない。 '(3)msoFileDialogOpen→ファイルを「Excelで」「開く」 '(4)msoFileDialogSaveAs→ファイルを保存する '普通にファイルを開くだけなら(2)msoFileDialogFilePickerでファイル名のみ取得して 'ファイルを開くことは別プロセスでやるのが無難か With Application.FileDialog(msoFileDialogFilePicker) 'ファイル種類のフィルタ。必ず最初にクリアしておく .Filters.Clear '***Filters.Add についての説明。*** '引数のオプション名を全て記述した場合。 '(1)Description '開くファイルの種類についての説明文 '(2)Extensions 'ファイルの拡張子を指定。 '複数の拡張子を指定する場合は、セミコロン「;」で区切る。 '特に(2)など、引数の書き方が割とややこしいので、 'このオプション名もいつも書くようにした方が良いかも。 .Filters.Add Description:="ExcelかCSVのファイル", Extensions:="*.xls* ; *.csv" '別形式のファイルを追加で指定することもできる。 .Filters.Add "テキストファイル", "*.txt" '***Filters.Add についての説明 終わり。*** 'ダイアログの上部に表示するタイトル .Title = "目的のファイルを開く" 'ファイルを開かれなかったら終了 If Not .Show Then Exit Sub 'ファイル名を変数へ格納 strOpenFile = .SelectedItems(1) End With '選択されたファイルをExcelブックとして開く。 'この例では、リンクの更新はせず(UpdateLinks:=False) '読み取り専用で開く(ReadOnly:=True) Workbooks.Open strOpenFile, UpdateLinks:=False, ReadOnly:=True Dim wb As Workbook 'いま開いたExcelブックを変数にセット Set wb = ActiveWorkbook 'ブック名をメッセージボックスで msgbox wb.Name,vbInformation,"ブック名" 'Excelブックを、上書き保存はせず閉じてみよう wb.Close saveChanges:=False End Sub |
上記のコードは、単に
→メッセージボックスでそのファイルの名前を出す
→Excelを閉じる
というだけのもの。
このApplication.FileDialogは、With~End Withで囲んだ部分の中に色々と書くことができる。
で、上記に示した以外にも書ける要素はあるんだけど、それらはさほど重要でないと思ったので省いた。
必ず覚えておくべきものに絞ったつもり。
ソースコード解説
Filtersについて
まず最初の方の
.Filters.Add
については解説しておきたい。
要するに、ファイルの拡張子を指定して、どういう種類のファイルを開けるのかを指定・フィルタリングするわけだけど、最初に
.Filters.Clear
でフィルタをクリアするっていうのは、必ずこうするものだと単に習慣づければ良い。
で、次がちょっと面倒なんだけど、
.Filters.Add “テキストファイル”, “*.txt”
この2行について
Description:=
Extensions:=
という文言を、書いてるのと書いてないのに分けている。
Excel VBAではこういった文言を、引数のオプション名とか言うのだけど、書いても書かなくても正常に動作はする。
ただ、どこにどういうものを書くのか覚えにくい場合などは、詳しくこのオプション名を書くようにすると良いだろう。
たとえばメッセージボックスを出すMsgBoxについても、普通に書くと
という感じになるけど、vbInformationて何のことかだし、下手すると最後の”メッセージボックスです”の部分も何のことかとなる。
で、これを詳しくオプション名っていうやつを付けて書くと
というようになる。
Promptというのは、普段あまり使わない英語だろうが、要はメッセージボックスのメッセージ部分のこと。
それはともかく「Buttons」「Title」という解説が加わって、それぞれ何を示すか分かりやすくなったはず。
で、このオプション名を明記するときは、Title:= のように
:=
というのを付けて書く。
これも慣れない内は間違いやすいだろうが、「=」ではなく「:=」だ。
オプション名の明記のときは「:=」記法をするのだと、覚えておこう。
さて話は元に戻って
の部分で「Description」は良いとして「Extensions」の部分がなかなか馴染みにくいと思う。
ダブルクォーテーション””で囲んで、その中身をセミコロン「;」で区切るというのがどうもね。
しかもその中に、アスタリスク「*」まであるし。
アスタリスク「 * 」について
まずアスタリスク「 * 」は、任意の長さ(0文字も含む)の任意の文字列を示す。
だから「 *.xls* 」という場合、1つ目の「 * 」は任意のファイル名部分ということを示す。
で、2つ目の「 * 」が何を示すかって、Excelファイルの拡張子には
xlsx
xlsm
xlsb
とかあって「xls」で始まり何か続くという点では共通だから、それを「 * 」で示してるわけ。
だから「xls*」以外の拡張子のやつは、単に「csv」とか書いて「 * 」を付けていない。
これらFiltersの設定とか、
とかを反映させた「ファイルを開く」ダイアログが次のようになる。
セミコロン「;」について
次にセミコロン「;」で区切る書き方
色んな記号が入り混じって分かりにくいが、これはもう、こういうものとしか。
無理にこの書き方を習得しなくても良いだろう。私もイマイチ覚えきれてない。
1 2 3 |
.Filters.Add Description:="Excelファイル", Extensions:="*.xls*" .Filters.Add Description:="CSVファイル", Extensions:="*.csv" .Filters.Add Description:="テキストファイル", Extensions:="*.txt" |
というように、行を分けて丁寧に書いていっても、全然問題ない。
自分が分かりやすい方法で行こう。
=True や =False は省略しよう
次に
の部分。
要はこれは、ファイルを開くよう促したダイアログにおいて「キャンセル」を押して、ファイルを開くのをやめた場合には全部処理を終わる(Exit Sub)という記述だけど、多分
と書く人も多いだろう。
しかし「= False」よりは「Not」を使った書き方の方がスマートとされる。
ちなみに、これは「キャンセル」ボタンを押された時の挙動記述だけど、普通に「開く」ボタンを押された時については
と書けば良い。これは、
の「= True」を省略したわけだけど、明らかにスマートになっている。
この辺については別記事でも述べている。
取得されたSelectedItemsは変数へ
最後に
の部分。
SelectedItemsというのが文字通り、ダイアログで選択されたファイルのことだけど、これは配列という形式になるので、最後の(1)も必ず付けよう。
そして、strOpenFileという変数に代入しているわけだけど、これも必ずやるようにしよう。
なんというかそれをしないと、「With」を「End With」で閉じるタイミングを逸することになりかねないというか。
あるいは、最初に宣言したApplication.FileDialog(msoFileDialogFilePicker)を閉じきれないというか。
まあとにかく、次回の記事で取り上げる複数選択可能なダイアログなんかでもそうなんだけど、変数にこまめに代入することで、手軽に使いやすくなるんだよね。
スポンサーリンク