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

时间:2017-05-03 16:21:24

标签: vba excel-vba excel

道歉,这很难说是一个明确的问题。

以下行有效:

objWord.Documents.Add Template:=templatePath

但这条线不是:

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

我收到以下编译错误:

Expected: end of statement

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

3 个答案:

答案 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”。