VBAを勉強していて、オブジェクト変数って何??と悩んだことはありませんか?
この記事では、エクセルVBAのオブジェクト変数の使い方について詳しく説明します。
基本的な使い方から応用的なテクニックまで、初心者でもすぐに実践できる内容です。
ぜひ最後までお読みください。
【 この記事の概要 】
よく使う度 | |
難しさ | |
覚えておくと安心度 |
この記事を見てできるようになること
この記事を読めば、以下のことができるようになります。
変数とは?
VBAにおける変数は、データを一時的に記憶するための箱のようなものです。
プログラム内でデータを扱う際に、変数を使うことでデータを柔軟に操作できます。
変数の基本についてもっと知りたい方は、以下の記事で詳しく解説しています。
こちらもぜひご覧ください。
VBAにおける各変数の違い
VBAには、さまざまな種類の変数があります。
以下に代表的な変数を紹介します。
今回の記事では、その中でも オブジェクト変数 について詳しく解説していきます。
オブジェクト変数とは?
それでは、オブジェクト変数について解説します。
通常の変数とオブジェクト変数の違い
通常の変数は、数値や文字列などの単一のデータを格納するために使用されます。
一方、オブジェクト変数は、エクセルのワークシートやセルなど、オブジェクト全体を参照するために使用されます。
オブジェクト変数を使用することで、オブジェクトのプロパティやメソッドにアクセスしやすくなります。
種類 | 説明 |
---|---|
通常の変数 | 数値や文字列などの単一のデータを格納するための変数。 |
オブジェクト変数 | ワークシートやセルなどのオブジェクトを参照するための変数。 |
オブジェクト変数の宣言方法
オブジェクト変数を宣言する際には、Dimステートメントを使用し、オブジェクトを代入するためにSetステートメントを使用します。
変数の構成
オブジェクト変数の宣言方法は、以下の通りです。
【 使用例 】
Dim Ws As Worksheet
Set Ws = ThisWorkbook.Sheets("Sheet1")
このコードは、変数「Ws」をワークシート型で宣言し、「Sheet1」を参照するように設定します。
また、1行で記述を行いたい場合、次のように「:」で区切ることで可能となります。
Dim Ws As Worksheet: Set Ws = ThisWorkbook.Sheets("Sheet1")
より詳しい情報は、Microsoft公式 – オブジェクト変数の作成を参照してみてください。
オブジェクト変数を使用する際の注意ポイント
オブジェクト変数を使用するにあたって、下記の注意ポイントがあります。
- オブジェクト変数の初期化
- オブジェクト変数は、必ず「Set ステートメント」を使ってオブジェクトを代入しましょう。
忘れると「オブジェクト変数またはWithブロック変数が設定されていません」エラーが発生します。
- オブジェクト変数は、必ず「Set ステートメント」を使ってオブジェクトを代入しましょう。
- オブジェクトの解放
- オブジェクト変数を使った後は、
「
Set 変数名 = Nothing」のコードを実行することでメモリを解放することが推奨されます。
これにより、メモリリークを防ぎ、プログラムが安定して動作するようになります。
- オブジェクト変数を使った後は、
- 同名の変数に注意
- 同じスコープ内で通常の変数とオブジェクト変数を同名で宣言しないようにしましょう。
同名の変数が存在すると混乱を招き、予期しない動作が起こる可能性があります。
- 同じスコープ内で通常の変数とオブジェクト変数を同名で宣言しないようにしましょう。
- オブジェクトが存在しない場合のエラーハンドリング
- ワークシートやワークブックなどをオブジェクト変数に代入する際、そのオブジェクトが存在しない場合にエラーが発生することがあります。
必ずエラーハンドリング (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
解説
- Sub ワークブックを開く()
- この行では、VBAのサブルーチン(Sub)が定義されています。
サブルーチンは一連の操作を行うコードブロックで、「
ワークブックを開く」という名前の処理を開始します。
- この行では、VBAのサブルーチン(Sub)が定義されています。
- Dim Wb As Workbook
- この行では、変数「Wb」が宣言されています。
「Wb」はワークブック型(Workbook)のオブジェクト変数で、これに開くワークブックの情報が格納されます。
- この行では、変数「Wb」が宣言されています。
- Set Wb = Workbooks.Open(“C:\パス\ファイル名.xlsx”)
- この行では、「Setステートメント」を使って「Wb」に指定されたパスのワークブックを代入しています。
Workbooks.Open() メソッドは、指定したパスにあるエクセルファイルを開くためのメソッドです。
Set を使うことで、変数「Wb」に開いたワークブックを割り当てています。
※Workbooks.Open() メソッドについては、別記事で解説を行っています。
解説の最後にリンクを記載しておきますので、気になる方は合わせてご覧ください。
- この行では、「Setステートメント」を使って「Wb」に指定されたパスのワークブックを代入しています。
- ‘// ここでWbを使用して操作を行う (例:シート1のA1セルに値を設定)
- このコメント行は、コード内で行われる操作の説明をしています。
ここでは「Wb」を使用して、操作を行う場所を明示しています。
コメントは実行されないため、説明としてコード内に残されています。
- このコメント行は、コード内で行われる操作の説明をしています。
- Wb.Close SaveChanges:=True
- この行では、「Wb」で開いていたワークブックを閉じています。
SaveChanges:=True の指定により、変更が保存されてからワークブックが閉じられます。
もし変更を保存せずに閉じたい場合は、SaveChanges:=False と指定します。
※Workbooks.Close() メソッドについては、別記事で解説を行っています。
解説の最後にリンクを記載しておきますので、気になる方は合わせてご覧ください。
- この行では、「Wb」で開いていたワークブックを閉じています。
- Set Wb = Nothing ‘// オブジェクト変数を解放する
- この行では、オブジェクト変数「Wb」に代入されていたワークブックオブジェクトを解放しています。
Set Wb = Nothing と記述することで、変数「Wb」に格納されていたオブジェクトへの参照が切れ、メモリが解放されます。
これを実行しないと、不要になったオブジェクトがメモリに残り続け、メモリリークを引き起こす可能性があります。
- この行では、オブジェクト変数「Wb」に代入されていたワークブックオブジェクトを解放しています。
- 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
解説
- Sub ワークシートを参照する()
- この行では、VBAのサブルーチン(Sub)が定義されています。
サブルーチンは一連の操作を行うコードブロックで、「
ワークシートを参照する」という名前の処理を開始します。
- この行では、VBAのサブルーチン(Sub)が定義されています。
- Dim Ws As Worksheet
- この行では、変数「Ws」が宣言されています。
「Ws」はワークシート型(Worksheet)のオブジェクト変数で、これに特定のワークシートの情報が格納されます。
- この行では、変数「Ws」が宣言されています。
- Set Ws = ThisWorkbook.Sheets(“Sheet1”)
- この行では、「Setステートメント」を使って「Ws」に現在のブック (ThisWorkbook) 内のシート「Sheet1」を代入しています。
ThisWorkbook は現在開いているブックを指し、Sheets(“Sheet1”) はそのブック内のシート1を参照します。
Set を使うことで、変数「Ws」に「Sheet1」を割り当てています。
- この行では、「Setステートメント」を使って「Ws」に現在のブック (ThisWorkbook) 内のシート「Sheet1」を代入しています。
- ‘// ここでWsを使用して操作を行う (例:セルA1に値を設定)
- このコメント行は、コード内で行われる操作の説明をしています。
ここでは「Ws」を使用して、操作を行う場所を明示しています。
コメントは実行されないため、説明としてコード内に残されています。
- このコメント行は、コード内で行われる操作の説明をしています。
- Ws.Range(“A1”).Value = “Hello, World!”
- この行では、「Ws」で参照したシート「Sheet1」のセル「A1」 に “Hello, World!” という文字列を入力しています。
Ws.Range(“A1”).Value では、「Ws」に割り当てられたシート 「Sheet1」のセル「A1」の値を設定します。
- この行では、「Ws」で参照したシート「Sheet1」のセル「A1」 に “Hello, World!” という文字列を入力しています。
- Set Ws = Nothing ‘// オブジェクト変数を解放する
- この行では、オブジェクト変数「Ws」に代入されていたワークシートオブジェクトを解放しています。
Set Ws = Nothing と記述することで、変数「Ws」に格納されていたワークシートへの参照が切れ、メモリが解放されます。
これを行うことで、不要になったオブジェクトがメモリに残るのを防ぎ、メモリリークのリスクを減らします。
- この行では、オブジェクト変数「Ws」に代入されていたワークシートオブジェクトを解放しています。
- 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
解説
- Sub セル範囲を操作する()
- この行では、VBAのサブルーチン(Sub)が定義されています。
サブルーチンは一連の操作を行うコードブロックで、「
セル範囲を操作する」という名前の処理を開始します。
- この行では、VBAのサブルーチン(Sub)が定義されています。
- Dim Rng As Range
- この行では、変数「Rng」が宣言されています。
「Rng」はセルの範囲を表すオブジェクト変数で、特定のシート内のセル範囲を格納します。
- この行では、変数「Rng」が宣言されています。
- 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」にこのセル範囲を割り当てています。
- この行では、
- ‘// ここでRngを使用して操作を行う (例:範囲内のセルに値を設定)
- このコメント行は、コード内で行われる操作の説明をしています。
ここでは「Rng」を使用して、セル範囲「A1:B2」に対して操作を行うことが明示されています。
コメントは実行されないため、説明としてコード内に残されています。
- このコメント行は、コード内で行われる操作の説明をしています。
- Rng.Value = “Test”
- この行では、「Rng」で参照されたセル範囲「A1:B2」に “Test” という値を設定しています。
Rng.Value では、参照されている範囲内の全てのセルに対して同じ値を一括で設定することができます。
ここでは「A1」から「B2」の4つのセルに “Test” が入力されます。
- この行では、「Rng」で参照されたセル範囲「A1:B2」に “Test” という値を設定しています。
- Set Rng = Nothing ‘// オブジェクト変数を解放する
- この行では、オブジェクト変数「Rng」に代入されていたセル範囲オブジェクトを解放しています。
Set Rng = Nothing と記述することで、変数「Rng」に格納されていたセル範囲への参照が切れ、メモリが解放されます。
これにより、使用済みのオブジェクトがメモリに残るのを防ぎ、メモリの効率的な利用が可能になります。
- この行では、オブジェクト変数「Rng」に代入されていたセル範囲オブジェクトを解放しています。
- End Sub
- この行でサブルーチンが終了します。
Sub の処理範囲を明示的に終えるために使用されます。
- この行でサブルーチンが終了します。
このコードは、「Sheet1」のセル範囲A1からB2をオブジェクト変数「Rng」に格納し、その範囲に値を入力します。
まとめ
オブジェクト変数を理解し、効率的に使用することは、VBAプログラミングにおいて非常に重要です。
今回の記事を通して、オブジェクト変数の基本的な使い方や、その利点について学びました。それでは、記事の重要なポイントをもう一度おさらいしましょう。
ポイントのおさらい
さらに学ぶために
オブジェクト変数の基本を押さえた後は、グローバル変数や静的変数など、他の変数タイプにも目を向けてみてください。
それぞれが持つ特定の用途と利点を理解することで、VBAの操作がさらに効率的になります。
今回の記事を活用し、VBAプログラミングにおけるオブジェクト変数の使い方を身につけ、より効率的に業務をこなせるようになりましょう。