【Excel VBA】Worksheetを変数に入れてコードを効率化する 〜オブジェクト変数〜

Excel VBA

オブジェクト変数を使えるようになると、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ワークブックがあるとします。

  1. [最新版_確定版_最終版_New_Fix_2023]シート
  2. [本当に最後_最新版_確定版_最終版_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度ずつ。

各ワークシートは次のオブジェクト変数に格納しています。

  1. srcWs <— [最新版_確定版_最終版_New_Fix_2023]シート
  2. targetWs <— [本当に最後_最新版_確定版_最終版_New_Fix_2023]シート

以降、各ワークシートはsrcWstargetWsと書くだけで呼び出すことができます。

もし運用中にシート名が変更されたとしても、修正する部分は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コードを効率化しましょう!

Excel VBA
\ お友だちにも教えてあげましょう/
プロフィール
最適屋

Excel VBAとAccessを独学で習得。2011年から現在まで株式会社アントレ(旧: 株式会社リクルート アントレユニット)と業務委託契約。Excel/Accessで開発した様々な効果集計ツール・営業支援ツールを提供。

Excelで業務効率化| 川良最適化事務所
タイトルとURLをコピーしました