有通過每個PivotItems
的無需環路,只需設置pi
對象所需的值,事後驗證。
它還看來你沒有禁用Application.Events
(通過在過程結束時缺乏Application.EnableEvents = True
),如果是這樣的工作表事件再次觸發每次PivotField
頁面改變時,並且可能是原因的Excel崩潰。
注意,如果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
屬性Value
和SourceName
可能具有的不同值。
推薦閱讀以下網頁獲得的資源有了更深的瞭解使用:
On Error Statement,
PivotCache Object (Excel),PivotFields Object (Excel),PivotItems Object (Excel)
來源
2017-03-28 17:27:10
EEM
調試時,你應該總是避免'上的錯誤恢復下一頁'因爲它會掩蓋你正在尋找的錯誤。同樣,如果您正在尋找代碼處理的特定錯誤,它應該只在您的代碼中。 –
如果'pi.Value = Target.Value',則可以通過將布爾值設置爲true,然後只設置'.CurrentPage =「(空白)」'如果未設置該布爾值,則可以使If塊更高效。現在,您可以在*每個循環中設置.currentpage的值,直到「pi = target」。我的改變將有助於表現(可能有很大的幫助)。 –
嗨斯科特,謝謝你的建議,但你能澄清,因爲我不確定如何改變這個問題嗎? – dlan