Worksheet_Change设置目标范围很慢

时间:2017-08-02 09:11:22

标签: excel vba excel-vba

我有一个excel宏,用于根据另一个SO问题here在“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

2 个答案:

答案 0 :(得分:0)

因此,如果我理解正确的话,如果行中的单元格已更改,则您希望显示一个按钮。我能想到的唯一让它减速的事情是,必须检查许多rCellShapes。我不知道你的文件结构是什么。所以我的想法是:不是每次都经历所有形状,我会用一种模式命名它们,你可以用它们所在的行来识别它们,这样你就可以使用这个名称来解决它们(即Row22)中的按钮。

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

答案 1 :(得分:0)

我用以下单行(和伴随行)替换了该配置:

realloc()

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

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

我运行了一次该功能并将其删除。一旦完成,我的形状现在可以通过名称来引用,我不再需要在每个形状和每个目标依赖的循环中产生延迟。工作表中遇到的延迟现在很小。