使用VBA在数据透视表中的两个日期之间进行过滤。英国到美国的日期格式问题

时间:2014-04-08 13:44:59

标签: excel date excel-vba format pivot-table vba

我找到了一个解决方法,但如果有人有更清洁的方法,我会感兴趣/感激。

我在电子表格上有两个框,名为DateFrom和DateTo,用于数据透视表中的日期过滤器。两者的格式均为DD / MM / YYYY。输入表格的数据也采用这种格式。数据透视表也以相同的格式返回日期。我的所有设置都是英国英语,我在一台单独的机器上尝试了相同的结果。

然后我使用以下代码加入数据透视表:

ActiveSheet.PivotTables("Pivot").PivotFields("Date").PivotFilters. _
    Add Type:=xlDateBetween, Value1:=Range("DateFrom").Value, Value2:=Range("DateTo").Value

代码将两个单元格作为字符串读取,然后将其应用于数据透视表,就像它们是美国格式(MM / DD / YYYY)一样。可笑!

这就是我解决这个问题的方法:

我还有两个单元格以数字格式查看这两个单元格,并将代码对准这两个单元格。不确定你们中的任何人,但我很难将任何日期转换成数字在我脑海中......!

如果你有一个简单的解决方案和/或对这种疯狂的解释,我会非常感激!

2 个答案:

答案 0 :(得分:6)

确实,这很奇怪。我已使用Excel 2007和德语区域设置重现了您的问题。

但是,使用Long将日期值转换为CLng时,一切正常:

ActiveSheet.PivotTables("Pivot").PivotFields("Date").PivotFilters. _
Add Type:=xlDateBetween, Value1:=CLng(Range("DateFrom").Value), Value2:=CLng(Range("DateTo").Value)

答案 1 :(得分:0)

我发现您的方法将日期截断为几天。这可能就是您想要的,对我来说,我想开始工作了。我不断收到错误消息:

无法设置过滤器

Level_Trend_Date_From = 14/05/2020 22:00:00
Level_Trend_Date_To = 16/05/2020 00:00:00
错误#1004由VBAProject生成
应用程序定义或对象定义的错误

我的解决方法是在设置过滤器之前先清除过滤器:

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

信息:英国日期格式!