1

この質問は、VBA: ユーザーがセルを削除した場合、Range オブジェクトはどうなりますか?

2 つのセル参照の同一性を確実にテストし、さらに重要なことに、セル参照を長期間保存する方法はありますか?

次の例を検討してください。

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 参照を持つ 2 つのセル オブジェクト (オブジェクト参照) が同じセルを参照することが保証されているとは想定できないようです (つまり、ObjPtr 値を保存して使用することはできません。たとえば、どこかのキーとして)。

したがって、私の質問:ワークシートのセルの名前変更、切り取り、および/または貼り付けを生き残る方法で、Excel のセルを一意に識別するにはどうすればよいですか?

4

2 に答える 2

1

標準的な方法は、定義済みの名前を割り当てることです。

(名前の変更に耐える方法を求めましたが、ワークシートの名前だけを意味するのかどうかはわかりません。)

于 2012-08-27T12:03:27.413 に答える
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 に答える