30

VBScript を作成しようとしていて、Randomize や MsgBox などの関数を使用しています。() を使用する場合と使用しない場合の違いについて知りたいです。例えば:

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

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

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

MsgBox ("Hello world!")- これもうまくいきます。

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

4

5 に答える 5

27

呼び出し可能なコード(ルーチン)は、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.

(ルーチンとしての)Subを呼び出すときにパラメータlist()を使用しないでください

ユーザーにメッセージを表示したいが、応答に興味がない場合:

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)は、「Sをnで呼び出す」という意味ではなく、「Sをnの値のコピーで呼び出す」という意味です。それを見ているプログラマー

>> 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)

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

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

これは、プログラマーが考えずに()を使用することをさらに奨励します。

「かっこが使えない」とはどういう意味ですか?

于 2012-11-29T09:17:07.050 に答える
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は、オプションの引数を 1 つ受け入れるサブルーチンですが、サブルーチンに引数がなくても、括弧のペアを空にして呼び出すことができます。VBScript パーサーには、空の引数リストに対する特別なルールがあるようです。ただし、私のアドバイスは、この特別な構成を避け、括弧を使用せずに単純にサブルーチンを呼び出すことです。

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

于 2012-11-29T08:51:09.917 に答える
3

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

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

ただし、複数のパラメーターを使用する場合、VBScript メソッドでは括弧でエラーがスローされ、括弧なしで次のように正常に動作します。

MsgBox "Hello world!", vbExclamation

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

MsgBox ("Hello world!", vbExclamation)

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

于 2012-11-29T17:22:16.003 に答える
1

vba ではサブルーチンと関数を区別する必要があります... 一般に (私の知る限り)、サブルーチンは何も返さず、周囲の括弧はオプションです。関数の場合は、括弧を記述する必要があります。

あなたの例では、 MsgBox は関数ではなくサブルーチンであるため、その場合、括弧はオプションです。関数の例外の 1 つは、戻り値を代入しない場合、または関数がパラメーターを使用しない場合は、括弧も省略できます。

この回答はもう少し詳細になりますが、基本的には、関数に括弧を付けてサブルーチンに括弧を付けない場合は、保存側にいる必要があります。

于 2012-11-29T08:12:44.747 に答える