![](/img/trans.png)
[英]Excel VBA: 'excel vba run-time error 1004' application-defined or object-defined error
[英]VBA Pivot Table Filter Run-time error '1004': Application-defined or object-defined error
我正在嘗試編寫 VBA 腳本以根據兩個單元格中的值更新 pivot 表的過濾器,但我不斷收到 1004 運行時錯誤。 我根據其他問題的答案嘗試了各種方法,但我仍然無法弄清楚問題是什么。
注意:我讀過有時會發生錯誤,因為 pivot 表需要至少一個可見值,但即使我設置 Visible = True 也會發生此錯誤
VBA 代碼:
Private Sub PageItemFilter()
Dim pvtF As PivotField
Dim pvtI As PivotItem
Dim startDate As Date
Dim endDate As Date
Dim filterDate As Date
startDate = Range("start_date").Value
endDate = Range("end_date").Value
Set pvtF = Worksheets("selection").PivotTables("PivotTable1").PivotFields("[tbl_Main].[TransactionDate].[TransactionDate]")
pvtF.ClearAllFilters
For Each pvtI In pvtF.PivotItems
filterDate = DateValue(Mid(pvtI.Name, 24, 10))
If filterDate >= startDate And filterDate <= endDate Then
Debug.Print (pvtI.Name)
Debug.Print (TypeName(pvtI))
Debug.Print (pvtI.Visible)
pvtI.Visible = True
Else
pvtI.Visible = False
End If
Next pvtI
End Sub
Output(第一項):
[tbl_Main].[TransactionDate].&[2019-08-05T00:00:00]
PivotItem
True
錯誤: Run-time error '1004': Application-defined or object-defined error
嘗試添加條件以檢查 pivot 項目是否可見
..... code
if not pvtI.Visible = True then pvtI.Visible = True
Else
if not pvtI.Visible = false then pvtI.Visible = false
End If
Next pvtI
End Sub
感謝@TimWilliams 將我引導至此解決方案。 簡短的回答是,我試圖做的事情對於 OLAP 數據透視表是不可能的。 我實施了建議解決方案的一個版本,它就像一個魅力。 我在下面為遇到此問題的任何人提供了我的解決方案代碼。
Sub PageItemFilter()
Dim pvtF As PivotField
Dim pvtI As PivotItem
Dim startDate As Date
Dim endDate As Date
Dim filterDate As Date
Dim visibleArray() As String
Dim isEmpty As Boolean
ReDim visibleArray(1 To 1) As String
startDate = Range("start_date").Value
endDate = Range("end_date").Value
isEmpty = True
Worksheets("selection").Activate
Set pvtF = Worksheets("selection").PivotTables("PivotTable1").PivotFields("[tbl_Main].[TransactionDate].[TransactionDate]")
pvtF.ClearAllFilters
If startDate > endDate Then
MsgBox "The start date is after the end date. Cannot update filters"
Exit Sub
End If
For Each pvtI In pvtF.PivotItems
filterDate = DateValue(Mid(pvtI.Name, 35, 10))
If filterDate >= startDate And filterDate <= endDate Then
isEmpty = False
visibleArray(UBound(visibleArray)) = pvtI.Name
If filterDate >= endDate Then
Exit For
Else
ReDim Preserve visibleArray(1 To UBound(visibleArray) + 1) As String
End If
End If
Next pvtI
If isEmpty Then
MsgBox "No data for the dates selected. Cannot update filters"
Exit Sub
Else
ActiveSheet.PivotTables("PivotTable1").PivotFields("[tbl_Main].[TransactionDate].[TransactionDate]").VisibleItemsList = visibleArray
End If
End Sub
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.