Это происходит потому, что когда вы набираете код в VBE, то, что вы видите, НЕ то, что вы получаете .
Текущая строка кода - просто текст: она не понимается как code , пока вы не нажмете ENTER или не уйдете от этой строки. Затем под капотом происходит несколько вещей:
- VBE анализирует текущую строку кода и определяет, может ли она быть скомпилирована.
- Если это недопустимый оператор, он либо выдает окно сообщения об ошибке компиляции, либо выделяет оператор красным (в зависимости от настроек VBE «компилировать по требованию»).
- Действительный код скомпилирован в инструкции P-Code и хранится вместе с источником в главном документе - хотя на данный момент все это только в памяти.
- P-код переводится обратно в исходный код VBA, а введенная вами строка кода переписывается на месте.
Поэтому, когда вы пишете Foo = 8.45673E11
, VBE определяет, что RHS присвоения является двойным литералом , и компилирует соответствующую инструкцию P-кода; когда эта инструкция переводится обратно в исходный код VBA, она «переписывается» в виде явного двойного литерала , 845673000000#
(суффикс #
является подсказкой типа , означающей «это a Double
"), поскольку P-Code не заботится о представлении числа (например, научной записи), только о самом числе; добавлен символ подсказка типа , так что тип уже известен и не требует повторной оценки при следующей компиляции выражения.
И когда вы пишете Foo = 8.45673E11
, вы все равно получаете Foo = 845673000000#
, потому что P-код не заботится о этом пробеле.
Именно поэтому, учитывая Public Foo As Double
, если вы наберете foo = 123
, вы получите Foo = 123
, потому что внутренняя таблица символов имеет Foo
с заглавными буквами F
.