スポンサーリンク
はじめに
前回の記事で、Excel VBAでファイルを開くダイアログについて説明した。
それは、ファイルを1つだけ選んで開くものだった・・・ということなんだけど、1つだけってそんなの当たり前じゃんと思うかもしれない。
でも、ファイルを開くダイアログっていうのは、複数のファイルをいっぺんに選んで開けるタイプのダイアログも実はある。
普通にPCを使ってて、そんな複数ファイルをいっぺんに開くダイアログなんて、使う機会は少ないだろう。
Excel VBAにおいても通常は、ファイル1つ開くだけのダイアログで良いのだけどね。
でも複数いっぺんに開くタイプも使いこなせるようになれば、多くのExcelファイルを1まとめにして扱うなどできるようになり、マクロでやれる処理の幅が爆発的に広がる。
複数ファイルいっぺんに開けるダイアログでは次の動画のように、
- ShiftキーやCtrlキーを押しながら各ファイルをクリックする
- マウスで囲うように動かす
といった操作で、複数ファイルを選択できる。
ソースコード
では、サンプルのソースコードを示す。
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 |
Sub openDialogTestMultiple() '複数ファイルを開くダイアログ Dim strFiles() As String Dim i As Integer Dim fileNum As Integer With Application.FileDialog(msoFileDialogOpen) '複数ファイルを選択可能にするとき、AllowMultiSelect = Trueを指定。 .AllowMultiSelect = True 'ファイル種類のフィルタ。必ず最初にクリアしておく .Filters.Clear '全ての形式のファイルを指定するなら、拡張子は "*.*" という指定で良い。 .Filters.Add Description:="全てのファイル", Extensions:="*.*" 'ダイアログの上部に表示するタイトル .Title = "目的のファイルを開く" 'ファイルを開かれなかったら終了 If Not .Show Then Exit Sub '選択されたファイル数に合わせ、配列の要素数を定義 fileNum = .SelectedItems.Count ReDim strFiles(1 To fileNum) '選択されたファイルを配列に格納 For i = 1 To fileNum strFiles(i) = .SelectedItems(i) Next i End With '選択されたファイルを全て書き出してみる。 For i = 1 To fileNum Debug.Print strFiles(i) Next i End Sub |
ソースコードの解説
基本的な解説は前回しつこく述べたので、今回の説明は短めに切り上げる。
複数選択を許可するAllowMultiSelect
今回のキモ、複数のファイルをいっぺんに選択可能にする文言は、言わずもがな
.AllowMultiSelect = True
だ。
Allowって聞き慣れない人も多いかもしれないが、Arrow(矢)じゃない。
許すとか許可するという意味だ。
だから、AllowMultiSelectというのは、複数選択MultiSelectの許可ってことで、それをTrueにするってことね。
このAllowMultiSelectについて前回はソースコード中に書いてなかったけど、それならデフォルト値のFalseがセットされて、複数ファイル選択は不許可ということだ。
私は、「特別な場合でない限り複数ファイル選択はしない」と自分に決めておきたいので、省略できるときはAllowMultiSelectを省略するようにしている。
省略しないほうが好みなら
.AllowMultiSelect = False
と書けば良い。まあここは各人、好きなように。
選択されたファイルを配列に格納
ソースコード中で下記の部分だけど、
1 2 3 4 5 6 7 8 |
'選択されたファイル数に合わせ、配列の要素数を定義 fileNum = .SelectedItems.Count ReDim strFiles(1 To fileNum) '選択されたファイルを配列に格納 For i = 1 To fileNum strFiles(i) = .SelectedItems(i) Next i |
多分こういうサンプルを示してるサイトは、少ないと思う。
というのは普通、最後の
.SelectedItems(i)
の部分はそのままで扱い、イチイチ別の変数に代入したりはしてないんじゃないかなと。
でも私の考えとしては、たくさんのファイルが選んだうえ更に大量の処理を加えていくからには、さっさと変数(というか、配列というやつだけど)に入れてしまわないと気持ち悪いのだ。
実際、多くのサンプルでは複数ファイルを開いてから先の記述が短めなんだけど、私がやる場合はけっこう長めの処理を記述していくことが多いので、配列に入れてしまったほうが都合良くなるんだよね。
スポンサーリンク