【VBAスタンダード対策】オブジェクト変数の代入と「Set」の構造を攻略!
オブジェクト変数とは、単なる「値」ではなく、ワークシートやセル範囲といった「モノ(オブジェクト)」を操作するために、その場所を記憶しておくための変数です。通常の変数とは代入のルールが根本的に異なります。
1. 問題:オブジェクト変数への正しい代入方法
【 問題 】 変数 mySheet に「Sheet1」というワークシートを割り当てて、そのシートの名前を表示させたい。空欄 ( A ) に入る正しい記述はどれでしょうか?
Sub ObjectTest()
Dim mySheet As Worksheet
( A ) Worksheets("Sheet1")
MsgBox mySheet.Name
End Sub
Dim mySheet As Worksheet
( A ) Worksheets("Sheet1")
MsgBox mySheet.Name
End Sub
① mySheet =
② Set mySheet =
③ Let mySheet =
④ mySheet :=
2. 正解:オブジェクト変数の代入に関する正解
正解: ② Set mySheet =
3. 解説:なぜ「Set」が必要なのか?
VBAの構造において、通常の変数とオブジェクト変数は、メモリへの格納方法が明確に区別されています。
[ 変数の構造的違い ]
■ 値の代入(Set不要)
Dim n As Integer
n = 100 ' 箱の中に直接「100」を入れる
■ オブジェクトの代入(Set必須)
Dim r As Range
Set r = Range("A1") ' 箱の中に「A1セルという実体への参照(リモコン)」を入れる
★ 理系NEOなポイント:
・参照(ポインタ):オブジェクト変数は、実体そのものを箱に入れているわけではなく、実体を操作するための「リモコン」を箱に入れているような構造です。
・Nothing:オブジェクト変数を宣言した直後の初期状態は 0 ではなく Nothing です。Nothingの状態(リモコンがどこも指していない状態)でプロパティを操作しようとすると「オブジェクト変数が設定されていません」というエラーになります。
■ 値の代入(Set不要)
Dim n As Integer
n = 100 ' 箱の中に直接「100」を入れる
■ オブジェクトの代入(Set必須)
Dim r As Range
Set r = Range("A1") ' 箱の中に「A1セルという実体への参照(リモコン)」を入れる
★ 理系NEOなポイント:
・参照(ポインタ):オブジェクト変数は、実体そのものを箱に入れているわけではなく、実体を操作するための「リモコン」を箱に入れているような構造です。
・Nothing:オブジェクト変数を宣言した直後の初期状態は 0 ではなく Nothing です。Nothingの状態(リモコンがどこも指していない状態)でプロパティを操作しようとすると「オブジェクト変数が設定されていません」というエラーになります。
1. ここが試験に出る!: スタンダード試験では「Setを書き忘れていないか」という点が非常に多く問われます。また、使い終わった後に Set mySheet = Nothing としてメモリを解放する構造も重要です。
2. エンジニアの視点: Java 17などのオブジェクト指向言語では `new` キーワードでインスタンス化しますが、VBAでは既存のExcel要素(シートなど)を扱う際、この `Set` が「これは単なる値のコピーではなく、実体へのリンクである」という宣言の役割を果たしています。
4. まとめ
「オブジェクトにはSet、使い終わったらNothing」。この代入構造をマスターすることで、複雑なExcel操作も変数一つでスマートに制御できるようになります。変数という「リモコン」を正しく対象に向け、正確なマクロを構築しましょう。
PR