Сводная таблица VBA Фильтр по датам до - PullRequest
1 голос
/ 25 февраля 2020

Я новичок в этом форуме и буду очень признателен за некоторые рекомендации по проблеме, с которой я имел дело в течение последних 4 дней.

У меня есть макрос для фильтрации сводной таблицы по датам перед датой в ячейке B5 на том же листе. К сожалению, это дает некоторые данные, но не все данные.

enter image description here

Ниже приведен код, который у меня есть (на основе исследования / копирования), я прошу прощения, если код не является наилучшей практикой. Я также приложил картинку для справки. Заранее благодарю за отзыв и поддержку.

'Sub BeforeDate()

Dim sSheetName As String
Dim sPivotName As String
Dim sFieldName As String
Dim sFilterCrit As String
Dim pi As PivotItem

    'Set the variables
    sSheetName = "PivotTable"
    sPivotName = "PivotTable1"
    sFieldName = "apptdate"
    'sFilterCrit = "5/2/2019"
    sFilterCrit = ThisWorkbook.Worksheets(sSheetName).Range("B5").Value

    With ThisWorkbook.Worksheets(sSheetName).PivotTables(sPivotName).PivotFields(sFieldName)
        'Clear all filter of the pivotfield
        .ClearAllFilters

        'Loop through pivot items of the pivot field
        'Hide or filter out items that do not match the criteria

        For Each pi In .PivotItems
            If pi > Range("B5") Then
                pi.Visible = False
            Else
                pi.Visible = True
            End If
        Next pi

    End With

End Sub

1 Ответ

1 голос
/ 26 февраля 2020

Пара вещей не так с вашим кодом. Во-первых, чтобы преобразовать строку в дату, оберните ее в CDate () (т. Е. CDate(ThisWorkbook.Worksheets(sSheetName).Range("B5").Value)).

Далее, ваш For Each сравнивает pi (объект PivotItem) с Range ("B5") - Я полагаю, что вы имели в виду обращение к sFilterCrit вместо Range ("B5"), а pi должно быть pi.Value (я думаю, он все равно будет работать как в VBA, но вы действительно хотите значение, а не объект). Кроме того, это должно быть передано в CDate () так же, как значение sFilterCrit было выше.

Наконец, вы можете упростить свой оператор If, используя следующее: pi.Visible = CDate(pi.Value) < sFilterCrit По сути, результат вашего оператора If (true или false) передается в свойство Visible (обратите внимание на переключаемый оператор сравнения).

Вот обновленный код:

Sub BeforeDate()

Dim sSheetName As String
Dim sPivotName As String
Dim sFieldName As String
Dim sFilterCrit As String
Dim pi As PivotItem

    'Set the variables
    sSheetName = "PivotTable"
    sPivotName = "PivotTable1"
    sFieldName = "apptdate"
    'sFilterCrit = "5/2/2019"
    sFilterCrit = CDate(ThisWorkbook.Worksheets(sSheetName).Range("B5").Value)

    With ThisWorkbook.Worksheets(sSheetName).PivotTables(sPivotName).PivotFields(sFieldName)
        'Clear all filter of the pivotfield
        .ClearAllFilters

        'Loop through pivot items of the pivot field
        'Hide or filter out items that do not match the criteria

        For Each pi In .PivotItems
            pi.Visible = CDate(pi.Value) < sFilterCrit
        Next pi

    End With

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...