我正在使用未记录的函数ObjPtr检查Excel单元格的内存地址。我很惊讶地发现不同的单元可以在内存中共享相同的地址。它没有意义......有人可以解释这个奇怪的事情吗?
Sub testobjptr()
Dim objTest As Range
Set objTest = Range("A1")
Dim i As Integer
For i = 1 To 10
Debug.Print Join(Split(objTest.Address, "$"), "") & " at " & ObjPtr(objTest)
Set objTest = objTest.Offset(i, i)
Next i
End Sub
以下是即时窗口中的输出:
A1 at 80276608
B2 at 80276928
D4 at 80276608
G7,电话:80276928
K11,电话:80276608
P16 at 80276928
V22 at 80276608
AC29,电话:80276928
AK37,电话:80276608
AT46,电话:80276928
答案 0 :(得分:3)
我很惊讶地发现不同的单元可以在内存中共享相同的地址。
没有。不同的单元不在内存中共享相同的地址。对象objTest
是。 每次分配变量时都会创建一个指针。
试试这个。在这里,您将看到所有对象都引用同一个单元格,但在内存中分配了不同的地址。
Sub testobjptr()
Dim rng1 As Range, rng2 As Range, rng3 As Range, rng4 As Range
Set rng1 = Range("A1")
Set rng2 = Range("A1")
Set rng3 = Range("A1")
Set rng4 = Range("A1")
Debug.Print Join(Split(rng1.Address, "$"), "") & " at " & ObjPtr(rng1)
Debug.Print Join(Split(rng2.Address, "$"), "") & " at " & ObjPtr(rng2)
Debug.Print Join(Split(rng3.Address, "$"), "") & " at " & ObjPtr(rng3)
Debug.Print Join(Split(rng4.Address, "$"), "") & " at " & ObjPtr(rng4)
End Sub
输出
A1 at 202834688
A1 at 260111360
A1 at 260111744
A1 at 260091264
答案 1 :(得分:1)
将您的代码更改为:
For i = 1 To 10
Set objTest = Range("A1")
Debug.Print objTest.Address & " at " & ObjPtr(objTest)
Set objTest = Range("A2")
Debug.Print objTest.Address & " at " & ObjPtr(objTest)
Set objTest = Range("A3")
Debug.Print objTest.Address & " at " & ObjPtr(objTest)
Next i
你会看到,在这种情况下,地址在两个值之间振荡到Range(" A1")将是第一个,另一个是另一个地址。你得到的不是单元格的地址,而是VBA' Range'可以代表一个细胞但也可以代表几个细胞的物体。为什么这个值是振荡的是隐藏实现的问题,但不是内存中Excel存储特殊单元格值的地方。