更新日:、 作成日:
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 を設定して後始末してくれます。
「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)) ' エラー、= で比較できない