显示简单的MsgBox时,例如:
MsgBox("Hello World!")
工作正常,为什么一点点“高级”MessageBox必须以这种方式编写:
Dim DisplayMsgBox as Byte
DisplayMsgBox = MsgBox("Hello world!", vbOKOnly, "Say Hi")
是否有任何特殊原因必须以这种方式完成,而不仅仅是像没有任何“额外附件”的“普通”MsgBox一样? (所以这样:):
MsgBox("Hello world!", vbOKOnly, "Say Hi")
答案 0 :(得分:2)
返回类型本身不是Byte
,而是vbMsgBoxResult
枚举值。
MSDN文档变得越来越难以找到,但无论如何使用Rubberduck,您会得到一个命令栏,其中包含一个确认返回类型的上下文相关标签:
这是来自实际加载项目引用的COM库并迭代COM类型及其成员(我拥有Rubberduck存储库)。
vbMsgBoxResult
为Enum
,基础类型为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