在使用或省略括号时调用方法的正确方法是什么?如果我正确理解我的Google搜索结果:将方法(或函数)的返回值分配给变量时,必须使用括号。下面是一些示例:
wbData.Sheets.Add '-> works
Set wsData = wbData.Sheets.Add '-> works
wbData.Sheets.Add(Before:=wbData.Sheets(wbData.Sheets.Count)) '-> syntax error
Set wsData = wbData.Sheets.Add(Before:=wbData.Sheets(wbData.Sheets.Count)) '-> works
wbData.Sheets.Add Before:=wbData.Worksheets(wbData.Worksheets.Count) '-> works
Set wsData = wbData.Sheets.Add Before:=wbData.Worksheets(wbData.Worksheets.Count) '-> syntax error
只是确保我得到VBA逻辑:#3给我一个错误,因为VBA的括号意味着返回值(=新工作表),但是没有变量可将其分配给它? #6是相反的情况吗?
即使我的解释尝试是正确的,也有人可以向我解释why the example on the official help page对我不起作用:
ActiveWorkbook.Sheets.Add(Before:=Worksheets(Worksheets.Count))
这给了我一个语法错误,与上面列表中的#3相同。对此我感到困惑。
答案 0 :(得分:6)
该方法是否返回您需要的值?使用括号(但是,如果未将任何参数传递给方法,除非您在同一行中使用返回值,否则可选)。
例如-在RowRange
下返回一个Range
对象,但是您不能再使用(2,1)直接对其进行索引,因为这被解释为将参数传递给RowRange
(不需要任何内容)
s = myPivotTable.RowRange(2, 1).Value 'fails with "too many parameters"
添加括号可清除此问题
s = myPivotTable.RowRange()(2, 1).Value 'OK
使用通话?使用括号。但是Call通常被视为已弃用。
还有其他吗?不需要括号,并且可能会导致参数在传递之前被评估,从而产生意外结果。
需要注意的一件事是,Vb编辑器在方法名称和左括号之间放置一个空格-当发生这种情况时,这是一个标志,您可能根本不需要括号。
答案 1 :(得分:6)
“官方帮助页面”位于GitHub上,并且正在积极维护中,并且每天都会合并多个更改。如果示例中出现错误,open an issue for it,或者更好的是,submit a fix yourself!
该示例是错误的,括号不应该在其中,或者表达式应该在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
< / strong>到调用的过程”。当然,问题在于("hi", vbOkCancel)
不是表达式,无法求值,并且我们有编译错误。
所以回到文档示例:Before:=Worksheets(Worksheets.Count)
也不是合法的表达式-它是由一个命名参数组成的参数列表 ...但是语法上不是 参数列表:用括号括起来的是一个表达式,如果可以对其求值,它将被传递给参数列表的{em> first 参数{{1} }-像这样:
ByVal
带括号的参数的性质ActiveWorkbook.Sheets.Add Argument1:=(the result of the expression)
基本上是偶然的:当VBA对表达式求值时,它会得到一个值...但是该值是悬而未决的,因此没有本地引用-即使被调用的过程正在接受ByVal
参数,由于调用方未持有对该参数的引用,因此将其丢弃-有效地产生与函数采用参数相同的结果ByRef
。
令人困惑?这应该有帮助:
ByVal