Call
никогда не требуется.На самом деле он устарел с момента появления неявного синтаксиса вызовов в ... Visual Basic 4.0, если я правильно помню.
object.MemberName arg1, arg2
Обратите внимание, скобки пропали.Это было бы незаконно, как вы заметили:
object.MemberName (arg1, arg2)
Обратите внимание на пробел между MemberName
и отверстием (
: VBE всегда будет ставить пробел там.Вот что говорит VBE: «Хорошо, я возьму то, что в этих скобках, оценим это как выражение и передам результат по значению (независимо от того, подпись члена указывает ByRef
, явно или нет)член, которого вы вызываете ".За исключением того, что (foo, bar)
не является допустимым выражением, поэтому код не компилируется.
Когда MemberName
возвращает значение, которое необходимо захватить вызывающей стороне, скобки ведут себя по-разному:
foo = object.MemberName(arg1, arg2)
Обратите внимание, что больше нет пробелов;VBE удалит его, если вы добавите какой-либо.
Итак, с более знакомым и конкретным примером - обратите внимание, что он не имеет ничего общего с объектами и членами:
MsgBox "Yes?", vbYesNo ' works fine
Call MsgBox("Yes?", vbYesNo) ' works fine
Call VBA.Interaction.MsgBox("Yes?", vbYesNo) ' works fine
MsgBox ("Yes?", vbYesNo) ' illegal
result = VBA.Interaction.MsgBox("Yes?", vbYesNo) ' works fine
Call
Ключевое слово существует только в VBA6 / VBA7 для целей обратной совместимости, как и многие, многие другие языковые конструкции (на ум приходит While...Wend
).Вот почему Rubberduck (отказ от ответственности: я один из администраторов этого проекта с открытым исходным кодом) помечает его использование как "устаревшее" и предоставляет инструменты для его удаления.