有效替代使用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 ? 在某些情况下(在我的情况下,大多数情况下),您可能想要命名范围包含许多单元格。 在这种情况下,该命名的范围的地址将不匹配单个单元格的地址。 因此检查它们是否相交更加健壮。