「Set Range1 = Range2」と「Range1 = Range2」の違いを検証する(VB/VBAにおけるオブジェクトの代入・比較)

VBAを触り始めて6年目なわけだが、未だにSetの使い方をよく知らなかったので(つまるところオブジェクトというものをちゃんと理解していなかったわけだが)少なくともとSetの使い方をRangeを用いて調べてみた。
今までは何となくRangeオブジェクトを使うときはSetと合わせて使うんだという風に覚えていたわけだが、ググった結果、

「Set Range1 = Range2」とするとオブジェクトとして代入になり、
「Range1 = Range2」とするとRangeのデフォルトプロパティであるValueが代入される

ということになるらしい。

実験準備

早速それを試すため以下のようなコードをVBAで作って検証してみた。

Sub main()
    Dim rng1 As Range, rng2 As Range
    Set rng1 = Range("A1")
    Set rng2 = Range("B1")
    Call MsgBoxRngDetail(rng1)
    Call MsgBoxRngDetail(rng2)
    'rng2 = rng1
    Set rng2 = rng1
    Call MsgBoxRngDetail(rng1)
    Call MsgBoxRngDetail(rng2)
    If rng1 Is rng2 Then
        MsgBox ("rng1 is rng2")
    End If
    If rng1 = rng2 Then
        MsgBox ("rng1 = rng2")
    End If
End Sub

Sub MsgBoxRngDetail(ByRef rng As Range)
    Dim msg As String
    msg = rng.Value
    msg = msg & vbCr & rng.Address
    msg = msg & vbCr & rng.Interior.ColorIndex
    MsgBox (msg)
End Sub

7行目の「rng2 = rng1」と8行目の「Set rng2 = rng1」とのどちらかをコメントアウトし、それぞれの動作を確認した。
Sheet1は以下のように、A1にaが、B1にbが入っている。

実験1:「Set rng2 = rng1」の場合

メッセージボックスは以下のものが順に表示され、シートはこのようになった:

続きを読む