Vba 为Excel自定义UI选择动态菜单项时的性能影响

Vba 为Excel自定义UI选择动态菜单项时的性能影响,vba,excel,ribbon,Vba,Excel,Ribbon,我拼凑了一个Excel工作簿,动态填充一些自定义UI下拉菜单 下面是填充菜单的代码 Sub GetFilterByTeam(Control As IRibbonControl, ByRef content) content = "<menu xmlns=""http://schemas.microsoft.com/office/2009/07/customui""><button id=""Team1"" label=""Team1"" onAction=""FilterTe

我拼凑了一个Excel工作簿,动态填充一些自定义UI下拉菜单

下面是填充菜单的代码

Sub GetFilterByTeam(Control As IRibbonControl, ByRef content)

content = "<menu xmlns=""http://schemas.microsoft.com/office/2009/07/customui""><button id=""Team1"" label=""Team1"" onAction=""FilterTeam""/><button id=""Team2"" label=""Team2"" onAction=""FilterTeam""/><button id=""Team3"" label=""Team3"" onAction=""FilterTeam""/><button id=""Team4"" label=""Team4"" onAction=""FilterTeam""/><button id=""Team5"" label=""Team5"" onAction=""FilterTeam""/><button id=""Team6"" label=""Team6"" onAction=""FilterTeam""/></menu>"

End Sub
对上述情况的简短解释

  • 要跳过错误的On Error是表“Filter”已为空
  • AddToFilter解释如下
  • Filter只是在主表上运行advancedfilter宏,表中的条件由AddToFilter填充
  • 问题出在这里

    dynamicMenu中的第一项性能非常好。舍入到0毫秒。但是,dynamicMenu中的其他按钮的性能大约为200毫秒

    通过测量这些电话,我发现

    Call AddToFilterLists(....
    
    部分原因是什么。我尝试过传递一个简单的字符串(用于测试目的)而不是control.ID,但这没有帮助

    我不知所措。我想我犯了一个小小的错误,但我一辈子也弄不明白

    下面是AddToFilterList的代码

    Sub AddToFilterList( _
        Optional Param1 As String = "", _
        Optional Param2 As String = "", _
        Optional Param3 As String = "", _
        Optional Param4 As String = "", _
        Optional Param5 As String = "", _
        Optional Param6 As String = "", _
        Optional Param7 As String = "", _
        Optional Param8 As String = "", _
        Optional Param9 As String = "", _
        Optional Param10 As String = "", _
        Optional Param11 As String = "", _
        Optional Param12 As String = "", _
        Optional Param13 As String = "", _
        Optional Param14 As String = "")
    
        Dim LO As ListObject
        Dim oNewRow As ListRow
    
        Set LO = Sheets("Filter").ListObjects("FilterTable")
    
        Set oNewRow = LO.ListRows.Add(AlwaysInsert:=True)
    
        oNewRow.Range.Cells(1, Column1).Value = Param1
        oNewRow.Range.Cells(1, Column2).Value = Param2
        oNewRow.Range.Cells(1, Column3).Value = Param3
        oNewRow.Range.Cells(1, Column4).Value = Param4
        oNewRow.Range.Cells(1, Column5).Value = Param5
        oNewRow.Range.Cells(1, Column6).Value = Param6
        oNewRow.Range.Cells(1, Column7).Value = Param7
        oNewRow.Range.Cells(1, Column8).Value = Param8
        oNewRow.Range.Cells(1, Column9).Value = Param9
        oNewRow.Range.Cells(1, Column10).Value = Param10
        oNewRow.Range.Cells(1, Column11).Value = Param11
        oNewRow.Range.Cells(1, Column12).Value = Param12
    
    End Sub
    
    注释掉一些oNewRow=行会有所帮助,但我不明白的是,为什么性能取决于我在dynamicMenu中选择的值。这种影响是可以重复和量化的

    我无法“解决”性能问题,但我通过将代码引入到FilterTeam sub的AddToFilterList中解决了这个问题。现在性能是一致的

    Sub AddToFilterList( _
        Optional Param1 As String = "", _
        Optional Param2 As String = "", _
        Optional Param3 As String = "", _
        Optional Param4 As String = "", _
        Optional Param5 As String = "", _
        Optional Param6 As String = "", _
        Optional Param7 As String = "", _
        Optional Param8 As String = "", _
        Optional Param9 As String = "", _
        Optional Param10 As String = "", _
        Optional Param11 As String = "", _
        Optional Param12 As String = "", _
        Optional Param13 As String = "", _
        Optional Param14 As String = "")
    
        Dim LO As ListObject
        Dim oNewRow As ListRow
    
        Set LO = Sheets("Filter").ListObjects("FilterTable")
    
        Set oNewRow = LO.ListRows.Add(AlwaysInsert:=True)
    
        oNewRow.Range.Cells(1, Column1).Value = Param1
        oNewRow.Range.Cells(1, Column2).Value = Param2
        oNewRow.Range.Cells(1, Column3).Value = Param3
        oNewRow.Range.Cells(1, Column4).Value = Param4
        oNewRow.Range.Cells(1, Column5).Value = Param5
        oNewRow.Range.Cells(1, Column6).Value = Param6
        oNewRow.Range.Cells(1, Column7).Value = Param7
        oNewRow.Range.Cells(1, Column8).Value = Param8
        oNewRow.Range.Cells(1, Column9).Value = Param9
        oNewRow.Range.Cells(1, Column10).Value = Param10
        oNewRow.Range.Cells(1, Column11).Value = Param11
        oNewRow.Range.Cells(1, Column12).Value = Param12
    
    End Sub