我有一个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
此致
答案 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}}可能有。
建议阅读以下页面以深入了解所使用的资源:
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