Excel单元共享相同的内存地址

我正在使用未公开的函数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在80276608

B2在80276928

D4在80276608

G7在80276928

K11在80276608

P16在80276928

V22在80276608

AC29在80276928

AK37在80276608

AT46在80276928

我很惊讶地发现不同的单元可以在内存中共享相同的地址。

不是。不同的单元格在内存中不共享相同的地址。 对象objTest是。 每次分配variables时都会创build一个指针。

尝试这个。 在这里你会看到所有的对象引用了同一个单元,但是在内存中被分配了一个不同的地址。

 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 

将您的代码更改为:

 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 

你会看到在这种情况下,地址在两个值之间振荡,范围(“A1”)将是第一次,另一次是另一个地址。 你得到的不是单元格的地址,而是一个VBA的“范围”对象,它可以表示一个单元格,但也可以表示一对单元格。 为什么这个值是摆动的是隐藏实现的问题,但不是Excel存储特殊单元格的值的地方。