4

我有以下代码,它打开一个excel文件,选择工作表并运行一个宏 - 然后我设法让它删除日期的过滤器,但我无法让它过滤到"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

日期"01/07/2013"在数据透视表的源数据中可用,我可以手动选择它,但不能自动选择。

这让我很困惑,因为我只需要它来显示一个日期。

4

2 回答 2

2

如果您只想显示01/07/2013,那么一旦您清除了过滤器,您需要隐藏01/07/2013 之外的所有内容,因此请尝试以下操作:

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,您将看到它是“1/7/2013”​​而不是“01/07/2013”​​。至少对我来说是这样。

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
于 2013-07-04T16:34:51.313 回答
2

我意识到我在原始帖子之后遇到了类似的问题,尽管这个线程非常鼓舞人心 - 帮助我的是:

.PivotCache.MissingItemsLimit = xlMissingItemsNone

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

    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
于 2020-08-11T14:55:50.473 回答