Excel VBA округление с двойными
Я пытаюсь сделать очень точный расчет, используя двойные числа, которые относятся к ячейкам в моей рабочей таблице. В процессе тестирования я написал следующий код:
Sub MacroTest()
Dim opt As Worksheet
Set opt = Sheets("Optimisation")
Dim test As Double
test = CDec(opt.Cells(2, 10))
End Sub
В ячейке J2 находится десятичное значение -3298,8599993... однако при отладке кода становится ясно, что тестовый двойник только принимает значение -3298,86 в качестве значения. Я не понимаю, почему это так, поскольку я думал, что удвоения были более точными, чем это. Большинство постов, которые я прочитал, похоже, считают, что использование CDec должно решить эту проблему, однако, как показано, это не работает для меня.
Примечание. Значение в J2 рассчитывается по формуле, но не уверен, что это имеет значение. Любая помощь с благодарностью - спасибо.
2 ответа
Вы должны использовать opt.Cells(2, 10).Value2
в этом случае. Range.Value2 свойство:
Единственное различие между этим свойством и свойством Value заключается в том, что свойство Value2 не использует типы данных Currency и Date. Вы можете вернуть значения, отформатированные с этими типами данных, как числа с плавающей запятой, используя тип данных Double.
Так что по умолчанию .Value
вернусь Currency
если ячейка отформатирована как валюта .Value2
вернет Double
тем не менее.
Я пока не могу комментировать, но вот что не так с вашим кодом:
Вы используете формулу преобразования CDec для двойного типа данных, и результат этой функции снова помещается в двойной тип данных. Таким образом, вы ничего не получаете здесь с точки зрения точности.
Вы уверены, что хотите использовать двойной тип данных, в то время как вы могли бы использовать десятичный тип данных в VBA?
В моем примере ячейка "A1" содержит десятичное число 3298.859999.
Dim varDec As Variant
varDec = CDec(Range("A1").Value2)
Debug.Print "Value in A1 : " & Format(varDec, "0.0000000000000000000000")
Прямое приведение переменной к типу Decimal-datatype невозможно в VBA, но тип Variant-datatype имеет тип Decimal-datatype в качестве подтипа.
Чтобы убедиться в этом: во время отладки посмотрите в окне "Locals" в VBE. Это покажет:
Expression : var
Value : 3298.859999
Type : Variant/Decimal