使用Target.Address的高效替代方案

7

我目前使用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个回答

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属性也会自动更新,您不必修改脚本。


2
与其使用循环,我在工作表模块中使用 If Target.Address = Me.Range("myCell").Address Then 或者在工作簿模块中使用 If Target.Address = sh.Range("myCell").Address Then - Dick Kusleika
@DickKusleika 当然没问题! - user2140173
1
我真的很喜欢这个解决方案。不幸的是,我仍然有很多if语句,但我看不到任何绕过它们的方法。至少这意味着它们总是指向正确的单元格。非常感谢。 - Andrew Martin
1
你可以发挥创意来减少那些If语句。例如,如果所有单元格都在第20行,则可以在A20中创建一个名称,并使用If Target.Row = Me.Range("myCell").Row Then。或者,您可以为范围名称添加一些独特的一致性(它们都以“engunits”开头),然后循环遍历所有名称(就像@ mehow最初所做的那样),并检查所有名称是否类似于“engunits *”。 - Dick Kusleika

3
我通常使用命名区域以及“Not Intersect(...) Is Nothing”技术来完成这个操作,这种方法比简单查看“Address”属性更加健壮。
首先,给你的单元格命名,如下图所示:
如果插入了更多的行或列,名称将随着单元格的移动而跟随,因此您无需每次更改代码。
然后,要测试哪些单元格被单击,您可以使用“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呢?在某些情况下(例如我的情况,大多数时候),您可能希望拥有包含多个单元格的命名范围。在这种情况下,该命名范围的地址与单个单元格的地址不匹配。因此,检查它们是否相交更加健壮。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接