【问题标题】:VBA SUMIFs getting confused about dates - producing incorrect resultVBA SUMIF 对日期感到困惑 - 产生不正确的结果
【发布时间】:2011-06-13 16:45:48
【问题描述】:

下面的代码产生了错误的结果。在工作表上,我们使用了两种相同的日期格式(dd/mm/yyyy),但是当运行以下命令时,它似乎试图将 rev_date 解释为美国日期格式,同时解释 grid_date 作为正确的英国格式。

我们通过将工作表上的 rev_date 更改为美国格式对此进行了测试,在这种情况下它会产生正确的结果。

任何想法为什么我们需要将 rev_date 更改为美国格式,我们更愿意将其保留为英国?

Public Function GRIDSALES(rev_date As Date, grid_date As Date) As Double


  Dim Order_Type As Range
  Dim Final_Price As Range
  Dim PaidAlt As Range
  Dim Excl_Rev As Range
  Dim PAmount1 As Range
  Dim PMethod1 As Range
  Dim PAmount2 As Range
  Dim PayDate2 As Range
  Dim PMethod2 As Range
  Dim Vstatus As Range
  Dim Team As Range

  Application.Volatile (True)

  Set Order_Type = Sheets("KRONOS").Range("$D:$D")
  Set Final_Price = Sheets("KRONOS").Range("$H:$H")
  Set PaidAlt = Sheets("KRONOS").Range("$I:$I")
  Set Excl_Rev = Sheets("KRONOS").Range("$K:$K")
  Set PAmount1 = Sheets("KRONOS").Range("$O:$O")
  Set First_PD = Sheets("KRONOS").Range("$Q:$Q")
  Set PMethod1 = Sheets("KRONOS").Range("$R:$R")
  Set PAmount2 = Sheets("KRONOS").Range("$T:$T")
  Set PayDate2 = Sheets("KRONOS").Range("$V:$V")
  Set PMethod2 = Sheets("KRONOS").Range("$W:$W")
  Set Vstatus = Sheets("KRONOS").Range("$DL:$DL")
  Set Team = Sheets("KRONOS").Range("$DO:$DO")

            GRIDSALES1 = Application.WorksheetFunction.SumIfs( _
            PAmount1 _
            , Team, "<>9" _
            , Vstatus, "<>rejected", Vstatus, "<>unverified" _
            , Excl_Rev, "<>1" _
            , PMethod1, "<>Credit" _
            , PMethod1, "<>Amendment" _
            , PMethod1, "<>Pre-paid" _
            , First_PD, ">=" & rev_date _
            , First_PD, "<=" & Application.WorksheetFunction.EoMonth(grid_date, 0))

            GRIDSALES = GRIDSALES1

结束函数

【问题讨论】:

    标签: vba date


    【解决方案1】:

    当你这样做时

    First_PD, ">=" & rev_date
    

    还有这个

    First_PD, "<=" & Application.WorksheetFunction.EoMonth(grid_date, 0))
    

    您将两个Date 类型的变量(rev_dategrid_date)隐式强制转换为String 类型。隐式强制是不好的做法,这是一个非常典型的例子,为什么它是不好的做法。您的日期应使用明确的格式显式转换为 String,例如

    First_PD, ">=" & Format$(rev_date,"dd mmm yyyy") 
    

    在这种格式中,2011 年 1 月 12 日不能与 2011 年 12 月 1 日混淆。

    【讨论】:

      【解决方案2】:

      我不确定日期格式发生变化的确切原因,但从过去的谷歌搜索来看,我相当肯定 VBA 会将日期解释为美国日期,这可能是问题所在。

      在你的函数中,你能把每个日期都尝试格式化为英国日期格式吗?示例:

      Public Function GRIDSALES(rev_date As Date, grid_date As Date) As Double
      
      Dim d1 as Date, d2 as Date
      
      d1 = CDate(Format(rev_date, "dd-mm-yyyy"))
      d2 = CDate(Format(grid_date, "dd-mm-yyyy"))
      
      ///rest of your code here...
      
      End Function
      

      【讨论】:

      • 感谢您,尽管它们都有效,但我选择了上面的一个作为主要答案。这可能会更容易一些。
      • @James:没问题。很高兴你得到了适合你的场景的东西
      【解决方案3】:

      谢谢,我的错误就是这样。

      但我是这样解决的

      fil1 = "<=" & Month(rev_date) & "/" & Day(rev_date) & "/" & Year(rev_date)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多