こんにちは!「デザインもできるシステムエンジニア」のあつもり(プロフィール)です。今日も業務効率化のアイデアを発信していきます。
前回は「ダイアログボックスを使ってファイルを非表示で開く方法」を紹介しました。
今回は「ダイアログボックスを表示させ複数ファイルを1度に開く方法」を紹介します。
複数のファイルを一度に処理できると、次のようなことが出来るようになります。
- 月単位で別れた勤務表ファイルから年間の集計表を作る
- 複数ファイルの商品データをデータベースに一括登録する
- 複数のテキストファイルをエクセルファイルとして保存しなおす
入力ファイルが1つならいいのですが、複数になるとその数だけプログラムを動かす必要があります。
しかし、複数ファイルを一度に処理することができればその手間がなくなるので、大幅な作業時間短縮につながります。
目次
複数ファイルを一度に開くプログラムを作る
前回のプログラムを修正する
それでは実際にプログラムを作っていきます。
前回使用した「非表示でファイルを開く.xls」をコピーして「複数ファイルを開く.xls」を作成します。
サンプルコードを貼り付ける
標準モジュールのプロシージャ「OpenExcelFile」に下記のコードを貼り付けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Option Explicit Sub OpenExcelFile() Dim openFilePath As Variant 'ダイアログボックスで選択したファイルを配列に入れる 'MultiSelect:=Trueにすると複数ファイル選択OK openFilePath = Application.GetOpenFilename _ ("Microsoft Excel ファイル,*.xls*", , "エクセルファイルを選んで下さい", MultiSelect:=True) Dim pt As Variant If IsArray(openFilePath) Then '配列ぶん繰り返しファイルを開く For Each pt In openFilePath Workbooks.Open pt Next pt End If End Sub |
プログラムコードの解説
重要なところに絞ってプログラムコードを解説します。
プログラムの全体の流れは以下のとおりです。
- ファイル選択ダイアログボックスを表示させる
- 選択したファイルのパスを取得して配列に入れる
- キャンセルボタンが押されたらプログラムを終了させる
- 配列に入れたパスの数ぶんファイルを開く
GetOpenFilenameメソッドのMultiSelectプロパティを使う
GetOpenFilenameメソッドの引数MultiSelectを使うことで、ダイアログボックスから複数ファイを選択できるようになります。
MultiSelectにはTrueかFalseが入ります。
Trueを入れると複数ファイル選択可能になり、Falseを入れると1つのファイルしか選択できないようになります。
GetOpenFilenameメソッドの詳しい説明は過去の記事をご覧ください。
キャンセルボタンが押されたときの処理を入れる
ここで注意しなければいけないポイントがあります。それはキャンセルボタンを押されたときの処理を入れることです。下記のコードを見てください。
プログラムコードでは8~9行目になります。
1 2 |
openFilePath = Application.GetOpenFilename _ ("Microsoft Excel ファイル,*.xls*", , "エクセルファイルを選んで下さい", MultiSelect:=True) |
変数openFilePathにはGetOpenFilenameメソッドの戻り値が入ります。この戻り値には選択したファイルのパスが配列として格納されます。
しかしキャンセルボタンが押されたときはどうでしょう?
その場合、変数openFilePathにはFalseが格納されます。
Falseはブーリアン型です。一方ファイルのパスは文字列型です。
つまり、ファイルが選択された場合とキャンセルボタンを押したときでは、変数penFilePathに入るデータの形が変わるのです。
そのため、変数openFilePathはバリアント型で宣言しておきます。
バリアント型にしておけば自動的にデータ型を判別してくれるので、エラーにならず正しく処理されます。
プログラムコードでは4行目になります。
1 |
Dim openFilePath As Variant |
IsArray関数を使って配列かどうかを調べる
次にIsArray関数を使って変数openFilePathが配列かどうかを調べます。
IsArrayは変数が配列かどうかを調べてくれる関数です。配列の場合は戻り値にTrueを返し、そうでない場合はFalseを返します。
今回のプログラムの場合、次のようにしてIsArray関数を使っています。
- ダイログボックスで選択したファイルのパスを変数openFilePathに入れる
- IsArray関数で変数openFilePathが配列かどうか調べる
- 配列であれば、配列の数ぶんファイルを開く
- 配列でなければ処理しない
1 2 3 4 5 6 7 8 |
Dim pt As Variant If IsArray(openFilePath) Then '配列ぶん繰り返しファイルを開く For Each pt In openFilePath Workbooks.Open pt Next pt End If |
ここで1点注意ですが、For Eachの制御変数ptはVariant型を宣言しています。ptにはファイルのパス、つまり文字列が入ります。しかしFor Eachの制御変数でString型は使えないので、Variant型を宣言しているというわけです。
プログラムコードの解説は以上です。
ダイアログボックスから複数ファイルを開くプログラムの動作確認
それでは実際に出来上がったプログラムを動かしてみましょう。
ワークシートの「エクセルファイルを開く」ボタンを押します。
ダイアログボックスが表示されたら、任意のフォルダを開き複数ファイルをドラッグで選択し、開くボタンをクリックします。
※GetOpenFilenameメソッドのMultiselectをTrueにしたことにより、この画面で複数ファイルの選択ができるようになります。
一度に3つのエクセルファイルが開きました。
まとめ
いかがでしたか?今回の内容をまとめます。
- GetOpenFilenameメソッドの引数MultiSelectを使うと複数ファイルを選択できるようになる
- プログラムの処理によって変数の型が変わる場合はバリアント型を宣言しておく
- IsArray関数を使うと変数が配列かどうか調べることができる
複数ファイルの処理を取り入れることでプログラムの可能性が広がります。そして、開発者の工夫次第でオペレーターの作業時間が大幅に短縮されます。
とてもやりがいがあるのでぜひチャレジしてみてください。
その使い方だと損してます!
会社員、個人事業主のかたへ。
無料で登録できるAmazonビジネスアカウントを知ってますか?
何と言っても便利なのが請求書払いによる後払いができるということ。
また、承認ルールを作成すれば、業務上必要な物だけに購入を制限することができます。
さらに多くの商品にビジネスアカウント価格が設定されており、個人アカウントより安く購入できます。
このように個人アカウントと比べてビジネスアカウントはお得な機能や特典がついています。
無料で登録できるので、会社員、個人事業主なら使ったほうが得なのは言うまでもありません。