«Официальная страница справки» находится на GitHub, она активно поддерживается, и каждый день объединяются многочисленные изменения.Если в примере есть ошибка, откройте для нее проблему , или лучше, отправьте исправление самостоятельно !
Пример неверный, скобки либо не должныили выражение должно находиться справа от присваивания Set
некоторой переменной объекта.
вы должны использовать круглые скобки при присваивании возвращаемого значенияметод (или функция) для переменной
Исправить.
Если вы не фиксируете возвращаемое значение, вы не ставите круглые скобки.Если вы это сделаете, VBE дает вам подсказку.Если вы скопировали пример из документов, он будет выглядеть в редакторе следующим образом:
ActiveWorkbook.Sheets.Add (Before:=Worksheets(Worksheets.Count))
Обратите внимание на пробел.Если вы захватили возвращаемое значение:
Set newSheet = ActiveWorkbook.Sheets.Add(Before:=Worksheets(Worksheets.Count))
Без пробела.
Просто чтобы убедиться, что я получаю логику VBA: # 3 выдает ошибку, потому что скобкидля VBA означает, что значение (= новый рабочий лист) возвращается, но нет переменной для его присвоения?И № 6 - это противоположный случай?
Это еще не все.Рассмотрим более простой пример:
MsgBox "hi", vbOkCancel
Если мы хотим получить или иным образом использовать возвращаемое значение, нам понадобятся скобки:
If MsgBox("hi", vbOkCancel) = vbOk Then
Если мы добавим скобки без захвата / использованиявозвращаемое значение, мы получили бы это:
MsgBox ("hi", vbOkCancel)
Так что же означает это пространство?
Для компилятора VBA это означает " это не список аргументов, этопервый аргумент, и это выражение значения: оцените его и отправьте результат ByVal
в вызванную процедуру".Проблема, конечно, в том, что ("hi", vbOkCancel)
не является выражением и не может быть вычислено, и у нас есть ошибка компиляции.
Итак, вернемся к примеру с документами: Before:=Worksheets(Worksheets.Count)
недопустимое выражение либо - это список аргументов , состоящий из одного именованного аргумента ... но синтаксически это не список аргументов: заключенный в скобки, это выражение, которое,если его можно было бы оценить, он был бы передан first аргументу списка параметров, ByVal
- примерно так:
ActiveWorkbook.Sheets.Add Argument1:=(the result of the expression)
Природа ByVal
аргумента в скобках:в основном случайность: когда VBA оценивает выражение, оно получает значение ... но это значение находится в воздухе, нет локальной ссылки на него - так что даже если вызванная процедура принимает ByRef
аргумент, так как вызывающая сторона не содержит ссылку на этот аргумент, она отбрасывается - эффективно выдает точно такой же результат, как если бы функция принимала параметр ByVal
.
Не понятно?Это должно помочь:
Public Sub Test()
Dim foo As Long
DoSomething (foo) ' evaluates the expression, passes the result of that expression
Debug.Print foo ' prints 0
DoSomething foo ' passes a reference to the local variable
Debug.Print foo ' prints 42
End Sub
Private Sub DoSomething(ByRef value As Long)
value = 42
End Sub