“是”运算符给我 False,我可以知道原因吗?为什么?

오바마*_*오바마 4 excel vba

在编写 MS Excel VBA 代码时,我遇到了一个简单的问题,如下所示。

上面的一点问题都没有。

下层有问题。它给了我“假”。

Dim my01, my02
Set my01 = Sheets(1)
Set my02 = Sheets(1)
MsgBox my01 Is my02

Set my01 = Sheets(1).Range("A1")
Set my02 = Sheets(1).Range("A1")
MsgBox my01 Is my02
Run Code Online (Sandbox Code Playgroud)

我预计它会显示“True”。

[编辑] 我尝试过“=”运算符,发现它效果很好。尽管如此,它并没有给我的问题带来任何启发。

Big*_*Ben 6

这里

Range即使您引用同一个单元格,该属性也始终返回新的对象引用。(好吧,如果变量当前没有指向以前的引用,它将重新使用它们) - Rory,2015 年 2 月 12 日 17:01

这可以使用以下方法轻松验证ObjPtr

Dim my01, my02
Set my01 = Sheets(1)
Set my02 = Sheets(1)
    
Debug.Print ObjPtr(my01), ObjPtr(my02) ' Identical, e.g. 1134792280    1134792280 
Debug.Print my01 Is my02 ' True
    
Set my01 = Sheet1.Range("A1")
Set my02 = Sheet1.Range("A1")
    
Debug.Print ObjPtr(my01), ObjPtr(my02) ' Different!, e.g. 1091015848    1091023048 
Debug.Print my01 Is my02 ' False
Run Code Online (Sandbox Code Playgroud)

链接的线程建议比较它们的.Address. 您可以更进一步,比较它们的.Parent.Worksheet

Debug.Print my01.Worksheet Is my02.Worksheet And my01.Address = my02.Address ' True
Run Code Online (Sandbox Code Playgroud)

使用external-参数的快捷解决方案

Debug.print my01.Address(external:=True) = my02.Address(external:=True)
Run Code Online (Sandbox Code Playgroud)

  • @오바마 - 是的,“Range”有很多复杂之处。我们甚至还没有触及[默认成员](/sf/answers/2309800811/)! (2认同)