Длинный тип данных не хранит длинное значение в Excel VBA
Когда я выполняю приведенный ниже код в Excel VBA, первое окно сообщения возвращает длинное значение правильно, но когда я сохраняю это значение в длинном типе данных и в окне сообщения длинная переменная, оно возвращает 0 (?!).
Sub Test()
Dim lFileCount As Long
Dim lAdder As Long
lFileCount = 1
MsgBox 0.35! + (0.15! / lFileCount)
lAdder = 0.35! + (0.15! / lFileCount)
MsgBox lAdder
MsgBox Format(lAdder, "0.0")
End Sub
Причиной восклицательных знаков является переполнение длинных строк в проекте, из которого я экстраполировал код. Если я удаляю их, это не меняет результат. Я понятия не имею, что может быть причиной этого, я сначала подумал, что это как-то связано с тем, как переменная хранится в соответствии с порядком операций, но у меня нет рабочего решения.
Я озадачен, любая помощь будет принята с благодарностью!
2 ответа
Длинное целое число.
Я изменил lAdder на Variant, чтобы получить десятичное значение:
Sub Test()
Dim lFileCount As Long
Dim lAdder As Variant
lFileCount = 1
MsgBox 0.35 + (0.15 / lFileCount)
lAdder = 0.35 + (0.15 / lFileCount)
MsgBox lAdder
MsgBox Format(lAdder, "0.0")
End Sub
Похоже, мое использование As Variant было неподходящим, как показано в комментариях к этому ответу. В качестве Double следует использовать десятичные дроби:
Sub Test()
Dim lFileCount As Long
Dim lAdder As Double
lFileCount = 1
MsgBox 0.35 + (0.15 / lFileCount)
lAdder = 0.35 + (0.15 / lFileCount)
MsgBox lAdder
MsgBox Format(lAdder, "0.0")
End Sub
Причиной восклицательных знаков является переполнение длинных строк в проекте, из которого я экстраполировал код. Если я удаляю их, это не меняет результат.
Прочитайте, что вы сказали. Дважды. Вам не нужны эти подсказки типа. Любой литерал с плавающей точкой в VBA неявно Double
- типом намекая это с !
ты делаешь их Single
, что уменьшает размер и точность типа, который вы в противном случае использовали бы.
Немного изучив типы данных VBA, вы обнаружили бы, что Long
не может содержать значения с плавающей точкой. Long
32-разрядное целое число, это все. Так делаем это:
Dim lAdder As Long
И затем делать это:
MsgBox Format(lAdder, "0.0")
Не имеет смысла: десятичная часть любого целочисленного значения всегда будет 0.
А также 0.35 + 0.15
всегда будет 0.5
, который преобразован в Long
также всегда будет 0:
Debug.Print CLng(0.5) 'prints 0
И это то, что вы делаете здесь, неявно:
lAdder = 0.35! + (0.15! / lFileCount)
Вы принимаете Double
и назначив его Long
, Результатом будет Long
,
декларировать lAdder As Double
и проблема решена.
Тем не менее, бросьте это l
префикс. Это бесполезно, сбивает с толку и пахнет нотацией Systems Hungarian, которая не служит абсолютно никакой цели, кроме как раздувает ваш код и делает все труднее читать, чем должно быть.