簡體   English   中英

Worksheet_Change設置目標范圍很慢

[英]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

因此,如果我正確理解,則如果行中的單元格已更改,則希望使按鈕可見。 我唯一能想到的就是降低許多rCellShapes 我不知道您的文件結構是什么。 所以我的想法是:與其每次都遍歷所有形狀,不如將它們命名為一種模式,您可以通過它們所在的行來標識它們,因此您可以使用名稱來尋址它們(即,第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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM