Это происходит потому, что когда вы вводите код в VBE, то, что вы видите, НЕ является тем, что вы получаете.
Текущая строка кода представляет собой обычный текст: он не воспринимается как код, пока вы не нажмете клавишу ВВОД или не перейдете от этой строки. Затем под капотом происходит несколько вещей:
- The VBE parses the current line of code, and determines if it can be compiled.
- If it's an invalid statement, it either pops a "compile error" message box, or highlights the statement in red (depending on your VBE "compile on demand" settings).
- Действительный код компилируется в инструкции P-Code и сохраняется вместе с исходным кодом в главном документе, хотя на данный момент все это все еще находится только в памяти.
- P-код преобразуется обратно в исходный код VBA, а только что введенная строка кода перезаписывается на месте.
Итак, когда вы пишете Foo = 8.45673E11
, VBE определяет, что правая часть присваивания является двойным литералом, и компилирует соответствующую инструкцию P-кода; когда эта инструкция преобразуется обратно в исходный код VBA, она «переписывается» как явный двойной литерал, 845673000000#
(суффикс #
является подсказкой типа, означающей «это Double
"), потому что P-Code не заботится о представлении числа (например, научной нотации), а только само число; добавляется символ подсказка типа, так что тип уже известен и его не нужно повторно вычислять снова при следующей компиляции выражения.
И когда вы пишете Foo = 8.45673E11
, вы все равно получаете Foo = 845673000000#
, потому что P-Code не заботится о этих пробелах.
Вот почему при вводе Public Foo As Double
при вводе foo = 123
вы получите Foo = 123
, потому что во внутренней таблице символов есть Foo
с F
в верхнем регистре.
person
Mathieu Guindon
schedule
27.08.2018
#
означает, что это двойной литерал. См. это: stackoverflow.com/q/3301733/4996248 - person John Coleman   schedule 27.08.2018CDbl(ws.Cell().Value)?
- person jcrizk   schedule 27.08.20182^31-1
, то VBE не будет добавлять никаких подсказок типа — преобразование (изLong
или изInteger
, если буквальное значение меньше2^15-1
) будет только произойдет позже, когда выражение будет вычислено. С подсказкой о типе преобразование происходит во время компиляции — в основном компилятор добавляет ярлыки для себя в исходный код. - person Mathieu Guindon   schedule 27.08.2018