オブジェクト変数を使えるようになると、VBAコードを短く・見やすく・変更しやすくできます。
マクロ初心者のうちにぜひ習得しておきたいテクニックです。
オブジェクト変数をうまく使って、VBAコードの効率化を目指しましょう。
オブジェクト変数とは?
オブジェクト変数は、Excelを構成するさまざまなモノ(オブジェクト)を格納できる変数です。
通常の「変数」には文字列や数字を格納しますが、オブジェクト変数にはワークブック・ワークシート・セルの範囲などを格納できます。
たとえば、頻繁に登場するワークシートをオブジェクト変数に入れておけば、何度も呼び出して使えるので、VBAコードの効率化につながります。
オブジェクト変数の宣言方法と格納方法
ワークシートをオブジェクト変数で使用する際の、VBAコード例です。
オブジェクト変数の宣言方法
'オブジェクト変数の宣言
Dim srcWs As Worksheet
通常の変数宣言に似ていますが、As 以降にはオブジェクトを指定します。
ワークシートのオブジェクトは「Worksheet」です。Worksheetsではないので要注意。
オブジェクト変数への格納方法
'オブジェクト変数にワークシートを格納
Set srcWs = Worksheets("最新版_確定版_最終版_New_Fix_2023")
オブジェクト変数にオブジェクトを格納するときは、Set 変数名 = を使います。
かつて「Setを使い終わったらNothingで破棄すること」という言い伝えがありました。が、使わなくなったオブジェクト変数は自動的に破棄されるので、気にすることはありません。
Worksheetオブジェクトのメソッド
Worksheetオブジェクト変数は、Worksheetのメソッドを使うことができます。
VBAコーディング実践|Worksheetをオブジェクト変数に使ったシート間のコピー&ペースト
Worksheetをオブジェクト変数に格納する実践例です。
よくあるケースとして、シート間でコピー&ペーストする場合のVBAコードを書いてみましょう。
このような2シート構成のExcelワークブックがあるとします。
- [最新版_確定版_最終版_New_Fix_2023]シート
- [本当に最後_最新版_確定版_最終版_New_Fix_2023]シート
それぞれのシート名が意味をなさないほど長い…という悪例です。
現場にはこういうのが溢れています。
では、[最新版_確定版_最終版_New_Fix_2023]シートの内容を、[本当に最後_最新版_確定版_最終版_New_Fix_2023]シートにコピペするマクロを書いてみましょう。
オブジェクト変数を使っていないVBAコードの例
オブジェクト変数を使わずに書きました。
'オブジェクト変数を使わない例
Sub copy_to_Worksheets()
'コピー元シートのCurrentRegionをコピー
Worksheets("最新版_確定版_最終版_New_Fix_2023").Activate
Worksheets("最新版_確定版_最終版_New_Fix_2023").Range("A1").CurrentRegion.Copy
'コピー先シートのセルA1にペースト
Worksheets("本当に最後_最新版_確定版_最終版_New_Fix_2023").Activate
Worksheets("本当に最後_最新版_確定版_最終版_New_Fix_2023").Range("A1").PasteSpecial Paste:=xlPasteAll
End Sub
これでも問題なく動くことは動くのですが…。
長いシート名が2回以上登場してくるのは目障り。効率化した方が良いです。
このまま運用に乗せてしまうと、シート名が変わったとき、最大で4箇所も修正しなければなりません。
オブジェクト変数でVBAコードを効率化した例
オブジェクト変数を使用して書きました。
'オブジェクト変数を使った例
Sub copy_to_Worksheets_ObjectSet()
'各ワークシートをオブジェクト変数に格納
Dim srcWs As Worksheet
Set srcWs = Worksheets("最新版_確定版_最終版_New_Fix_2023")
Dim targetWs As Worksheet
Set targetWs = Worksheets("本当に最後_最新版_確定版_最終版_New_Fix_2023")
'コピー元シートのCurrentRegionをコピー
srcWs.Activate
srcWs.Range("A1").CurrentRegion.Copy
'コピー先シートのセルA1にペースト
targetWs.Activate
targetWs.Range("A1").PasteSpecial Paste:=xlPasteAll
End Sub
長いシート名が登場するのは、最初に1度ずつ。
各ワークシートは次のオブジェクト変数に格納しています。
- srcWs <— [最新版_確定版_最終版_New_Fix_2023]シート
- targetWs <— [本当に最後_最新版_確定版_最終版_New_Fix_2023]シート
以降、各ワークシートはsrcWsやtargetWsと書くだけで呼び出すことができます。
もし運用中にシート名が変更されたとしても、修正する部分は2箇所です。
おまけ:With構文を使ってVBAコードをさらに効率化した例
同じワークシートに対する処理は、With〜End With構文(ステートメント)でまとめることができます。
'オブジェクト変数・Withを使ったコピペの例
Sub copy_to_Worksheets_ObjectSet_With()
'各ワークシートをオブジェクト変数に格納
Dim srcWs As Worksheet
Set srcWs = Worksheets("最新版_確定版_最終版_New_Fix_2023")
Dim targetWs As Worksheet
Set targetWs = Worksheets("本当に最後_最新版_確定版_最終版_New_Fix_2023")
'コピー元シートのCurrentRegionをコピー
With srcWs
.Activate
.Range("A1").CurrentRegion.Copy
End With
'コピー先シートのセルA1にペースト
With targetWs
.Activate
.Range("A1").PasteSpecial Paste:=xlPasteAll
End With
End Sub
With構文についてはまた別の記事で解説します。
まとめ
今回はWorksheet(ワークシート)をオブジェクト変数に格納して使う方法を解説しました。
オブジェクト変数には、Workbook(ワークブック)、Range(セル範囲)なども入れられるので、マクロで実現したい処理が複雑になるほど、重要性を帯びてきます。
オブジェクト変数をうまく使って、VBAコードを効率化しましょう!