【问题标题】:VBA Pivot Table Filter Run-time error '1004': Application-defined or object-defined errorVBA 数据透视表筛选器运行时错误“1004”:应用程序定义或对象定义错误
【发布时间】:2020-12-23 10:54:50
【问题描述】:

我正在尝试编写一个 VBA 脚本来根据两个单元格中的值更新数据透视表的过滤器,但我不断收到 1004 运行时错误。我已经根据其他问题的答案尝试了各种方法,但我仍然无法弄清楚问题所在。

注意:我读到有时会发生错误,因为数据透视表需要至少一个可见值,但即使我设置 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

输出(第一项):

[tbl_Main].[TransactionDate].&[2019-08-05T00:00:00]
PivotItem
True

错误:Run-time error '1004': Application-defined or object-defined error

【问题讨论】:

  • 我不明白为什么我可以读取变量pvtI.Visible 但我无法设置它。如果有其他方法可以解决这个问题,即使它不是 VBA 解决方案,我也很乐意尝试
  • 如果 visible 属性已经可见,为什么不跳过设置(并且您刚刚清除了所有过滤器,所以在您进入循环之前所有项目都可见)?
  • @TimWilliams 我可以,但它仍然会在pvtI.Visible = False 上引发错误。我发现代码只遍历已经可见的项目(如果我不清除所有过滤器),我想知道这是否不是问题所在的线索?
  • 对不起,我没有想法,没有数据透视表就无法真正进行测试。也许看看这里:stackoverflow.com/questions/49453039/…
  • @TimWilliams 非常感谢!!看起来这就是答案。我会尝试一下,然后发布我的发现。感谢您的帮助!

标签: excel vba


【解决方案1】:

尝试添加条件以检查枢轴项目是否可见

 ..... 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

【讨论】:

  • 不幸的是,不幸的是,它仍然给我同样的错误,只要我尝试分配一个值
【解决方案2】:

感谢@TimWilliams 将我引导至this solution。简短的回答是,我试图做的事情对于 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多