MsgBox“”vs VBScript中的MsgBox()

时间:2012-11-29 07:23:43

标签: function vbscript

我正在尝试编写VBScript,我正在使用Randomize和MsgBox等函数。我很好奇使用()和不使用它们有什么区别。例如:

Randomize - 此行有效。

Randomize() - 此行也适用。

MsgBox "Hello world!" - 这有效。

MsgBox ("Hello world!") - 这也有效。

该脚本将在具有不同Windows版本(至少是Windows XP)的多台计算机上运行。我想知道在使用这些函数时是否会遇到任何兼容性/语法问题。

6 个答案:

答案 0 :(得分:26)

一段可调用的代码(例程)可以是一个Sub(要求副作用/它是什么 确实)或一个函数(要求它的返回值)或两者的混合。作为文档 对于MsgBox

  

在对话框中显示消息,等待用户单击a   按钮,并返回一个值,指示用户单击的按钮。

     

MsgBox(提示[,buttons] [,title] [,helpfile,context])

表示,这个例程是第三种。

VBScript的语法规则很简单:

在调用(例程为a)函数

时使用参数列表()

如果要向用户显示消息并需要知道用户的消息 的回复:

Dim MyVar
MyVar = MsgBox ("Hello World!", 65, "MsgBox Example")
   ' MyVar contains either 1 or 2, depending on which button is clicked.

在调用(例程为a)Sub

时不要使用参数列表()

如果您想向用户显示消息并且不感兴趣 在回复中:

MsgBox "Hello World!", 65, "MsgBox Example"

这种美丽的简约被搞砸了:

使用()参数列表和强制按值调用的设计缺陷 语义

>> Sub S(n) : n = n + 1 : End Sub
>> n = 1
>> S n
>> WScript.Echo n
>> S (n)
>> WScript.Echo n
>>
2
2

S(n)并不意味着“用n调用S”,而是“用带有n值的副本调用S”。 程序员看到了

>> s = "value"
>> MsgBox(s)

'作品'在他们尝试时会感到惊讶:

>> MsgBox(s, 65, "MsgBox Example")
>>
Error Number:       1044
Error Description:  Cannot use parentheses when calling a Sub

编译器对Sub调用中的empty()的宽容。 '纯' Sub Randomize(要求设置随机种子的副作用)可以

召唤
Randomize()

虽然()不能表示“给我你的回报价值”,也不能说“通过” 有价值的东西“。这里更严格一点会迫使prgrammers 注意

的区别
Randomize n

Randomize (n)

允许Sub调用中的参数list()的Call语句:

  
    

s =“价值”     调用MsgBox(s,65,“MsgBox示例”)

  

进一步鼓励程序员不假思索地使用()。

(基于What do you mean "cannot use parentheses?"

答案 1 :(得分:10)

据我所知,这些是在VBScript中调用子例程和函数的规则:

  • 调用子例程或放弃返回值的函数时,请不要使用括号
  • 调用您指定或使用返回值的函数时,将参数括在括号中
  • 使用Call关键字调用子例程时,在括号中包含参数

由于您可能不会使用Call关键字,因此您只需要学习如果调用函数并希望分配或使用返回值的规则,则需要将参数括在括号中。否则,请勿使用括号。

以下是一些例子:

  • WScript.Echo 1, "two", 3.3 - 调用子程序

  • WScript.Echo(1, "two", 3.3) - 语法错误

  • Call WScript.Echo(1, "two", 3.3) - 关键字Call需要括号

  • MsgBox "Error" - 调用函数“喜欢”子程序

  • result = MsgBox("Continue?", 4) - 调用使用返回值的函数

  • WScript.Echo (1 + 2)*3, ("two"), (((3.3))) - 调用子程序,其中参数由包含括号的表达式计算(请注意,如果在参数列表中用括号括起变量,则会改变从引用调用到按值调用的行为)

  • WScript.Echo(1) - 显然这是一个使用括号的子程序调用,但实际上这个参数只是表达式(1)而且往往会混淆用于其他编程语言的人们你必须在调用子程序时指定括号

  • 我不确定如何解释您的示例Randomize()Randomize是一个接受单个可选参数的子例程,但即使子例程没有任何参数,也可以使用一对空括号来调用它。似乎VBScript解析器对空参数列表有一个特殊规则。但是,我的建议是避免使用这种特殊结构,只需调用任何子程序而不使用括号。

我很确定这些语法规则适用于不同版本的操作系统。

答案 2 :(得分:3)

您只是在函数内部使用单个参数,因此它在以下两种情况下都能正常工作:

MsgBox "Hello world!"
MsgBox ("Hello world!")

但是当你使用多个参数时,在VBScript方法中,括号将抛出一个错误,没有括号将会正常工作:

MsgBox "Hello world!", vbExclamation

以上代码将顺利运行,但

MsgBox ("Hello world!", vbExclamation)

会抛出错误。 试试这个!! : - )

答案 3 :(得分:1)

你必须在vba中使用不同的子例程和函数...通常(据我所知),子例程不返回任何内容,并且周围的parantheses是可选的。对于函数,您需要编写parantheses。

至于你的例子,MsgBox不是一个函数,而是一个子例程,因此在这种情况下,parantheses是可选的。函数的一个例外是,当你没有分配返回的值时,或者当函数没有使用参数时,你也可以放弃这些parantheses。

This answer更详细一些,但基本上你应该在保存方面,当你为函数提供parantheses并将它们留给子例程时。

答案 4 :(得分:0)

“”和()之间的区别是:

使用“”,您什么都没叫。
使用(),您正在调用子项。

带有sub的示例:

Sub = MsgBox("Msg",vbYesNo,vbCritical,"Title")
Select Case Sub
     Case = vbYes
          MsgBox"You said yes"
     Case = vbNo
          MsgBox"You said no"
 End Select

vs正常:

 MsgBox"This is normal"

答案 5 :(得分:-1)

要显示弹出消息,您可以使用它。

MsgBox "Error.",vbCritical,"File Manager."
MsgBox "Warning.",vbExclamation,"File Manager."
MsgBox "Info.",vbInformation,"File Manager."
MsgBox "FAQ.",vbQuestion,"File Manager."