Следующий код Excel VBA сравнивает эффект накопления часов (1/24 дня) в массиве Variant с элементами Date и в массиве Date. У меня есть столбцы C, E, G, отформатированные как Date и D, F, H как Number с большим количеством dps. В столбцах A и B я воспроизвел расчет с использованием функций рабочего листа. Вы, вероятно, не поверите, пока не попробуете, но последний вывод из массива Variant Date на 1 день раньше. Числовое значение, которое VBA сообщает как 39814,9999999999, преобразуется в 39814 в Excel.
Изменить: когда я говорю столбцы C, E, G в формате даты, я имею в виду пользовательский «дд/мм/гггг чч: мм: сс.00».
Кто-нибудь видел это раньше? Но что еще более важно, как мне узнать, чему я могу доверять при использовании Вариантов? У меня есть десятки тысяч строк, которые нужно поддерживать, и массивы Variant используются везде, где нам нужно выполнять интенсивную обработку данных Excel.
Sub FillDatesBug()
Dim dtHours() As Date
Dim vHours As Variant
Dim vHours2 As Variant
Dim dtHour As Date
Dim dHour As Double
Dim i As Long
ReDim dtHours(1 To 25, 1 To 1)
ReDim vHours(1 To 25, 1 To 1)
ReDim vHours2(1 To 25, 1 To 1)
dtHour = CDate(1 / 24)
dHour = 1 / 24
dtHours(1, 1) = CDate(39814)
vHours(1, 1) = CDate(39814)
vHours2(1, 1) = 39814#
For i = 2 To 25
dtHours(i, 1) = dtHours(i - 1, 1) + dtHour
vHours(i, 1) = vHours(i - 1, 1) + dtHour
vHours2(i, 1) = vHours2(i - 1, 1) + dHour
Next i
Range("C2:C26").Value = dtHours
Range("D2:D26").Value = dtHours
Range("E2:E26").Value = vHours
Range("F2:F26").Value = vHours
Range("G2:G26").Value = vHours2
Range("H2:H26").Value = vHours2
Range("C28").Value = "dtHours(25,1) = " & dtHours(25, 1) & " or " & CDbl(dtHours(25, 1))
Range("E28").Value = "vHours(25,1) = " & vHours(25, 1) & " or " & CDbl(vHours(25, 1))
Range("G28").Value = "vHours2(25,1) = " & Format(vHours2(25, 1), "dd/mm/yyyy hh:mm:ss") & " or " & vHours2(25, 1)
End Sub
А вот скриншот — у меня нет представителя, чтобы показать его, по всей видимости.
Как видите, массив Date и массив Variant с элементами Double дают правильные ответы (включая совершенно нормальную и понятную числовую ошибку). Некоторые значения в массиве Variant с элементами Date неправильно переводятся в Excel.
Первый человек, который действительно увидит, что я здесь говорю, получит мою вечную благодарность.