VBA Stepup2
第2章 ブックの指定
ワークシートの指定ができると、アクティブになっているブック内のワークシートの操作は自由にできるようになります。ただし他のブック(ファイル)を操作することはできません。他のブックの参照しながら実行するにはブックの指定が欠かせません (実務では避けられません)。
ブックの指定方法もワークシートの指定と同様、直接指定する方法とSetステートメントを使用する方法があります。
ブックを直接指定する方法
ブックには、現在マクロ実行しているブックとそれ以外のブックと2種類に分けます。 現在マクロを実行しているブックは以下の指定だけになります。
ThisWorkbook
ブックの指定を省略すると、ThisWorkbookが使われます。マクロを実行しているブックのSheet1のワークシートのA1セルを指定する場合は以下のとおりです。
ThisWorkBook.Worksheets("Sheet1").Cells(1, 1)
マクロを実行していないBook2.xlsxの場合は、Workbooks("Book2.xlsx")と考えたくなりますが、これはBook2.xlsxを既に開いている場合のみ操作が可能なのです。プログラミングに慣れていない方にありがちなことですが、ブックを開かないで実行しようとしますが、開いていないブックを利用するには、まずブックを開く操作が必要です。ブックを開いてしまえば、Workbooks("Book2.xlsx")は可能になります。
そこで他のブックを使うにはまず最初にブック名Book2.xlsxのファイルを開きます。(このファイルはマクロを実行しているブックと同じフォルダにあることが前提です。別のフォルダの場合はフォルダ名まで必要です。)
Workbooks.Open Filename:="Book2.xlsx"
開いた直後のブックが最前面になるので、Workbooks("Book2.xlsx") あるいは ActiveWorkBookとして利用ができます。
一連の流れで、ブックBook2.xlsxのSheet1のワークシートのA1セル記述すると以下のとおりとなります。
Workbooks.Open Filename:="Book2.xlsx"
Workbooks("Book2.xlsx").WorkSheets("Sheet1").Cells(1, 1)
あるいは
ActiveWorkbook.WorkSheets("Sheet1").Cells(1, 1)
注意が必要なのは、ブックを開く操作は1回のみです。開いてしまえばそのブックは閉じるまで利用が可能です。
※ファイルを開くという操作は、ディスクにあるファイルをメモリに読み込む操作です。PCのCPUはメモリにあるデータは処理できますが、メモリになくてディスクにあるデータは処理できないのです。VBAはCPUに働きかけながら処理します。VBAで利用するブックごとに1回は開くという操作をします。
Setステートメントでオブジェクト変数を使う場合
ブックにおいても毎回、WorkBooks("Book2")を指定するのは煩わしいです。しかも、開くブックが1つとは限りません。そのうえシート名の指定までしなければなりません。そこでブックの指定もワークシートと同様に、Setステートメントを使用します。
Setステートメントで、ブックを変数にセットします。マクロの実行しているブックと実行していないブックの指定は以下のとおりです。
Dim Wb1 As Workbook, Wb2 As Workbook
Set Wb1 = ThisWorkBook
Set Wb2 = Workbooks.Open Filename:="Book2.xlsx"
これでWb1の変数にマクロの実行しているブックがセットされ、Wb2という変数にBook2.xlsxがセットされます。
Wb1.WorkSheets("Sheet1").Cells(1, 1)
←マクロブックのSheet1のA1セル
Wb2.WorkSheets("Sheet1").Cells(1, 1)
←Book2.xlsxのSheet1のA1セル
オブジェクト変数はブックもシートも使えますので、両方使うことが多いです。両方使う場合は以下のとおりです。
Dim Wb1 As Workbook, Wb2 As Workbook
Dim Ws1 As Worksheet, Ws2 As Worksheet
Set Wb1 = ThisWorkBook
Set Wb2 = Workbooks.Open Filename:="Book2.xlsx"
Set Ws1 = Wb1.WorkSheets("Sheet1")
Set Ws2 = Wb2.WorkSheets("Sheet1")
Ws1.Cells(1, 1)
Ws2.Cells(1, 1)
一見オブジェクト変数を使うと指定が多くなるようですが、1行当たりの文字数が少なくなるので明らかに見やすいです。複数のブックにまたがる処理をする場合は、オブジェクト変数を使うことが多いです。
単純に、開いているファイルに対してマクロを実行する場合は、ブックの操作は必要ありません。 ただし、毎月発生するデータのブックの名前が決まっていて、そのブックを読んで別名で保存するとなると、どうしてもブックの指定が必須となります。毎月発生するデータのファイル名やシート名をルール化できれば、VBAでのブックやワークシートの指定がしやすくなります。