Reputation: 95
I have found a workaround for this but if anyone has a cleaner way of doing this I'd be interested/grateful.
I have two boxes on a spreadsheet, called DateFrom and DateTo for use with a Date filter in a pivot table. Both are in the format DD/MM/YYYY. The data feeding into the table is also in this format. The pivot table also returns the dates in the same format. All my settings are in English UK and I've tried this on a separate machine with the same results.
I then use the following code to feed into the pivot table:
ActiveSheet.PivotTables("Pivot").PivotFields("Date").PivotFilters. _
Add Type:=xlDateBetween, Value1:=Range("DateFrom").Value, Value2:=Range("DateTo").Value
The code reads the two cells as string and then applies this to the pivot table as if they were US format (MM/DD/YYYY). Ridiculous!
This is how I got around it:
I had two more cells looking at these two cells in numeric format and aimed the code at these two cells instead. Not sure about any of you but I would struggle to convert any date into numeric in my head...!
If you have a simplified solution and/or explanation to this utter craziness I'd be much obliged!
Upvotes: 6
Views: 22445
Reputation: 181
I found your method truncated the dates to days. This might be what you want, for me I wanted to get down to the hour. I kept getting the error:
Unable to Set Filter
Level_Trend_Date_From = 14/05/2020 22:00:00
Level_Trend_Date_To = 16/05/2020 00:00:00
Error # 1004 was generated by VBAProject
Application-defined or object-defined error
My fix for this was to just clear the filter before I set it:
Sub Level_Trend_Set_Dates()
'
' Level_Trend_Set_Dates Macro
' Recorded and tweaked
' Some input from https://stackoverflow.com/questions/22938973/filtering-between-two-dates-in-pivot-table-using-vba-uk-to-us-date-format-issue
'
On Error GoTo ErrorCatch
Level_Trend_Date_From = Range("Level_Trend_Date_From").Value
Level_Trend_Date_To = Range("Level_Trend_Date_To").Value
Level_Trend_Date_From = Format(Level_Trend_Date_From, "DD/MM/YYYY HH:MM")
Level_Trend_Date_To = Format(Level_Trend_Date_To, "DD/MM/YYYY HH:MM")
'If filter is not cleared before being set, always get Error# 1004: Application-defined or object-defined error
ActiveSheet.PivotTables("PivotTable1").PivotFields("Date/Time").ClearAllFilters
ActiveSheet.PivotTables("PivotTable1").PivotFields("Date/Time").PivotFilters.Add _
Type:=xlDateBetween, _
Value1:=Level_Trend_Date_From, _
Value2:=Level_Trend_Date_To
'Value1:=CLng(Level_Trend_Date_From), _
'Value2:=CLng(Level_Trend_Date_To)
GoTo EndSub
ErrorCatch:
ErrorMsg = "Unable to Set Filter" & vbCr
ErrorMsg = ErrorMsg & vbCr & "Level_Trend_Date_From = " & Level_Trend_Date_From
ErrorMsg = ErrorMsg & vbCr & "Level_Trend_Date_To = " & Level_Trend_Date_To
ErrorMsg = ErrorMsg & vbCr & "Error # " & Str(Err.Number)
ErrorMsg = ErrorMsg & vbCr & "was generated by " & Err.Source
ErrorMsg = ErrorMsg & vbCr & Err.Description
MsgBox ErrorMsg, vbCritical, "Level_Trend_Set_Dates - Error", Err.HelpFile, Err.HelpContext
EndSub:
End Sub
Info: UK Date format!
Upvotes: 0
Reputation: 3200
Indeed, this is strange. I've reproduced your issue with Excel 2007 and German locale settings.
However, when converting the date values to Long
s using CLng
, everything works:
ActiveSheet.PivotTables("Pivot").PivotFields("Date").PivotFilters. _
Add Type:=xlDateBetween, Value1:=CLng(Range("DateFrom").Value), Value2:=CLng(Range("DateTo").Value)
Upvotes: 6