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ファイルに同一処理を実行したい場合に便利!
 
								











