以下行有效:
objWord.Documents.Add Template:=templatePath
但这条线不是:
Set objMergedReq = objWord.Documents.Add Template:=templatePath
我收到以下编译错误:
Expected: end of statement
为什么这两种解释不同?如何消除错误?在案例2中我是否需要额外的括号?
答案 0 :(得分:3)
关键是:
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
。
答案 1 :(得分:2)
您需要在设置时使用括号,因此in
答案 2 :(得分:2)
如果没有返回值,例如使用Sub时,或忽略返回值,则不要将参数放在括号中。 (可选)您可以使用“调用”,然后将参数放在括号中。
在您的示例中,
objWord.Documents.Add Template:=templatePath
add方法确实会创建一个返回值,但您没有使用它。因此,您要么不使用括号(如您所示),要么可以使用“调用”语句:
Call objWord.Documents.Add(Template:=templatePath)
在第二个示例中,您使用的是返回值,因此需要括号:
Set objMergedReq = objWord.Documents.Add(Template:=templatePath)
需要“设置”,因为您正在分配对象。如果返回值是非对象,则适用相同的规则 - 您只需省略“Set”。