Еще одна ошибка переполнения Excel VBA CDate

#excel #vba #macos #date #overflow

#преуспеть #vba #macos #Дата #переполнение

Вопрос:

У меня есть два простых модуля VBA. Один работает нормально (WorksOK). Один из них выдает ошибку переполнения (DoesntWork). Разница между ними заключается в том, что WorksOK вызывает MsgBox. Оба вычисляют дату 2 января 2021 года, добавляя единицу к CDate(«1 января 2021 года»). Может кто-нибудь, пожалуйста, объяснить, почему WorksOK работает нормально, а DoesntWork не работает?

Я наблюдаю такое поведение только в:

  • Excel Mac Catalina 16.44 VBA 7.1
  • Word Mac Catalina 16.44 VBA 7.1.

Excel VBA в Windows, кажется, в порядке.

 Sub WorksOK()
    Dim j As Integer, y As Date
    j = 1
    y = CDate("January 1, 2021")   j
    Debug.Print y
    MsgBox y
    Debug.Print CDate("January 1, 2021")   j
End Sub

Sub DoesntWork()
    Dim j As Integer, y As Date
    j = 1
    y = CDate("January 1, 2021")   j
    Debug.Print y
    Debug.Print CDate("January 1, 2021")   j  'Overflow
End Sub
 

Комментарии:

1. Что происходит с Dim j As Long ?

2. Дата 1/1/2021 преобразуется в число 44 197. Integer максимальное значение составляет 32 767, поэтому вы получаете ошибку переполнения.

3. Поведение такое же, независимо от того, является ли j длинным или целым числом

4. Даррелл Х: Хорошо, предположим, что проблема в размере даты. Тогда почему VBA не жалуется в версии Windows? И почему MsgBox имеет значение?

5. Да, кажется, Excel в Windows преобразуется правильно. Код выполняется на моем компьютере с Windows.

Ответ №1:

Не могу сказать, но всегда обрабатывайте даты как даты, а не строки, а не числа, без исключений.

Это выполняется:

 Sub DoesntWork()
    Dim j As Integer, y As Date
    j = 1
    y = DateAdd("d", j, #1/1/2021#)
    Debug.Print y
    Debug.Print DateAdd("d", j, #1/1/2021#)
End Sub
 

Комментарии:

1. Хммм. Вы проверили это на Mac? Когда я это сделал, я получил такое же поведение (ovflo в последнем операторе)

2. Нет, у меня нет Mac, но происходит что-то еще; добавление одного дня к дате, предшествующей 9999-12-31, никак не может привести к переполнению. Вы даже можете Dim j As Byte , и это все равно будет работать.

3. Да, это головоломка. Если вы думаете о проведении экспериментов, дайте мне знать, и я попробую их на Mac.