サーチ…
構文
- IdentifierName [ arguments ]
- Call IdentifierName [ (arguments) ]
- [Let | Set] 式 = IdentifierName [ (引数) ]
- [Let | Set] IdentifierName [ (引数) ] = 式
パラメーター
パラメータ | 情報 |
---|---|
IdentifierName | 呼び出すプロシージャの名前。 |
議論 | プロシージャに渡す引数のカンマ区切りのリスト。 |
備考
最初の2つの構文は、 Sub
プロシージャを呼び出すためのものです。最初の構文にかっこは含まれていないことに注意してください。
これは混乱していますを参照してください。どうして括弧を使うのはなぜですか?最初の2つの構文の違いを詳しく説明しています。
3番目の構文は、 Function
およびProperty Get
プロシージャを呼び出すための構文です。パラメタがある場合、かっこは常に必須です。 値を割り当てるときはLet
キーワードを省略できますが、 参照を割り当てるときはSet
キーワードが必要です 。
第4の構文は、 Property Let
およびProperty Set
プロシージャを呼び出すための構文です。代入の右側のexpression
がプロパティのvalueパラメータに渡されます。
暗黙的な呼び出しの構文
ProcedureName
ProcedureName argument1, argument2
プロシージャー名を括弧なしで呼び出します。
エッジケース
Call
キーワードは、1つの辺の場合にのみ必要です。
Call DoSomething : DoSomethingElse
DoSomething
とDoSomethingElse
は呼び出されるプロシージャです。 Call
キーワードが削除された場合、 DoSomething
はプロシージャコールではなくラインラベルとして解析され、コードが破損します。
DoSomething: DoSomethingElse 'only DoSomethingElse will run
戻り値
プロシージャコールの結果( Function
やProperty Get
プロシージャなど)をProperty Get
するには、コールを割り当ての右側に配置します。
result = ProcedureName
result = ProcedureName(argument1, argument2)
パラメータがある場合はカッコが必要です。プロシージャにパラメータがない場合、かっこは冗長です。
これは混乱しています。どうして括弧を使うのはなぜですか?
カッコは、 関数呼び出しの引数を囲むために使用されます 。 プロシージャー呼び出しのためにこれらを使用すると、予期しない問題が発生する可能
実行時に意図しない値をプロシージャに渡すことで、そして単に無効な構文でコンパイル時にバグが発生する可能性があるためです。
ランタイム
括弧を冗長にするとバグが発生する可能性があります。オブジェクト参照をパラメータとして取るプロシージャを指定すると...
Sub DoSomething(ByRef target As Range)
End Sub
...そしてかっこで呼び出されました:
DoSomething (Application.ActiveCell) 'raises an error at runtime
これにより、 "Object Required"ランタイムエラー#424が発生します。その他のエラーが発生する可能性がありApplication.ActiveCell
。ここでは、 Application.ActiveCell
Range
オブジェクト参照は、 target
がByRef
渡すことを指定するプロシージャのシグネチャに関係なく 、 評価され 、値によって渡されます。上記のスニペットでByVal
をDoSomething
に渡した実際の値は、 Application.ActiveCell.Value
です。
括弧は、括弧式の値を評価するために、VBAを強制し、その結果を渡すByVal
呼ばれる手続きへ。評価された結果の型がプロシージャの予想される型と一致せず、暗黙的に変換できない場合、実行時エラーが発生します。
コンパイル時
このコードはコンパイルに失敗します:
MsgBox ("Invalid Code!", vbCritical)
式("Invalid Code!", vbCritical)
は値として評価できないためです。
これはコンパイルして動作します:
MsgBox ("Invalid Code!"), (vbCritical)
しかし間違いなく愚かに見えるだろう。重複したかっこは避けてください。
明示的な呼び出しの構文
Call ProcedureName
Call ProcedureName(argument1, argument2)
明示的な呼び出し構文では、引数キーワードの前後にCall
キーワードとかっこが必要です。パラメーターがない場合、括弧は冗長です。この構文は、より現代的な暗黙的な呼び出し構文がVBに追加されたときに廃止されました。
オプションの引数
いくつかのプロシージャにはオプションの引数があります。オプションの引数は常に必須の引数の後に来ますが、プロシージャは引数なしで呼び出すことができます。
たとえば、関数ProcedureName
が2つの必須引数( argument1
、 argument2
)と1つのオプション引数optArgument3
場合、少なくとも4つの方法で呼び出すことができます。
' Without optional argument
result = ProcedureName("A", "B")
' With optional argument
result = ProcedureName("A", "B", "C")
' Using named arguments (allows a different order)
result = ProcedureName(optArgument3:="C", argument1:="A", argument2:="B")
' Mixing named and unnamed arguments
result = ProcedureName("A", "B", optArgument3:="C")
ここで呼び出される関数ヘッダの構造は、次のようになります。
Function ProcedureName(argument1 As String, argument2 As String, Optional optArgument3 As String) As String
Optional
キーワードは、この引数を省略できることを示します。前に述べたように-ヘッダに導入されたオプションの引数は、任意の必要な引数の後に、最後に表示されなければなりません 。
値が関数に渡されない場合は、引数のデフォルト値を指定することもできます。
Function ProcedureName(argument1 As String, argument2 As String, Optional optArgument3 As String = "C") As String
この関数では、 c
の引数が与えられていない場合、その値はデフォルトで"C"
ます。値が指定されている場合、これはデフォルト値をオーバーライドします。