VBA SUMIF запутались в датах - неверный результат - PullRequest
0 голосов
/ 13 июня 2011

Приведенный ниже код дает неправильный результат.На рабочем листе мы используем два идентичных формата даты (дд / мм / гггг), однако, когда выполняется следующее, оно пытается интерпретировать 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 ]

4 голосов
/ 14 июня 2011

Когда вы делаете это

First_PD, ">=" & rev_date

и это

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

вы неявно приводите две переменные типа Date (rev_date и grid_date) к типу String. Неявное принуждение - плохая практика, и это довольно типичный пример того, почему это плохая практика. Ваши даты должны быть явно преобразованы в String с использованием однозначного формата, например

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

В этом формате 12 января 2011 года нельзя спутать с 1 декабря 2011 года.

1 голос
/ 13 июня 2011

Я не уверен точно, почему формат даты меняется, но, покинув гугл в прошлом, я вполне уверен, что 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
0 голосов
/ 15 июля 2014

Спасибо, моя ошибка была именно такой.

Но я решил это так

fil1 = "<=" & Month(rev_date) & "/" & Day(rev_date) & "/" & Year(rev_date)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...