VBAのIs演算子を使ってオブジェクトの比較を行う方法をわかりやすく解説

スポンサーリンク
スポンサーリンク

Isの概要

オブジェクト変数が同じインスタンスを参照しているかを判定する VBAの演算子

Is

概要 Is 演算子は、VBAでオブジェクト変数同士が同じインスタンスを参照しているかを比較するために使用されます。これは、値の比較ではなく、オブジェクトの参照先を比較する点が特徴です。

わかりやすく説明 2つのオブジェクトが同じもの(同じインスタンス)かどうかを判定する演算子。

  • オブジェクト変数同士が同じインスタンスを指しているかどうかを比較する。
  • 値の比較には使用できない(値の比較には = を使う)。
  • Excel VBAでRangeオブジェクトやWorkbookオブジェクトの比較に役立つ。

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: rng2rng1 を代入しているため 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: いいえ。配列の比較には IsArrayUBound などを使用する必要があります。

まとめ

  • Is 演算子はオブジェクト変数が同じインスタンスを参照しているかを判定するために使用する。
  • オブジェクトが同じものを指している場合は True、新しく作成された別のオブジェクトなら False になる。
  • 値の比較には = を使用する。
  • Excel VBAでRangeやWorkbookオブジェクトの比較に活用できる。