运行宏崩溃excel

时间:2017-03-28 16:08:46

标签: excel excel-vba vba

我有一个excel电子表格,其中包含大约15个excel DCT。 在该工作表上,有一个允许选择用户名的下拉菜单,当更改值时,宏会使用用户名更新电子表格中存在的所有DTC并刷新数据。 问题是,现在出于任何原因,除了高性能计算机外,它崩溃了。 我不知道该怎么做

这是宏:

Dim pt As PivotTable
Dim pi As PIVOTITEM
Dim strField As String

strField = "Cslts"

On Error Resume Next
'Application.EnableEvents = False
'Application.ScreenUpdating = False

    If Target.Address = Range("H1").Address Then


            For Each pt In ActiveSheet.PivotTables
                With pt.PageFields(strField)
                    For Each pi In .PivotItems
                        If pi.Value = Target.Value Then
                            .CurrentPage = Target.Value
                    Exit For

                        Else
                            .CurrentPage = "(blank)"

                        End If
                    Next pi
                End With
            Next pt

    End If

End Sub

此致

2 个答案:

答案 0 :(得分:2)

无需循环遍历每个PivotItems,只需将pi对象设置为所需值,然后再对其进行验证。

似乎您没有禁用Application.Events(在过程结束时缺少Application.EnableEvents = True),如果是这样,每次{{1}都会再次触发工作表事件页面已更改,这可能是Excel崩溃的原因。

请注意,如果PivotField未设置为PivotField(strField),您将获得PageField因此"Run-time error 1004: Unable to get the PageFields property of the PivotTable class"需要验证为PivotField(strField) } (参见下面的代码)

假设程序是PageField,请尝试使用(请参阅代码中的注释)

Worksheet Change Event

此外,建议刷新Private Sub Worksheet_Change(ByVal Target As Range) Dim pt As PivotTable Dim pf As PivotField Dim pi As PivotItem Dim strField As String strField = "Cslts" Application.EnableEvents = False 'This avoids the Worksheet event from restarting again every time the PivotTable page is changed. Application.ScreenUpdating = False If Target.Address = "$H$1" Then For Each pt In Target.Worksheet.PivotTables Rem Set PageField Set pf = Nothing On Error Resume Next Set pf = pt.PageFields(strField) On Error GoTo 0 Rem Validate PageField If Not (pf Is Nothing) Then With pf .EnableMultiplePageItems = False Rem Set PageField Item Set pi = Nothing 'Initialize Item object On Error Resume Next 'This will avoid an error if the item is not present Set pi = .PivotItems(Target.Value2) 'No need to loop through the items just set the required item On Error GoTo 0 'Clears the Error Object Rem Validate & Set PageField Item If Not (pi Is Nothing) Then .CurrentPage = Target.Value2 Else .CurrentPage = "(blank)" End If: End With: End If: Next: End If Application.EnableEvents = True Application.ScreenUpdating = True End Sub 以确保您使用源数据中的最新更新,同时了解PivotTables属性PivotItem和{{的不同值1}}可能有。

建议阅读以下页面以深入了解所使用的资源:

On Error Statement

PivotCache Object (Excel)PivotFields Object (Excel)PivotItems Object (Excel)

答案 1 :(得分:1)

我同意应删除... + scale_x_discrete(labels = NULL, expand = c(0, .2)) + ... ,因为它会掩盖导致代码崩溃的任何潜在错误。

我从经验中也知道,更新多个数据透视表对性能非常不利,尤其是在数据源非常大的情况下。

也就是说,提高此代码性能的一种方法是将On Error Resume Next块调整为仅更改页面字段一次IF值每个PivoTable。现在你拥有它的方式将改变透视项上每个测试的值 - 这取决于字段中的项目数量,可能要求Excel做很多事情。换句话说,每当数据透视表项不等于用户名时,要求Excel手动将CurrentPage值设置为空

重构代码

.CurrentPage