エクセルVBAでオブジェクト変数を使う方法 | マクロの基本と応用

オブジェクト変数とは? VBA

VBAを勉強していて、オブジェクト変数って何??と悩んだことはありませんか?

お悩みポイント
悩む人
  • オブジェクト変数ってなに?
  • オブジェクト変数は、通常の変数と何が違うのか?分からない。。。

この記事では、エクセルVBAのオブジェクト変数の使い方について詳しく説明します。

基本的な使い方から応用的なテクニックまで、初心者でもすぐに実践できる内容です。

ぜひ最後までお読みください。


【 この記事の概要 】

  よく使う度    4.0  
  難しさ     3.0  
  覚えておくと安心度    4.5  

この記事を見てできるようになること

この記事を読めば、以下のことができるようになります。

この記事を見てできるようになること

変数とは?

VBAにおける変数は、データを一時的に記憶するための箱のようなものです。
プログラム内でデータを扱う際に、変数を使うことでデータを柔軟に操作できます。

変数の説明を箱を用いて説明

変数の基本についてもっと知りたい方は、以下の記事で詳しく解説しています。
こちらもぜひご覧ください。

VBAにおける各変数の違い

VBAには、さまざまな種類の変数があります。
以下に代表的な変数を紹介します。

種類説明
通常の変数データを一時的に記憶するための箱。
スコープは宣言されたプロシージャ内のみ。
グローバル変数プロジェクト全体で使用可能な変数。
モジュールの先頭で宣言され、すべてのプロシージャからアクセス可能。
大規模なプログラムでデータを共有するのに便利。
静的変数プロシージャの間で値を保持する変数。
Staticキーワードを使用して宣言され、プロシージャが終了しても値が
保持される。
計算の状態を保持したい場合に使用。
オブジェクト変数オブジェクトを参照するための変数。
Setステートメントを使用してオブジェクトを代入し、プロパティや
メソッドにアクセス可能。
エクセルのワークシートやセルなどの操作に使用。

今回の記事では、その中でも オブジェクト変数 について詳しく解説していきます。

オブジェクト変数とは?

それでは、オブジェクト変数について解説します。

通常の変数とオブジェクト変数の違い

通常の変数は、数値や文字列などの単一のデータを格納するために使用されます。

一方、オブジェクト変数は、エクセルのワークシートやセルなどオブジェクト全体を参照するために使用されます。

オブジェクト変数を使用することで、オブジェクトのプロパティやメソッドにアクセスしやすくなります。

種類説明
通常の変数数値や文字列などの単一のデータを格納するための変数。
オブジェクト変数ワークシートやセルなどのオブジェクトを参照するための変数。

オブジェクト変数の宣言方法

オブジェクト変数を宣言する際には、Dimステートメントを使用し、オブジェクトを代入するためにSetステートメントを使用します。

変数の構成

オブジェクト変数の宣言方法は、以下の通りです。

オブジェクト変数の構成

【 使用例 】

Dim Ws As Worksheet
Set Ws = ThisWorkbook.Sheets("Sheet1")

このコードは、変数「Ws」をワークシート型で宣言し、「Sheet1」を参照するように設定します。

また、1行で記述を行いたい場合、次のように「:」で区切ることで可能となります。

Dim Ws As Worksheet: Set Ws = ThisWorkbook.Sheets("Sheet1")

より詳しい情報は、Microsoft公式 – オブジェクト変数の作成を参照してみてください。

オブジェクト変数を使用する際の注意ポイント

オブジェクト変数を使用するにあたって、下記の注意ポイントがあります。

  1. オブジェクト変数の初期化
    • オブジェクト変数は、必ずSet ステートメント」を使ってオブジェクトを代入しましょう
      忘れると「オブジェクト変数またはWithブロック変数が設定されていません」エラーが発生します。
  2. オブジェクトの解放
    • オブジェクト変数を使った後は、Set 変数名 = Nothing」のコードを実行することでメモリを解放することが推奨されます。
      これにより、メモリリークを防ぎ、プログラムが安定して動作するようになります。
  3. 同名の変数に注意
    • 同じスコープ内で通常の変数とオブジェクト変数を同名で宣言しないようにしましょう
      同名の変数が存在すると混乱を招き、予期しない動作が起こる可能性があります。
  4. オブジェクトが存在しない場合のエラーハンドリング
    • ワークシートやワークブックなどをオブジェクト変数に代入する際、そのオブジェクトが存在しない場合にエラーが発生することがあります
      必ずエラーハンドリング (On Error ステートメント) を追加して、エラー時に適切な処理を行うようにしましょう。

オブジェクト変数の使用例

ここでは、具体的なコード例を通じてオブジェクト変数の使い方を紹介します。

使用例1: ブックをオブジェクト変数として宣言する

ブックをオブジェクト変数「Wb」として宣言し、処理を行う方法を紹介します。

Sub ワークブックを開く()
    Dim Wb As Workbook
    Set Wb = Workbooks.Open("C:\パス\ファイル名.xlsx")
    
    '// ここでWbを使用して操作を行う (例:シート1のA1セルに値を設定)
    Wb.Sheets("Sheet1").Range("A1").Value = "Hello, World!"
    Wb.Close SaveChanges:=True

    Set Wb = Nothing  '// オブジェクト変数を解放する

End Sub

解説

コードの詳細
  1. Sub ワークブックを開く()
    • この行では、VBAのサブルーチン(Sub)が定義されています。
      サブルーチンは一連の操作を行うコードブロックで、ワークブックを開く」という名前の処理を開始します。
  2. Dim Wb As Workbook
    • この行では、変数「Wb」が宣言されています。
      「Wb」はワークブック型(Workbook)のオブジェクト変数で、これに開くワークブックの情報が格納されます。
  3. Set Wb = Workbooks.Open(“C:\パス\ファイル名.xlsx”)
    • この行では、「Setステートメント」を使って「Wbに指定されたパスのワークブックを代入しています
      Workbooks.Open() メソッドは、指定したパスにあるエクセルファイルを開くためのメソッドです。
      Set を使うことで、変数「Wb」に開いたワークブックを割り当てています

      ※Workbooks.Open() メソッドについては、別記事で解説を行っています。
       解説の最後にリンクを記載しておきますので、気になる方は合わせてご覧ください。
  4. ‘// ここでWbを使用して操作を行う (例:シート1のA1セルに値を設定)
    • このコメント行は、コード内で行われる操作の説明をしています。
      ここでは「Wb」を使用して、操作を行う場所を明示しています。
      コメントは実行されないため、説明としてコード内に残されています。
  5. Wb.Close SaveChanges:=True
    • この行では、「Wbで開いていたワークブックを閉じています
      SaveChanges:=True の指定により、変更が保存されてからワークブックが閉じられます。
      もし変更を保存せずに閉じたい場合は、SaveChanges:=False と指定します。

      ※Workbooks.Close() メソッドについては、別記事で解説を行っています。
       解説の最後にリンクを記載しておきますので、気になる方は合わせてご覧ください。
  6. Set Wb = Nothing ‘// オブジェクト変数を解放する
    • この行では、オブジェクト変数「Wb」に代入されていたワークブックオブジェクトを解放しています。
      Set Wb = Nothing と記述することで、変数「Wb」に格納されていたオブジェクトへの参照が切れ、メモリが解放されます。
      これを実行しないと、不要になったオブジェクトがメモリに残り続け、メモリリークを引き起こす可能性があります。
  7. End Sub
    • この行でサブルーチンが終了します。
      Sub の処理範囲を明示的に終えるために使用されます。

このコードは、指定されたパスのブックを開き、「Sheet1」にあるセルA1に「Hello, World!」という値を設定し、保存して閉じます。

使用例2: シートをオブジェクト変数として宣言する

シートをオブジェクト変数「Ws」として宣言し、処理を行う方法を紹介します。

Sub ワークシートを参照する()
    Dim Ws As Worksheet
    Set Ws = ThisWorkbook.Sheets("Sheet1")

    '// ここでWsを使用して操作を行う (例:セルA1に値を設定)
    Ws.Range("A1").Value = "Hello, World!"

    Set Ws = Nothing  '// オブジェクト変数を解放する

End Sub

解説

コードの詳細
  1. Sub ワークシートを参照する()
    • この行では、VBAのサブルーチン(Sub)が定義されています。
      サブルーチンは一連の操作を行うコードブロックで、ワークシートを参照する」という名前の処理を開始します。
  2. Dim Ws As Worksheet
    • この行では、変数「Ws」が宣言されています。
      「Ws」はワークシート型(Worksheet)のオブジェクト変数で、これに特定のワークシートの情報が格納されます。
  3. Set Ws = ThisWorkbook.Sheets(“Sheet1”)
    • この行では、「Setステートメント」を使って「Wsに現在のブック (ThisWorkbook) 内のシート「Sheet1」を代入しています。
      ThisWorkbook は現在開いているブックを指し、Sheets(“Sheet1”) はそのブック内のシート1を参照します。
      Set を使うことで、変数「Ws」に「Sheet1」を割り当てています。
  4. ‘// ここでWsを使用して操作を行う (例:セルA1に値を設定)
    • このコメント行は、コード内で行われる操作の説明をしています。
      ここでは「Ws」を使用して、操作を行う場所を明示しています。
      コメントは実行されないため、説明としてコード内に残されています。
  5. Ws.Range(“A1”).Value = “Hello, World!”
    • この行では、「Ws」で参照したシート「Sheet1」のセル「A1」 に “Hello, World!” という文字列を入力しています。
      Ws.Range(“A1”).Value では、「Ws」に割り当てられたシート 「Sheet1」のセル「A1」の値を設定します。
  6. Set Ws = Nothing ‘// オブジェクト変数を解放する
    • この行では、オブジェクト変数「Ws」に代入されていたワークシートオブジェクトを解放しています。
      Set Ws = Nothing と記述することで、変数「Ws」に格納されていたワークシートへの参照が切れ、メモリが解放されます。
      これを行うことで、不要になったオブジェクトがメモリに残るのを防ぎ、メモリリークのリスクを減らします。
  7. End Sub
    • この行でサブルーチンが終了します。
      Sub の処理範囲を明示的に終えるために使用されます。

このコードは、現在のワークブック内の「Sheet1」をオブジェクト変数「ws」に格納し、セルA1に値を入力します。

使用例3: オブジェクト変数でセル範囲を操作する

オブジェクト変数でセル範囲「Rng」として宣言し、処理を行う方法を紹介します。

Sub セル範囲を操作する()
    Dim Rng As Range
    Set Rng = ThisWorkbook.Sheets("Sheet1").Range("A1:B2")
    
    '// ここでRngを使用して操作を行う (例:範囲内のセルに値を設定)
    Rng.Value = "Test"

    Set Rng = Nothing  '// オブジェクト変数を解放する

End Sub

解説

コードの詳細
  1. Sub セル範囲を操作する()
    • この行では、VBAのサブルーチン(Sub)が定義されています。
      サブルーチンは一連の操作を行うコードブロックで、セル範囲を操作する」という名前の処理を開始します。
  2. Dim Rng As Range
    • この行では、変数「Rng」が宣言されています。
      「Rng」はセルの範囲を表すオブジェクト変数で、特定のシート内のセル範囲を格納します。
  3. Set Rng = ThisWorkbook.Sheets(“Sheet1”).Range(“A1:B2”)
    • この行では、Set ステートメントを使って「Rng」に現在のブック (ThisWorkbook) 内のシート「Sheet1」のセル範囲「A1:B2」を代入しています。
      ThisWorkbook.Sheets(“Sheet1”).Range(“A1:B2”) は、シート「Sheet1」のセル範囲「A1」から「B2」までを参照します。
      Set を使うことで、変数「Rng」にこのセル範囲を割り当てています。
  4. ‘// ここでRngを使用して操作を行う (例:範囲内のセルに値を設定)
    • このコメント行は、コード内で行われる操作の説明をしています。
      ここでは「Rng」を使用して、セル範囲「A1:B2」に対して操作を行うことが明示されています。
      コメントは実行されないため、説明としてコード内に残されています。
  5. Rng.Value = “Test”
    • この行では、「Rng」で参照されたセル範囲「A1:B2」に “Test” という値を設定しています。
      Rng.Value では、参照されている範囲内の全てのセルに対して同じ値を一括で設定することができます。
      ここでは「A1」から「B2」の4つのセルに “Test” が入力されます。
  6. Set Rng = Nothing ‘// オブジェクト変数を解放する
    • この行では、オブジェクト変数「Rng」に代入されていたセル範囲オブジェクトを解放しています。
      Set Rng = Nothing と記述することで、変数「Rng」に格納されていたセル範囲への参照が切れ、メモリが解放されます。
      これにより、使用済みのオブジェクトがメモリに残るのを防ぎ、メモリの効率的な利用が可能になります。
  7. End Sub
    • この行でサブルーチンが終了します。
      Sub の処理範囲を明示的に終えるために使用されます。

このコードは、「Sheet1」のセル範囲A1からB2をオブジェクト変数「Rng」に格納し、その範囲に値を入力します。

まとめ

オブジェクト変数を理解し、効率的に使用することは、VBAプログラミングにおいて非常に重要です。

今回の記事を通して、オブジェクト変数の基本的な使い方や、その利点について学びました。それでは、記事の重要なポイントをもう一度おさらいしましょう。

ポイントのおさらい

さらに学ぶために

オブジェクト変数の基本を押さえた後は、グローバル変数や静的変数など、他の変数タイプにも目を向けてみてください。
それぞれが持つ特定の用途と利点を理解することで、VBAの操作がさらに効率的になります。

今回の記事を活用し、VBAプログラミングにおけるオブジェクト変数の使い方を身につけ、より効率的に業務をこなせるようになりましょう。

タイトルとURLをコピーしました