VBA: использование скобок для метода - PullRequest
2 голосов
/ 20 июня 2019

Как правильно вызывать метод, когда речь идет об использовании или опускании скобок?Если я правильно понимаю результаты моего поиска в Google: вы должны использовать круглые скобки при назначении возвращаемого значения метода (или функции) переменной.Ниже приведены некоторые примеры:

  1. wbData.Sheets.Add '-> works

  2. Set wsData = wbData.Sheets.Add '-> works

  3. wbData.Sheets.Add(Before:=wbData.Sheets(wbData.Sheets.Count)) '-> syntax error

  4. Set wsData = wbData.Sheets.Add(Before:=wbData.Sheets(wbData.Sheets.Count)) '-> works

  5. wbData.Sheets.Add Before:=wbData.Worksheets(wbData.Worksheets.Count) '-> works

  6. Set wsData = wbData.Sheets.Add Before:=wbData.Worksheets(wbData.Worksheets.Count) '-> syntax error

Просто чтобы убедиться, что я получаю логику VBA: # 3 выдает мне ошибку, потому что круглые скобки для VBA означают, что значение (= новый рабочий лист) возвращается, но нет переменной для его присвоения?И № 6 это противоположный случай?

Даже если бы моя попытка объяснения была верной, кто-то мог бы объяснить мне , почему пример на официальной странице помощи не работает для меня:

ActiveWorkbook.Sheets.Add(Before:=Worksheets(Worksheets.Count))

Это дает мне синтаксическую ошибку, такую ​​же как # 3 в моем списке выше.В этом я просто растерялся.

Ответы [ 2 ]

6 голосов
/ 20 июня 2019

«Официальная страница справки» находится на 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
6 голосов
/ 20 июня 2019

Возвращает ли метод нужное вам значение? Используйте скобки (но необязательно, если не передаете какие-либо аргументы методу , если только вы не используете возвращаемое значение в той же строке).

Например, ниже RowRange возвращает объект Range, но вы не можете затем напрямую индексировать его, используя (2,1), поскольку это интерпретируется как передача аргументов в RowRange (что не требует любой)

s = myPivotTable.RowRange(2, 1).Value   'fails with "too many parameters"

Добавление скобок уберите это:

s = myPivotTable.RowRange()(2, 1).Value 'OK

Используя Call? Используйте скобки. Но Call, как правило, считается устаревшим.

Что-нибудь еще? Круглые скобки не требуются и могут привести к непредвиденным результатам, вызвав оценку аргументов перед их передачей.

Одна вещь, на которую следует обратить внимание, это когда редактор Vb помещает пробел между именем метода и открывающей скобкой - когда это происходит, это знак, что скобки вообще могут не понадобиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...