在编写 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”。
[编辑] 我尝试过“=”运算符,发现它效果很好。尽管如此,它并没有给我的问题带来任何启发。
看这里:
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)