为什么MsgBox需要一个字节变量[VBA]

时间:2016-07-08 20:24:19

标签: vba excel-vba excel

显示简单的MsgBox时,例如:

MsgBox("Hello World!")

工作正常,为什么一点点“高级”MessageBox必须以这种方式编写:

Dim DisplayMsgBox as Byte
DisplayMsgBox = MsgBox("Hello world!", vbOKOnly, "Say Hi")

是否有任何特殊原因必须以这种方式完成,而不仅仅是像没有任何“额外附件”的“普通”MsgBox一样? (所以这样:):

MsgBox("Hello world!", vbOKOnly, "Say Hi")

2 个答案:

答案 0 :(得分:2)

返回类型本身不是Byte,而是vbMsgBoxResult枚举值。

MSDN文档变得越来越难以找到,但无论如何使用Rubberduck,您会得到一个命令栏,其中包含一个确认返回类型的上下文相关标签:

Rubberduck commandbar

这是来自实际加载项目引用的COM库并迭代COM类型及其成员(我拥有Rubberduck存储库)。

vbMsgBoxResultEnum,基础类型为Long,而不是Byte - 您可以在即时窗格中轻松确认:

?TypeName(VbMsgBoxResult.vbOK)
Long

至于括号,MsgBox没有什么特别之处 - 它与任何其他Function程序的语法相同。

这是有效的原因:

MsgBox ("Test")

是因为你强迫字符串参数"Test"按值传递(这就是parens所做的!)

这不起作用的原因:

MsgBox ("Test", vbOkOnly)

是因为VBA无法将"Test", vbOkOnly评估为将ByVal传递给函数的一个参数。

这样可行:

MsgBox ("Test"), (vbOkOnly)

但看起来很傻。

当像Function一样调用VBA Sub时(即当你不关心返回的值时),你需要删除括号,或者使用[obsolete] explicit { {1}}语法:

Call

答案 1 :(得分:1)

使用时:

Dim DisplayMsgBox as Byte
DisplayMsgBox = MsgBox("Hello world!", vbOKOnly, "Say Hi")

DisplayMsgBox将获得按下按钮的值

试试这个,看看差异:

Sub Test_MsgBox_Result()
Dim DisplayMsgBox As Byte
DisplayMsgBox = MsgBox("Hello world!", vbOKOnly, "Say Hi")
MsgBox "The value of Ok is " & DisplayMsgBox
DisplayMsgBox = MsgBox("Hello world!", vbYesNo, "Say Hi")
If DisplayMsgBox = vbYes Then
    MsgBox "The value of Yes is " & DisplayMsgBox
Else
    MsgBox "The value of No is " & DisplayMsgBox
End If
DisplayMsgBox = MsgBox("Hello world!", vbYesNoCancel, "Say Hi")
If DisplayMsgBox = vbYes Then
    MsgBox "The value of Yes is " & DisplayMsgBox
ElseIf DisplayMsgBox = vbNo Then
    MsgBox "The value of No is " & DisplayMsgBox
Else
    MsgBox "The value of Cancel is " & DisplayMsgBox
End If
End Sub

有关更多信息,请查看here