VBA

【ExcelVBA】ファイルを開くダイアログで別ファイルの処理をする(GetOpenFilename)

ねぇもりさん、Excel作業をマクロ化したいんだけどさ、処理対象のファイルの形式(.xlsx)は変えたくないんだよね
もり
もり
それなら、「処理対象のファイル」と「マクロファイル」を分けよう

 

Excel作業をマクロで自動化するには、おもに2つのパターンがありますね。

①処理対象のファイルにマクロを含ませる(一体化)

ファイルを開くダイアログ1

 

②処理対象のファイルとマクロファイルを別々に分ける

ファイルを開くダイアログ2

(①のほうが便利ですが、会社の色々な事情で一体化すると都合の悪いこともありますよね)

「処理対象のExcelファイル(.xlsx)」 と 「マクロファイル(.xlsm)」 を分ける方法を紹介します。

GetOpenFilenameメソッドで「ファイルを開くダイアログ」を出現させ、ユーザが処理対象のファイルを選択する

→そのファイルに対してマクロ処理する

という流れです。

ユーザが選択したファイルに対して処理を実行する方法

1ファイルに対して処理をする

まずはこのパターンです。

ファイルを開くダイアログ2

コードがこちらです。

マクロを実行すると、ファイルを開くダイアログが登場します。

ファイルを開くダイアログ4

変数fNameには、選択したファイルのフルパスが格納されます。

ファイルを開くダイアログ5

ファイルが選択されなかった場合(ユーザがキャンセルした場合)、文字列型のFalseが返ります。

GetOpenFilenameメソッドは、「ユーザが指定したファイルのフルパス」を取得するのみで、ファイルを開く操作までは行いません。

ファイルを開く処理は、WorkBooks.Openメソッドで実行します。

Set wb = Workbooks.Open(fName)で、「開いたファイル」を「変数wb」にオブジェクトとして格納するので、あとはwbに対する処理を記述すればOKです。

たとえば、こんな記述をすると、

wb.Sheets(1).Range("A1").Value = "Hello World"

ユーザが選択したファイル(wb)に対して、ちゃんと処理が実行されているのを確認できます。

ファイルを開くダイアログ6

複数ファイルを一括選択・処理する

ユーザが選択した複数のファイルに対して、同一の処理を繰り返し行うパターンです。

たとえば、社内の各部署から回収した同一形式のExcelファイルに対して同一のマクロを実行する場合、1ファイルずつ選択するのは面倒くさいですよね。

下記のように、複数ファイルをまとめて処理することも可能です。

ファイルを開くダイアログ3

コードがこちらです。

ファイルを開くダイアログで、処理対象のファイルをすべて選択します。

【複数ファイルの選択方法】Shiftキー または Ctrlキー を押しながらファイルを選択します。

ファイルを開くダイアログ7

GetOpenFilenameメソッドのオプション MultiSelect:=True(複数ファイル選択可)とした場合、その返り値は「配列形式」です。

そのため、あらかじめ変数fNameをVariant型で宣言しています。

ファイルを開くダイアログ8

ユーザがキャンセルした場合はBoolean型のFalseが返ります。

ファイルを開くダイアログ10

GetOpenFilenameの返り値が「配列形式」という特性を利用して、「変数fNameが配列であるか否か」でキャンセル判定をします。

If Not IsArray(fName) Then

※GetOpenFilenameメソッドのオプションで MultiSelect:=True(複数ファイル選択可) とした場合、選択されたファイルが1つのみでも、返り値は配列形式です。

まとめ

「ファイルを開くダイアログ」を使うと、処理対象のファイルとマクロファイルを分けることができる。

処理対象のファイルの形式(.xlsx)を変えたくない場合や、同一フォーマットのExcelファイルに同一処理を実行したい場合に便利!