Длинный тип данных не хранит длинное значение в 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, которая не служит абсолютно никакой цели, кроме как раздувает ваш код и делает все труднее читать, чем должно быть.

Другие вопросы по тегам