Excel VBA - 数据透视表筛选器运行时错误'1004'PivotItems

时间:2013-07-04 09:43:19

标签: excel vba excel-vba filter pivot-table

我有以下代码,它打开一个excel文件,选择工作表并运行一个宏 - 然后我设法让它删除Date的过滤器,但是我很难将它过滤到{{1 }}

"01/07/2013"

我收到以下错误消息Sub Data() Dim oExcel As Excel.Application Dim oWB As Workbook Dim oSheets As Sheets Dim oPi As PivotItem Set oExcel = New Excel.Application oExcel.Workbooks.Open ("\\A79APBRSFACTD\MDSS\FactivityServer\FactShar\OEE_Daily2.xls") oExcel.Visible = True Set oExcel = Excel.Application Set oWB = oExcel.Workbooks("OEE_Daily2.xls") oWB.Sheets("OEE Pivot Daily").Select oExcel.Run ("Update_OEE_Daily") oWB.Sheets("OEE Pivot Daily").Range("B3").Select With oWB.Sheets("OEE Pivot Daily").PivotTables("PivotTable2").PivotFields("Date") .ClearAllFilters .PivotItems("01/07/2013").Visible = True End With Set oExcel = Nothing Set oWB = Nothing End Sub

日历Run-time error '1004': Unable to get the PivotItems property of the PivotField class在数据透视表的源数据中可用,我可以手动选择它,但不能自动选择。

这令我感到困惑,因为我只需要它来显示一个日期。

2 个答案:

答案 0 :(得分:2)

我意识到我在原始帖子发布后就碰到了类似的问题,尽管该主题非常鼓舞人心-帮助我的是:

.PivotCache.MissingItemsLimit = xlMissingItemsNone

从数据透视表列表中清除保留的项目后-我成功地执行了我的代码,之后发生的事情是:

    FiltrArr = Array("wymagalne", "wymagalne na jutro", "przeterminowane", "puste")

    For Each PivotItem In .PivotFields("status").PivotItems
        If Not IsError(Application.Match(PivotItem.Caption, FiltrArr, 0)) Then
            PivotItem.Visible = True
        Else
            PivotItem.Visible = False
        End If
    Next PivotItem

答案 1 :(得分:1)

如果您尝试仅显示 01/07/2013,那么一旦您清除过滤器,您需要隐藏之外的所有内容2013年7月1日,请试试这个:

With oWB.Sheets("OEE Pivot Daily").PivotTables("PivotTable2").PivotFields("Date")
    .ClearAllFilters
    For Each oPi In .PivotItems
        If oPi .Value <> "1/7/2013" Then
            oPi .Visible = False
        End If
    Next pi
End With

确保删除零。

如果您单步执行代码并观看oPi.value,您会看到它是&#34; 1/7/2013&#34;而不是&#34; 01/07 / 2013&#34;。至少这是给我的。

对于区域日期来说,Excel是一场噩梦,所以如果你使用美国mm / dd / yyyy格式,这应该有效。如果您使用的是dd / mm / yyyy格式,则需要根据美国格式的日期检查oPi.value。烦人。

2013年7月23日编辑:

在应用过滤器之前搜索数据的新代码以及大量重新格式化以解决美国日期格式问题:

Sub RunFilter()

    Dim strFilterDate As String
    Dim datFilterDate As Date
    Dim rngDateRange As Range
    Dim c As Range

    strFilterDate = InputBox("Enter the filter date in dd/mm/yyyy format.", "Enter date", Format(Now(), "dd/mm/yyyy"))

    If IsDate(strFilterDate) And Len(strFilterDate) = 10 Then
        datFilterDate = DateSerial(Right(strFilterDate, 4), Mid(strFilterDate, 4, 2), Left(strFilterDate, 2))
        Set rngDateRange = ThisWorkbook.Worksheets("Sheet1").Range("B:B").SpecialCells(xlCellTypeConstants)
        For Each c In rngDateRange
            If c.Value2 = datFilterDate Then
                ApplyPTFilter (datFilterDate)
                Exit For
            End If
        Next c  
    End If
End Sub


Sub ApplyPTFilter(datDate As Date)

    Dim pi As PivotItem
    Dim strDate As String

    strDate = Format(datDate, "m/d/yyyy")

    With ThisWorkbook.Sheets("OEE Pivot Daily").PivotTables("PivotTable2").PivotFields("Date")
        .ClearAllFilters
        For Each pi In .PivotItems
            If pi.Value <> strDate Then
                pi.Visible = False
            End If
        Next pi

    End With

End Sub