前回までで基本の構文は習得できたと思うので、
今回は複数のシート・ブックを扱えるよう知識を広げていきましょう。
ワークシートやワークブックを指定する時には、いくつか方法があります。
① ワークシート
ActiveSheet
Worksheets (番号)
Worksheets("名前")
※たいていの場合「Worksheets」は「Sheets」としても大丈夫です。
② ワークブック
ThisWorkbook
ActiveWorkbook
Workbooks ("ブック名")
Workbooks.open "パス"
ワークシートやワークブックを指定する際に、上記を文ごとに毎回入力していると、長文になり見にくいです。
また、ActiveSheetやActiveWorkbookは特に、操作するオブジェクトを間違いやすいのでオブジェクト変数に格納して使用することをおススメします。
是非分かりやすい変数名を付けてあげてくださいね。
オブジェクト変数の使い方は、ActiveSheetやActiveWorkbookの項目を参考にしてみてください。
::::::::::::::::::::::::::::::::::::::
まずは、①ワークシートから見ていきましょう。
ActiveSheet
選択状態になっているシートのことです。「アクティブシート」とも言います。
※ちなみに選択状態のセルを「アクティブセル」といいます。
ActiveSheet.Range("A1").Select
複数のシートを扱う際、 プロシージャの内容によってはActiveSheetが入れ替わり、別シートを操作してしまう可能性があるため、 注意が必要です。
オブジェクト変数に格納して使うと間違えにくいです。
オブジェクト変数の使い方は覚えているでしょうか?
ワークシートなので変数の型はWorksheetで、オブジェクトを変数に入れるときはSetを付けるんでしたね。
Dim Asheet As Worksheet
Set ASheet = ActiveSheet
ASheet.Range("A1").Select
Worksheets (番号)
選択状態になっている(アクティブ)ブックの左端のシートを1として、左から何番目のシートか示すものです。 該当のシートが無いと、エラーになります。
Worksheets(2).Range("A1") = "Sheet2"
3シート目を開いている状態でマクロを起動しましたが、2シート目を開くとちゃんと指定した通り文字入力されています。
Worksheets("シート名")
選択状態の(アクティブ)ブックのシート名で指定できます。 該当のシートが無いと、エラーになります。
Worksheets("Sheet3").Range("A1") = "Sheet3"
こちらもシート番号の時と同様、違うシートを開いてマクロを起動しましたが、3シート目に指定した通り文字入力されています。
次に②ワークブックを見てみましょう。
ThisWorkbook
記載したサブプロシージャが保存されているワークブックを指定します。
例えば、Book1.xlsmとBook2.xlsmがあり、Book2.xlsmに下記をコーディングしているとします。
すると、Book1.xlsmをアクティブにしてマクロを実行しても、Book2.xlsmを操作できるのです。
ThisWorkbook.Worksheets(1).Range("A1") = "A1"
つまり、通常は、ワークシートやワークブックなどのオブジェクトを省略すると、アクティブブックのアクティブシートに対して操作するようになっていますが、
ThisWorkbookを使うと、誤って違うブックをアクティブにしてマクロを起動してしまっても、記載したサブプロシージャが保存されているブックに対して操作できるので、間違いを抑制できます。
エクセルブックを複製すれば、自動的にブックに保存しているマクロも複製されるので便利です。
ただし、CSVデータをダウンロードしてデータ加工をするような場合は、毎回Subプロシージャをコピペする必要が出てきてしまうため、別の指定の仕方の方がよいでしょう。
ActiveWorkbook
現在選択されているワークブックを指定します。
ブック名が毎回変わって予測できないときなどは、ActiveWorkbookを使って指定します。
ActiveWorkbook.ActiveSheet.Range("A1") = "A1"
アクティブブックもアクティブシートと同様に、操作する中で切り替わってしまうことがあるので、オブジェクト変数に入れておきましょう。
Dim ABook As Workbook
Set ABook = ActiveWorkbook
ABook.Worksheets(1).Range("A1") = "A1"
Set ABook = ActiveWorkbook
ABook.Worksheets(1).Range("A1") = "A1"
ちなみに、3つ以上のブックを使うときは、ThisWorkbookとActiveWorkbookを駆使するとしても、ブック名が予測できないブックを指定するのは困難です。
毎回ブック名を書き直して指定するしかありません。
そういった手間はできるだけ省きたいものですね。
Workbooks ("ブック名")
ワークブック名で指定できます。
開いているワークブックの中に指定した名前のものが無いとエラーになります。
Workbooks("Book1.xlsm").ActiveSheet.Range("A1") = "A1"
ブック名が毎回同じ時はブック名で指定できます。
日付など一部だけブック名が変わる場合は、InputBoxと組み合わせるなど工夫すれば、簡単にブック名を指定できます。
例えば、「○○Book1.xlsm」の○○が日付になっているブックをよく使う場合、
Dim 日付 As String
日付 = InputBox("日付を入力してください")
Workbooks(日付 & "Book1.xlsm").ActiveSheet.Range("A1") = "A1"
日付 = InputBox("日付を入力してください")
Workbooks(日付 & "Book1.xlsm").ActiveSheet.Range("A1") = "A1"
とすれば、下記のようなInputBoxに都度日付を入力するだけで、ブックを指定できます。
コードの手直しがいりません。
Workbooks.open "パス"
ワークブックが格納されている場所を示すパスを指定すれば、ワークブックを閉じていても操作できます。
フォルダ内の全ブックに同じ操作をしたいときなどに便利です。
パスを確認する方法は、
アドレスバー(赤枠のあたり)をクリックするか
エクセルブックを右クリックして、プロパティから見れます。
上記の場合、このように書けます。
Workbooks.Open "C:\Users\ユーザー名\Desktop\Book1.xlsm"
ActiveWorkbook.ActiveSheet.Range("A1") = "A1"
ActiveWorkbook.ActiveSheet.Range("A1") = "A1"
::::::::::::::::::::::::::::::::::::::
ここまでの内容を使えるようになれば、 あなたは大抵のことをマクロで出来るようになったはずです。
今後の練習問題をこなしていく中で、徐々に自在に使えるようにしていきましょう。
そのうち、どれを使ったらやりやすいか分かってくると思います。
後は、細かいテクニックや変則的なデータ等にどうやって対応していくのかを身に着ければ、より実践的になります。
お疲れ様でした。