更新日:、 作成日:

VBA オブジェクトを代入や比較する

はじめに

Excel VBA マクロのオブジェクト (Object) を代入や比較する方法を紹介します。

Worksheet など参照型のものをオブジェクトと言います。クラスも参照型なのでオブジェクトです。

Set 変数名 = オブジェクト のようにして、Set を頭に付けて代入します。

オブジェクト Is オブジェクト のようにして、Is 演算子を使用してオブジェクトを比較できます。空かどうかは Nothing と比較します。

値型と参照型の違うについては「値型と参照型の違い」をご覧ください。
クラスについては「クラス」をご覧ください。

オブジェクトを代入する

Set 変数名 = オブジェクト のように入力して、その変数にオブジェクトを代入します。

オブジェクトの型が不明または定義されていないときは、Object 型を使用します。

Dim s As Worksheet
Set s = Sheet1

Dim o As Object ' すべてのオブジェクトを代入できる
Set o = Worksheets(1)

Set を忘れると「エラー 91 オブジェクト変数または With ブロック変数が設定されていません。」が発生します。

クラス

クラスを使用するには、インスタンス化する必要があります。

Set 変数名 = New クラス名 のように入力して、その変数に新しいインスタンスを生成します。New がインスタンス化するキーワードです。

Dim c As Class1
Set c = New Class1 ' インスタンス化

クラスの変数が不要になったときは、後始末として必ず Nothing を設定します。これでインスタンスが確実に破棄され、メモリが解放されます。

Dim c As Class1
Set c = New Class1

' 処理

Set c = Nothing ' インスタンスが破棄される

後始末

作成したクラスに対して後始末をそこまで気にする必要はありません。ローカル変数なら関数を抜けた時点で自動で Nothing を設定して後始末してくれます。

COM オブジェクトを使用しているときは、必ず後始末します。

CreateObject 関数」を使用してインスタンス化したときは、必ず Nothing を設定する必要があります。忘れるとメモリが解放されなくなるため、不具合が発生します。

オブジェクト変数または With ブロック変数が設定されていません。

インスタンス化する前のクラスの変数の初期値は Nothing です。

インスタンス化していない状態で使用すると「エラー 91 オブジェクト変数または With ブロック変数が設定されていません。」が発生します。

Dim c As Class1 ' Nothing 状態

c.FirstName = "Tips" ' エラー

このエラーは VBA の中でよく発生するので、そのときはインスタンス化されているか確認します。

オブジェクトを比較する

Is 演算子を使用してオブジェクトの参照が等しいか判定できます。

参照型であるオブジェクトやクラスは = で比較できません。何も入っていない空のオブジェクトと比較するには Nothing を使用します。

Not を使用して参照が「等しくない」を判定できます。

演算子 演算名 使用例 結果
Is参照が等しいSheets(1) Is Sheets(1)
Sheets(1) Is Nothing
True
False
参照が等しくないNot (Sheets(1) Is Sheets(2))True
Dim b As Boolean

b = (Sheets(1) Is Sheets(1))     ' 等しいか
Debug.Print(b) ' True

b = (Sheets(1) Is Sheets(2))
Debug.Print(b) ' False

b = Not (Sheets(1) Is Sheets(2)) ' 等しくないか
Debug.Print(b) ' True

Dim ws As Worksheet
b = (ws Is Nothing)              ' Nothing か
Debug.Print(b) ' True

b = (Sheets(1) = Sheets(1))      ' エラー、= で比較できない
演算子について詳しくは「演算子」をご覧ください。