在VBA中,创建对象与不创建对象时的语法是否不同?

在VBA中,创建对象与不创建对象时的语法是否不同?,vba,excel,Vba,Excel,抱歉,这是一个很难用语言表达的明确问题 以下行有效: objWord.Documents.Add Template:=templatePath 但这条线不是: Set objMergedReq = objWord.Documents.Add Template:=templatePath 我发现以下编译器错误: Expected: end of statement 为什么两者的解释不同?如何消除错误?案例2中是否需要额外的括号?设置时需要使用括号,因此设置x=f(y)设置时需要使用括号,因此

抱歉,这是一个很难用语言表达的明确问题

以下行有效:

objWord.Documents.Add Template:=templatePath
但这条线不是:

Set objMergedReq = objWord.Documents.Add Template:=templatePath
我发现以下编译器错误:

Expected: end of statement

为什么两者的解释不同?如何消除错误?案例2中是否需要额外的括号?

设置时需要使用括号,因此
设置x=f(y)
设置时需要使用括号,因此
设置x=f(y)
关键在于:

objWord.Documents.Add Template:=templatePath
这是一个函数调用,但返回的值(对象引用)被丢弃,因此,函数实际上被当作过程使用;对于VBA的隐式过程调用语法,括号不存在。您可以使用[deprecated]显式调用语法来要求括号:

Call objWord.Documents.Add(Template:=templatePath)
正如您所注意到的,这是非法的:

Set objMergedReq = objWord.Documents.Add Template:=templatePath
因为函数调用的语法(此处不丢弃返回值)在指定参数列表时需要括号:

Set objMergedReq = objWord.Documents.Add(Template:=templatePath)
如果您想“在任何地方都使用括号”,请知道,一旦需要指定2个或更多参数,就会遇到其他语法问题:

MsgBox (message, vbOkOnly + vbInformation) 'illegal
这是因为当参数被圆括号包围时,您实际上是在告诉VBA将圆括号的内容作为一个值进行求值,并将结果
ByVal
传递给函数/过程,即使该函数/过程明确指定参数为
ByRef

,关键是:

objWord.Documents.Add Template:=templatePath
这是一个函数调用,但返回的值(对象引用)被丢弃,因此,函数实际上被当作过程使用;对于VBA的隐式过程调用语法,括号不存在。您可以使用[deprecated]显式调用语法来要求括号:

Call objWord.Documents.Add(Template:=templatePath)
正如您所注意到的,这是非法的:

Set objMergedReq = objWord.Documents.Add Template:=templatePath
因为函数调用的语法(此处不丢弃返回值)在指定参数列表时需要括号:

Set objMergedReq = objWord.Documents.Add(Template:=templatePath)
如果您想“在任何地方都使用括号”,请知道,一旦需要指定2个或更多参数,就会遇到其他语法问题:

MsgBox (message, vbOkOnly + vbInformation) 'illegal

这是因为当参数被圆括号包围时,实际上是在告诉VBA将圆括号的内容作为一个值进行求值,并将结果
ByVal
传递给函数/过程,即使该函数/过程在没有返回值的情况下显式地将参数指定为
ByRef

,与使用Sub或忽略返回值类似,您不会将参数放在括号中。或者,您可以使用“Call”,然后将参数放在括号中

以你为例,

objWord.Documents.Add Template:=templatePath
add方法确实创建了一个返回值,但您没有使用它。因此,您可以不使用括号(如图所示),也可以使用“Call”语句:

Call objWord.Documents.Add(Template:=templatePath)
在第二个示例中,您使用的是返回值,因此需要括号:

Set objMergedReq = objWord.Documents.Add(Template:=templatePath)

“集合”是必需的,因为您正在指定对象。如果返回值是一个非对象,同样的规则也适用——只需省略“Set”。

当没有返回值时,如使用Sub,或忽略返回值时,不将参数放在括号中。或者,您可以使用“Call”,然后将参数放在括号中

以你为例,

objWord.Documents.Add Template:=templatePath
add方法确实创建了一个返回值,但您没有使用它。因此,您可以不使用括号(如图所示),也可以使用“Call”语句:

Call objWord.Documents.Add(Template:=templatePath)
在第二个示例中,您使用的是返回值,因此需要括号:

Set objMergedReq = objWord.Documents.Add(Template:=templatePath)

“集合”是必需的,因为您正在指定对象。如果返回值是非对象,同样的规则也适用——您只需省略“Set”。

设置时需要使用括号,因此
Set x=f(y)
设置时需要使用括号,因此
Set x=f(y)
谢谢。就这样。。。设置objMergedReq=objWord.Documents.Add(模板:=templatePath)谢谢。就这样。。。设置objMergedReq=objWord.Documents.Add(模板:=templatePath)