Worksheet_Change设置目标范围很慢

我有一个基于另一个SO问题的“Worksheet_Change”函数,用于pipe理Excel中的button可见性的Excelmacros。

问题是,尽pipemacros观工作,它使得更新Excel表格而非滞后。 我已经设法把缓慢的问题归结为一条线:

Set rUpdated = Range(Target.Dependents.Address) 

这将更新的单元格范围设置为一个variables,以便稍后在脚本中进行迭代。 如果我用这一行来调用脚本,我发现这是所有延迟的地方。 这似乎是一个相当简单的路线,但有没有更好的方法来做到这一点?

全面披露:

 Private Sub Worksheet_Change(ByVal Target As Range) Dim rUpdated As Range Dim shp As Shape Dim rCell As Range Set rUpdated = Range(Target.Dependents.Address) If Not rUpdated Is Nothing Then For Each rCell In rUpdated If rCell.Column = 1 Then 'Look at each shape in the sheet and cross-reference with rCell. For Each shp In Target.Parent.Shapes If shp.TopLeftCell.Row = rCell.Row Then shp.Visible = (rCell.Value <> "") Exit For 'Exit the loop - the correct button has been found. End If Next shp End If Next rCell End If End Sub 

所以,如果我正确地理解它,你想要一个button可见,如果行中的单元格已被更改。 我唯一能想到的就是减慢速度,那就是检查很多rCellShapes 。 我不知道你的文件是什么结构。 所以我的想法是:我不会每次都通过所有的形状,我会以一种模式来命名它们,你可以用它们所在的行来标识它们,所以你使用这个名称来解决它们(例如Row2作为行2的button)。

 Private Sub Worksheet_Change(ByVal Target As Range) Dim rUpdated As Range Dim shp As Shape Dim rCell As Range Dim obj As OLEObject Set rUpdated = Range(Target.Dependents.Address) If Not rUpdated Is Nothing Then For Each rCell In rUpdated If rCell.Column = 1 Then On Error Resume Next Set obj = ActiveSheet.OLEObjects("Row" & rCell.Row) If Err.Number = 0 Then obj.Visible = (rCell.Value <> "") End If End If Next rCell End If End Sub 

我用下面的单行(和伴随行)replace了这个configuration:

 On Error Resume Next ActiveSheet.Shapes("buttonRow" & Target.Row).Visible = (ActiveSheet.Cells(Target.Row, 1).Value <> "") 

但是为了使这个工作,我首先需要重新命名我的所有形状。 我用这个函数来做到这一点:

 Function renamebuttons() For Each shp In ActiveSheet.Shapes shp.name = "buttonRow" & shp.TopLeftCell.Row Next shp End Function 

我曾经运行过这个function并删除了它。 一旦完成,我的形状现在可以通过名称来引用,而且不再需要通过每个形状和每个目标依赖的循环延迟。 在工作表中经历的延迟现在是最小的。