DateDiff дает неправильный результат, когда я устанавливаю значение dd 12 или меньше.Формат даты - мм / дд / гг - PullRequest
0 голосов
/ 23 марта 2019

Если значение даты «dd» равно «12» или меньше, то для переменной StartDate ответ неверен.

Например.Когда StartDate равен «03/12/19», а значение EndDate равно «03/23/19», он возвращает -5573, что, очевидно, является неправильным ответом.

Если значение «dd» длядата в «13» или более, в переменной StartDate, тогда ответ правильный.

Например, если StartDate равен «03/03/19», а значение EndDate равно «03/23/19», это дает 10, что является правильным ответом.

Я не совсем понимаю.Кстати, код vba на MacOS Excel Mac 2011.

Кроме того, странно то, что этот точно такой же код рабочей книги отлично работает на моем Win 7 PC Excel 2007 независимо от того, какое значение «dd» вы используете. !!!!

Sub DateDiffTest()

    Dim StartDate As Date    ' Declare variables.
    Dim EndDate As Date    ' Declare variables.
    Dim Msg
    StartDate = Format("03/12/19", "mm-dd-yy")
    EndDate = Format("03/23/19", "mm-dd-yy")
    Msg = "Days from today: " & DateDiff("d", EndDate, StartDate)
    MsgBox Msg
End Sub

1 Ответ

1 голос
/ 23 марта 2019

Ваши проблемы связаны с необъявленными переменными, а также с тем, что VBA ориентируется на использование США в качестве даты, а ваши региональные настройки не соответствуют вашим действиям.

Я подозреваю, что ваши региональные настройки коротких датYMD.

А то, что вы думаете dd, VBA считает mm.

Так что, когда значение равно <= 12, оно преобразуется в YMD StartDate --> 2003-Dec-19

Если это >12, это не может быть месяц, поэтому VBA интерпретирует его как день и преобразует его в дату, ориентированную на США.Итак, EndDate --> 2019-Mar-23

Вы должны объявить все переменные, а также при кодировании использовать однозначные даты.

например:

Option Explicit
Sub DateDiffTest()
    'OK to use US-centric MDY here
    Const StartDate As Date = #3/12/2019#
    Const EndDate As Date = #3/23/2019#
    Dim Msg As String

Msg = "Days from today: " & DateDiff("d", EndDate, StartDate)
MsgBox Msg
End Sub

Другой способ однозначного объявления дат:

Option Explicit
Sub DateDiffTest()
    Dim StartDate As Date
    Dim EndDate As Date
    Dim Msg As String

StartDate = "2019-Mar-12"
EndDate = "2019-Mar-23"

Msg = "Days from today: " & DateDiff("d", EndDate, StartDate)
MsgBox Msg
End Sub

Кстати, я не понимаю, почему MS делает НЕ требующим объявление переменных по умолчанию.Выберите Tools/Options/Editor и отметьте Require Variable Declaration.Это поместит Option Explicit в начале любого нового модуля.Чтобы исправить этот модуль, введите его вручную в начале.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...