web-dev-qa-db-ja.com

VBScriptのMsgBox "" vs MsgBox()

VBScriptを記述しようとしていますが、RandomizeやMsgBoxなどの関数を使用しています。 ()を使用する場合と使用しない場合の違いは何ですか?例えば:

Randomize-この行は機能します。

Randomize()-この行も機能します。

_MsgBox "Hello world!"_-これは機能します。

MsgBox ("Hello world!")-これも機能します。

スクリプトは、異なるバージョンのWindows(少なくともWindows XP)を持つ複数のマシンで実行されます。これらの関数を使用する際に互換性/構文の問題が発生するかどうか疑問に思っています。

28
user1862387

呼び出し可能なコード(ルーチン)は、Sub(副作用/動作のために呼び出される)またはFunction(戻り値のために呼び出される)、または両方の混合にすることができます。 MsgBoxのドキュメントとして

ダイアログボックスにメッセージを表示し、ユーザーがボタンをクリックするのを待ち、ユーザーがクリックしたボタンを示す値を返します。

MsgBox(プロンプト[、ボタン] [、タイトル] [、ヘルプファイル、コンテキスト])

このルーチンは第3種のものです。

VBScriptの構文規則は簡単です。

(ルーチンとして)ルーチンを呼び出すときにパラメータリスト()を使用します

ユーザーにメッセージを表示し、ユーザーの応答を知る必要がある場合:

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()に関するコンパイラーの寛大さ。 「ランダムなシードを設定する副作用のために呼び出される」「純粋な」サブランダム化は、

Randomize()

ただし、()は「戻り値を渡す」ことも「値で何かを渡すこと」も意味しません。ここでもう少し厳密にすると、プログラマーは、

Randomize n

そして

Randomize (n)

Sub呼び出しでパラメーターリスト()を許可するCallステートメント:

s = "value" Call MsgBox(s、65、 "MsgBox Example")

これにより、プログラマは考えずに()を使用するようになります。

「括弧を使用できない」とはどういう意味ですか?

27
Ekkehard.Horner

私の知る限り、これらは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は、オプションの引数を1つ受け入れるサブルーチンですが、サブルーチンに引数がなくても、空の括弧のペアで呼び出すことができます。 VBScriptパーサーには、空の引数リストに対する特別なルールがあるようです。ただし、この特別な構造を避け、括弧を使用せずにサブルーチンを呼び出すことをお勧めします。

これらの構文規則は、オペレーティングシステムのさまざまなバージョンに適用されると確信しています。

10

関数内で単一のパラメーターを使用しているため、次のような両方の場合に正常に機能しています。

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

ただし、複数のパラメーターを使用する場合、In VBScriptメソッドでは、かっこでエラーがスローされ、かっこなしで次のように機能します。

MsgBox "Hello world!", vbExclamation

上記のコードはスムーズに実行されますが、

MsgBox ("Hello world!", vbExclamation)

エラーをスローします。これを試して!! :-)

3
Shivam Gupta

Vbaでサブルーチンと関数を区別する必要があります...一般的に(私の知る限り)、サブルーチンは何も返さず、周囲のパラセシスはオプションです。関数については、パラセテを書く必要があります。

あなたの例に関しては、MsgBoxは関数ではなく、サブルーチンであるため、その場合のパラセシスはオプションです。関数の例外の1つは、戻り値を割り当てない場合、または関数がパラメーターを消費しない場合は、引数も残しておくことができます。

この答え はもう少し詳しく説明しますが、基本的には、関数にパラセテを提供し、サブルーチン用に残しておく場合は、保存する必要があります。

1
Tom