1

这个问题与这个问题有些相关:VBA:如果用户删除单元格,范围对象会发生什么?

有没有办法可靠地测试两个单元格引用的身份,更重要的是,随着时间的推移存储单元格引用?

考虑以下示例:

Sub TestCellIdentity ()

   Dim r As Range
   Set r = Application.ActiveCell
   r.Value = "Some Value"

   Dim ws As Worksheet
   Set ws = r.Worksheet

   Dim n As String
   n = ws.Name

   Dim c As Range
   Set c = Worksheets (n).Cells (r.Row, r.Column)

   MsgBox ("ActiveCell ptr: " & CStr (ObjPtr (r)) & "Value: " & r.Value _
     & "; Indirect access ptr: " & CStr (ObjPtr (c)) & " Value: " & c.Value)
End Sub

运行示例显示 ObjPtr (r) 和 ObjPtr (c) 是不同的,即使它们引用同一个单元格。更糟糕的是,在我看来(从一些测试)我不能假设具有相同 ObjPtr 引用的两个单元格对象(对象引用)保证引用同一个单元格(即我不能存储 ObjPtr 值并使用它,例如,作为某处的钥匙)。

因此我的问题是:如何在 Excel 中以在工作表中重命名、剪切和/或粘贴单元格后仍然存在的方式唯一标识一个单元格?

4

2 回答 2

1

每次分配变量时都会创建一个指针,因此您会获得不同的引用,除非您将一个变量分配给另一个变量,在这种情况下,它是相同的指针并且具有相同的引用。除非您使用静态声明,否则每次运行子过程时引用通常都会更改。如果您将指针声明为静态并分配一次,则即使用户移动单元格,每次运行代码时它也应该保持一个常量引用。我运行了这段代码来测试它,它似乎工作。

    Sub TestCellIdentityModified()

    Dim rng1 As Range
    Dim rng2 As Range
    Static rngStatic As Range

    ' assign cell to pointer
    Set rng1 = ActiveSheet.Cells(2, 4)
    Debug.Print "rng1 = " & ObjPtr(rng1)

    ' assign same cell to a different pointer
    Set rng2 = ActiveSheet.Cells(2, 4)
    Debug.Print "rng2 = " & ObjPtr(rng2); ""

    ' assign one pointer to another
    Set rng2 = rng1
    Debug.Print "rng2 reassigned as rng1 pointer = " & ObjPtr(rng2)

    ' one time assignment of the same cell to a static pointer
    If rngStatic Is Nothing Then Set rngStatic = ActiveSheet.Cells(2, 4)
    Debug.Print "rngStatic = " & ObjPtr(rngStatic)

    Debug.Print " "

End Sub
于 2012-08-27T11:53:53.637 回答
1

标准方法是为其分配一个Defined Name

(您要求一种在重命名后仍然存在的方法,但我不确定您是否只是指工作表的名称。)

于 2012-08-27T12:03:27.413 回答