簡體   English   中英

VBA Pivot 表過濾器運行時錯誤“1004”:應用程序定義或對象定義錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM