【问题标题】:MsgBox () - why does it work with one parameter but not with multiple parameters?MsgBox() - 为什么它只使用一个参数而不是多个参数?
【发布时间】:2015-01-06 03:23:00
【问题描述】:

这是一个非常理论性的问题,我想了解一下以扩展我对 VBA 语言的理解,但在 official documentation 以及此处和其他论坛以前的问题中没有找到任何内容(也许只是不值得怀疑为什么?)。

如果我写:

MsgBox "myPrompt", vbYesNo, "MyTitle"

它会出现一个带有自定义提示、按钮和标题的消息框。 但是,如果我写这个我会得到一个编译错误(预期的“=”):

MsgBox ("myPrompt", vbYesNo, "MyTitle")

到目前为止,一切都与语法有关。在第二种情况下,我应该将函数的返回值存储到一个变量中,所以我非常同意“=”符号是预期的这一事实。但是,以下行将起作用:

MsgBox("myPrompt")

无论如何它都会返回值1,我只需运行即可看到

a = MsgBox("myPrompt")
MsgBox a

因此,在我看来,MsgBox ("myPrompt", vbYesNo, "MyTitle") 在没有赋值的情况下无法工作的原因似乎不再与编译错误所说的预期变量赋值有关。 有人可以向我解释一下吗?

【问题讨论】:

  • 括号向 VBA 表明它是一个函数,应该有一个返回值。如果您不为其提供变量,则会出现错误。如果您只是编写 MsgBox("myPrompt"),则解释器假定为“vbOKOnly”(默认)并将其视为一种方法。就算“忍”了也是不对的。
  • 好问题。以前从未注意到这一点。

标签: vba


【解决方案1】:

在非常高的层次上,它与编译器如何解释命令有关。

正如您所说,这两种方法都有效:

MsgBox "Hello World"
MsgBox ("Hello World")

但这不会(没有分配给变量):

MsgBox ("Hello World", vbYesNo, "Title")

这是因为(在没有赋值的情况下),VB 认为存在"Hello World", vbYesNo, "Title" 的单个参数值。显然,这是不正确的,您会收到一条友好的错误消息。

如果你要试试这个,它会起作用的。

MsgBox ("Hello World"), (vbYesNo), ("Title")

因为每个参数都在自己的一组括号中提供。

在语法上,这与上面的 MsgBox ("Hello World") 语句完全相同。您只是在括号中指定每个参数,而不是只指定一个。


编辑

MsgBox ("hello world") 之所以有效,是因为它完全忽略了括号,就像它对简单的整数赋值所做的那样,例如x = (2)

【讨论】:

  • 你一定是对的,我没想到!为了更清楚起见,它之所以有效,是因为它忽略了括号,就像它忽略了 x = (2) 的括号一样?
  • @MatteoNNZ - 没错。我不确定Sub 调用参数不在括号内的原因是什么,但“就是这样”。
  • 好的,很清楚。如果您不介意,我会将这个小示例添加到您的答案中,以使其 100% 完成,即使对我来说它已经很清楚(因此接受)。
  • @MatteoNNZ - 很棒的补充。我认为这会增加它的清晰度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 2021-06-29
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
  • 2021-02-26
相关资源
最近更新 更多