Excel作業をマクロで自動化するには、おもに2つのパターンがありますね。
①処理対象のファイルにマクロを含ませる(一体化)
②処理対象のファイルとマクロファイルを別々に分ける
(①のほうが便利ですが、会社の色々な事情で一体化すると都合の悪いこともありますよね)
「処理対象のExcelファイル(.xlsx)」 と 「マクロファイル(.xlsm)」 を分ける方法を紹介します。
GetOpenFilenameメソッドで「ファイルを開くダイアログ」を出現させ、ユーザが処理対象のファイルを選択する
→そのファイルに対してマクロ処理する
という流れです。
ユーザが選択したファイルに対して処理を実行する方法
1ファイルに対して処理をする
まずはこのパターンです。
コードがこちらです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Sub Macro1() Dim fName As String fName = Application.GetOpenFilename(FileFilter:="Excelブック,*.xls*", MultiSelect:=False) If fName = "False" Then MsgBox "キャンセルしました。" Exit Sub '終了 End If Dim wb As Workbook Set wb = Workbooks.Open(fName) '-------- ここ以降に、wbに対する処理を書く -------- '(例) wb.Sheets(1).Range("A1").Value = "Hello World" End Sub |
マクロを実行すると、ファイルを開くダイアログが登場します。
変数fNameには、選択したファイルのフルパスが格納されます。
ファイルが選択されなかった場合(ユーザがキャンセルした場合)、文字列型のFalseが返ります。
GetOpenFilenameメソッドは、「ユーザが指定したファイルのフルパス」を取得するのみで、ファイルを開く操作までは行いません。
ファイルを開く処理は、WorkBooks.Openメソッドで実行します。
Set wb = Workbooks.Open(fName)
で、「開いたファイル」を「変数wb」にオブジェクトとして格納するので、あとはwbに対する処理を記述すればOKです。
たとえば、こんな記述をすると、
wb.Sheets(1).Range("A1").Value = "Hello World"
ユーザが選択したファイル(wb)に対して、ちゃんと処理が実行されているのを確認できます。
複数ファイルを一括選択・処理する
ユーザが選択した複数のファイルに対して、同一の処理を繰り返し行うパターンです。
たとえば、社内の各部署から回収した同一形式のExcelファイルに対して同一のマクロを実行する場合、1ファイルずつ選択するのは面倒くさいですよね。
下記のように、複数ファイルをまとめて処理することも可能です。
コードがこちらです。
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 |
Sub Macro2() Dim fName As Variant fName = Application.GetOpenFilename("Excelブック,*.xls*", MultiSelect:=True) If Not IsArray(fName) Then MsgBox "キャンセルしました。" Exit Sub '終了 End If '選択したブックの数、処理を繰り返す Dim n As Long '選択したファイル数 For n = LBound(fName) To UBound(fName) Dim wb As Workbook Set wb = Workbooks.Open(fName(n)) 'n番目のファイルを開いてwbオブジェクトに格納 '--------- ここに処理内容を記述 --------- 'ファイル保存・ファイルを閉じる処理など Set wb = Nothing 'いったん解放 Next n End Sub |
ファイルを開くダイアログで、処理対象のファイルをすべて選択します。
【複数ファイルの選択方法】Shiftキー または Ctrlキー を押しながらファイルを選択します。
GetOpenFilenameメソッドのオプション MultiSelect:=True(複数ファイル選択可)とした場合、その返り値は「配列形式」です。
そのため、あらかじめ変数fNameをVariant型で宣言しています。
ユーザがキャンセルした場合はBoolean型のFalseが返ります。
GetOpenFilenameの返り値が「配列形式」という特性を利用して、「変数fNameが配列であるか否か」でキャンセル判定をします。
If Not IsArray(fName) Then
※GetOpenFilenameメソッドのオプションで MultiSelect:=True(複数ファイル選択可) とした場合、選択されたファイルが1つのみでも、返り値は配列形式です。
「ファイルを開くダイアログ」を使うと、処理対象のファイルとマクロファイルを分けることができる。
処理対象のファイルの形式(.xlsx)を変えたくない場合や、同一フォーマットのExcelファイルに同一処理を実行したい場合に便利!