INDEX
Isの概要
オブジェクト変数が同じインスタンスを参照しているかを判定する VBAの演算子 | ||
Is 概要 Is 演算子は、VBAでオブジェクト変数同士が同じインスタンスを参照しているかを比較するために使用されます。これは、値の比較ではなく、オブジェクトの参照先を比較する点が特徴です。 わかりやすく説明 2つのオブジェクトが同じもの(同じインスタンス)かどうかを判定する演算子。 |
||
|
Isを使った基本的なオブジェクト比較
以下の例では、Is を使ってオブジェクトの比較を行います。
Sub TestIsOperator()
Dim obj1 As Object
Dim obj2 As Object
Dim obj3 As Object
Set obj1 = New Collection
Set obj2 = obj1 ' obj2 は obj1 と同じインスタンスを参照
Set obj3 = New Collection ' obj3 は別のインスタンス
Debug.Print (obj1 Is obj2) ' 結果: True (同じインスタンス)
Debug.Print (obj1 Is obj3) ' 結果: False(異なるインスタンス)
End Sub
解説:
obj1 Is obj2
: 同じインスタンスを参照しているので True。obj1 Is obj3
: 別のインスタンスを参照しているので False。
Excel VBAでのIsの活用(Rangeオブジェクトの比較)
以下の例では、Excelのセルのオブジェクトが同じものかどうかを比較します。
Sub CompareRange()
Dim rng1 As Range
Dim rng2 As Range
Dim rng3 As Range
Set rng1 = Range("A1")
Set rng2 = rng1 ' 同じセルを参照
Set rng3 = Range("A1") ' 同じセルだが新しいオブジェクト
Debug.Print (rng1 Is rng2) ' 結果: True (同じ参照)
Debug.Print (rng1 Is rng3) ' 結果: False(新しいRangeオブジェクト)
End Sub
解説:
rng1 Is rng2
:rng2
はrng1
を代入しているため True。rng1 Is rng3
:rng3
は同じセルだが、新しく作成したオブジェクトなので False。
Workbookオブジェクトを比較する
以下の例では、異なるワークブックが同じインスタンスかどうかを判定します。
Sub CompareWorkbooks()
Dim wb1 As Workbook
Dim wb2 As Workbook
Dim wb3 As Workbook
Set wb1 = ThisWorkbook
Set wb2 = wb1 ' 同じワークブックを参照
Set wb3 = Workbooks(ThisWorkbook.Name) ' 別のオブジェクト(同じファイル)
Debug.Print (wb1 Is wb2) ' 結果: True (同じ参照)
Debug.Print (wb1 Is wb3) ' 結果: False(異なるオブジェクト)
End Sub
解説:
wb1 Is wb2
: 同じワークブックを参照しているので True。wb1 Is wb3
: 物理的には同じワークブックだが、異なるオブジェクトとして認識されるため False。
値の比較には Is を使えない
Is はオブジェクトの比較専用であり、数値や文字列の比較には使えません。
Sub TestValueComparison()
Dim num1 As Integer
Dim num2 As Integer
num1 = 10
num2 = 10
' これはエラーになる(値の比較には Is は使えない)
' Debug.Print (num1 Is num2)
' 正しくは = を使う
Debug.Print (num1 = num2) ' 結果: True
End Sub
解説:
num1 Is num2
はエラーになる。- 値の比較には
=
を使用する。
Isの注意事項
- オブジェクト専用: Is はオブジェクトの比較にのみ使用可能。
- 新しく作成されたオブジェクトは別物と判定される: 同じ値を持っていても、新たに作成されたオブジェクトは異なると判定される。
- 値の比較には = を使用: 数値や文字列の比較には = を使うこと。
よくある質問
- Q: Is と = の違いは何ですか?
- A:
Is
はオブジェクトの参照比較、=
は値の比較を行います。 - Q: 同じセルのRangeオブジェクトでも Is の結果が False になるのはなぜ?
- A: VBAでは、
Range("A1")
を呼び出すたびに新しいオブジェクトが生成されるため、参照としては異なるものと判定されます。 - Q: Is は配列の比較にも使えますか?
- A: いいえ。配列の比較には
IsArray
やUBound
などを使用する必要があります。
まとめ
- Is 演算子はオブジェクト変数が同じインスタンスを参照しているかを判定するために使用する。
- オブジェクトが同じものを指している場合は True、新しく作成された別のオブジェクトなら False になる。
- 値の比較には
=
を使用する。 - Excel VBAでRangeやWorkbookオブジェクトの比較に活用できる。