VBA SUMIF对日期感到困惑 - 产生不正确的结果

时间:2011-06-13 16:45:49

标签: vba date

以下代码产生了错误的结果。在工作表上,我们使用两种相同的日期格式(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

结束功能

3 个答案:

答案 0 :(得分:4)

当你这样做时

First_PD, ">=" & rev_date

和这个

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

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

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

采用这种格式,2011年1月12日不能与2011年12月1日相混淆。

答案 1 :(得分:1)

我不确定为什么日期格式会发生变化,但过去谷歌搜索我很确定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

答案 2 :(得分:0)

谢谢,我的错误只是那个。

但我解决了这个问题

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