[英]Worksheet_Change setting target range is slow
我有一个excel宏,用于根据此处另一个SO问题在 “ Worksheet_Change”函数中的Excel中管理按钮的可见性。
问题是,尽管宏起作用了,但它使更新Excel工作表相当费时。 我设法将慢度限制为一行:
Set rUpdated = Range(Target.Dependents.Address)
这将更新为变量的单元格范围设置为在脚本的后面迭代。 如果我仅用这一行调用脚本,我发现这就是所有延迟所在。 这似乎很简单,但是有更好的方法吗?
全面披露:
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
因此,如果我正确理解,则如果行中的单元格已更改,则希望使按钮可见。 我唯一能想到的就是降低许多rCell
或Shapes
。 我不知道您的文件结构是什么。 所以我的想法是:与其每次都遍历所有形状,不如将它们命名为一种模式,您可以通过它们所在的行来标识它们,因此您可以使用名称来寻址它们(即,第2
Row2
中的Button的第2
行) )。
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
我用以下单行(和配套行)替换了该配置:
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
我只运行了一次该功能并将其删除。 一旦完成,我的形状现在可以被命名,而我不再需要经历遍历每个形状和每个依赖目标的循环。 现在,工作表中出现的延迟很小。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.