2014-10-29 81 views
2

我正在使用未公开的函数ObjPtr检查Excel单元格的内存地址。我很惊讶地发现不同的单元可以在内存中共享相同的地址。这没有道理......有人可以解释这个奇怪的事情吗?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 

以下是在即时窗口中的输出:在80276608

B2

A1在80276928

D4在80276608

G7在80276928

K11在80276608

P16在80276928

V22在80276608

AC29处80276608

AT46 80276928

AK37在80276928

+1

不要使用同一地址共享相同的值的单元格? – barryleajo 2014-10-29 07:45:47

回答

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 

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

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