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

时间:2014-10-29 07:21:15

标签: excel vba excel-vba

我正在使用未记录的函数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

2 个答案:

答案 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存储特殊单元格值的地方。