VBA Sumifs запутался о датах, неправильный результат в апреле - PullRequest
1 голос
/ 14 июня 2011

Я слежу за этим другим вопросом о переполнении стека и был очень просвещен, но когда я проверил здравый смысл результатов, я получил это особое странное поведение в апреле, любой rev_date урожайности в апреле результат 0. Я пробовал разные даты и интервалы rev_date и grid_date, но происходит одно и то же. Можно ли винить конфигурацию системной даты? что мне не хватает?

ИМХО, я бы предпочел использовать формулировку in-excel вместо UDF, но этот странный результат зудит в моей голове.

Screen of the testcase

используя этот UDF:

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

  Dim Team As Range
  Dim First_PD As Range
  Dim PAmount1 As Range

  Application.Volatile (True)

  Set PAmount1 = Sheets("Sheet1").Range("$F6:$F12")
  Set First_PD = Sheets("Sheet1").Range("$E6:$E12")
  Set Team = Sheets("Sheet1").Range("$D6:$D12")

            GRIDSALES = Application.WorksheetFunction.SumIfs( _
            PAmount1 _
            , Team, "<>9" _
            , First_PD, ">=" & Format$(rev_date, "dd mmm yyyy") _
            , First_PD, "<=" & Format$(Application.WorksheetFunction.EoMonth(grid_date, 0), "dd mmm yyyy"))

End Function

Ответы [ 2 ]

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

Я следовал тому, что у тебя было, и я получил правильный результат.Вы жестко программируете настройки даты на «дд ммм гггг», которые, как я обнаружил при работе с французскими настройками, не распознаются.Проверьте свои настройки через панель управления, какие региональные настройки у вас есть.Кроме того, проверьте свою дату мм / дд использования.Измените форматирование ячейки, чтобы указать название месяца вместо «05».Таким образом вы можете убедиться, что вы не меняете местами дни и месяцы. И каждая дата действительно является датой.

enter image description here

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

Не уверен, но я думаю, что в VBA вы всегда должны использовать американский формат даты.Я обычно определяю это как константу:
const kUsDate = "mm\/dd\/yyyy"
Обратная косая черта - это escape-символ.
В качестве доказательства попробуйте следующее: введите дату типа 20.06.2011 (стиль французского) в B2, затемиз VBA запустите код

Debug.Print ActiveCell.NumberFormat

Excel вернет: m/d/yyyy CQFD
; -)

...