【问题标题】:Filtering between two dates in pivot table using VBA. UK to US date format issue使用 VBA 在数据透视表中的两个日期之间进行过滤。英国到美国的日期格式问题
【发布时间】:2014-05-21 06:19:30
【问题描述】:

我已经找到了解决方法,但如果有人有更清洁的方法,我会很感兴趣/感激不尽。

我在电子表格上有两个框,称为 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)。可笑!

这就是我解决它的方法:

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

如果您对这种完全疯狂的行为有一个简化的解决方案和/或解释,我将不胜感激!

【问题讨论】:

    标签: excel vba date format pivot-table


    【解决方案1】:

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

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

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

    【讨论】:

    • 完美!非常感谢 a) 证明我没有发疯和 b) 一个简洁的解决方案。
    【解决方案2】:

    我发现您的方法将日期截断为天。这可能是你想要的,对我来说,我想精确到小时。我一直收到错误:

    无法设置过滤器

    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
    

    信息:英国日期格式!

    【讨论】:

      猜你喜欢
      • 2014-05-30
      • 2014-06-28
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 2016-11-07
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      相关资源
      最近更新 更多