有效替代使用Target.Address
我目前正在使用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行上面插入一个新的行(从上面的例子),所有这些引用将指向错误的地方。 我以为我可以通过删除绝对引用($符号)来处理这个问题,但这只是打破了机制。
任何人都可以build议如何:a)重写代码以使其更有效; b)保护代码,以便插入新行,并且代码将记住它指向的行/列,并相应地进行更新。
在电子表格中select一个单元格,并为其命名
例如B3现在被命名为myCell
并编辑你的脚本来使用这个命名的范围
Dim namedRange As Name If Target.Address = Me.Range("myCell").Address Then Win2KTrackerIncompleteFilter (strEngUnits(9)) ElseIf ... ... End If
所以现在,即使插入新行,名称也会自动更新.RefersTo
属性,您不必触摸脚本。
我通常使用命名的范围,以及Not Intersect(...) Is Nothing
技术,这比简单看Address
属性更强大一点。
首先,命名您的单元格,例如如下所示:
如果插入更多的行/列,这些名称将随着单元格被放置,所以您不必每次更改代码。
然后,要testing哪些单元格被点击,您可以使用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
? 在某些情况下(在我的情况下,大多数情况下),您可能想要命名范围包含许多单元格。 在这种情况下,该命名的范围的地址将不匹配单个单元格的地址。 因此检查它们是否相交更加健壮。