Эти вопросы и ответы используются как дублирующая цель, но ни один из ответов не рассказывает всю историю.
Во-первых, это поведение не имеет ничего общего с версией Excel или каким-либо другим приложением хоста:это просто стандартный синтаксис VBA, и правила были такими же уже более 20 лет - JavaScript и Perl также имеют свои соответствующие изломы , как и каждыйкогда-либо созданный язык программирования .
Когда скобки ограничивают список аргументов , VBE ставит открывающую скобку сразу после вызываемой функции:
foo = MsgBox("test")
^^^
Когда скобки интерпретируются как часть первого аргумента (то есть выражение в скобках ), VBE помещает пробел между вызванной процедурой и списком ее аргументов:
MsgBox ("test")
^^^
Этот код не будет компилироваться:
MsgBox ("test", vbInformation)
^^^
Поскольку все выражение в скобках является первым аргументом , и нет никакого способа ("test", vbInformation)
может быть оценено как значение - это синтаксическая ошибка, как в OP.
Если выражение может быть оценено как значение, то это значение затем передается значение (ByVal
) независимо от сигнатуры вызванной процедуры с указанием этого параметра как ByRef
- см. 5.3.1.11 Обработка аргумента вызова процедуры , семантика времени выполнения :
- Если у параметра нет сопоставленного аргумента, параметром является ByVal, или параметр ByRef, а выражение сопоставленного аргумента классифицируется какзначение , функция, свойство или несвязанный член, локальная переменная определяется с экстентом процедуры в вызываемой процедуре с тем же значением имени и объявленным типом, что и параметр [...]
Решение, как другие пришли к выводу, состоит в том, чтобы убрать скобки при выполнении вызова процедуры :
MsgBox "test", vbInformation
... или последовательно используйте устаревшее явный синтаксис вызова :
Call MsgBox("test", vbInformation)
Скобки нужны только при выполнении вызова функции (т.е. при захвате возвращаемого значения в локальную переменную):
Dim result As vbMsgBoxResult
result = MsgBox("test", vbInformation Or vbOkCancel)