Пара вещей не так с вашим кодом. Во-первых, чтобы преобразовать строку в дату, оберните ее в 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