使用Target.Address的有效替代方法

时间:2014-08-18 13:10:33

标签: excel vba

我目前正在使用Target.Address来识别双击单元格的时间并运行一段代码以将用户带到显示该单元格中包含的信息的相关工作表。

因此,例如,如果一个单元格表示3个系统尚未采取某种行动,那么如果用户点击该单元格,他们将被带到这3个系统中。

目前,我这样做是这样的:

If Target.Address = "$B$20" Then
    Win2KTrackerIncompleteFilter (strEngUnits(9))
ElseIf Target.Address = "$C$20" Then
    Win2KTrackerIncompleteFilter (strEngUnits(0))
ElseIf Target.Address = "$D$20" Then
    Win2KTrackerIncompleteFilter (strEngUnits(1))
etc

我已将大部分代码放在一个小函数中,所以这似乎可以正常工作。但是,如果我要在行20上面插入一个新行(来自上面的示例),则所有这些引用都将指向错误的位置。我认为我可以通过删除绝对引用($符号)来解决这个问题,但这只会破坏机制。

任何人都可以建议我如何能够a)重写代码以使其更有效率; b)保护代码以便插入新行,代码将记住它指向哪些行/列并相应地更新自身。

2 个答案:

答案 0 :(得分:7)

在电子表格中选择一个单元格并为其命名

例如,B3现在名为myCell

enter image description here

并稍微编辑你的脚本以使用像这样的命名范围

Dim namedRange As Name
If Target.Address = Me.Range("myCell").Address Then
       Win2KTrackerIncompleteFilter (strEngUnits(9))
ElseIf ...
    ...
End If

现在,即使您插入新行,该名称也会自动更新其.RefersTo属性,您无需触及该脚本。

答案 1 :(得分:3)

我通常使用命名范围和Not Intersect(...) Is Nothing技术来做这件事,这比仅仅查看Address属性要强一些。

首先,为您的单元命名,例如如下所示:

enter image description here

如果您插入更多行/列,名称将随着单元格的推移而跟随单元格,因此您不必每次都更改代码。

然后,要测试单击哪些单元格,可以使用Not Intersect(...) Is Nothing

If Not Intersect(Target, Range("System1Report")) Is Nothing Then
    Win2KTrackerIncompleteFilter strEngUnits(9)
ElseIf Not Intersect(Target, Range("System2Report")) Is Nothing Then
    Win2KTrackerIncompleteFilter strEngUnits(0)
ElseIf Not Intersect(Target, Range("System3Report")) Is Nothing Then
    Win2KTrackerIncompleteFilter strEngUnits(1)
End If

为什么这样做而不仅仅是检查Target.Address = Range("System1Report").Address?在某些情况下(在我的情况下,大多数情况下),您可能希望包含许多单元格的命名范围。在这种情况下,该命名范围的地址将不匹配单个单元格的地址。因此,检查它们是否相交更加健壮。