和風スパゲティのレシピ

日本語でコーディングするExcelVBA

ParamArrayが省略されたか判定する - IsMissing

ParamArray自体が省略されたかどうかを判定する方法を解説します。

このときParamArrayには「空の配列」が入っており、
このから配列の判定にはIsMissing関数を使用します。


※ 「空の配列」はこの「要素数0の配列」を指すことが多いと思いますが、
「Dim 配列()で定義されたあとReDimがまだの動的配列」
いわゆる初期化されていない動的配列を指すこともあります。

この「動的配列が初期化されているかどうか」の判定については、
以下の記事を参照してください。

www.limecode.jp

ParamArrayが省略されたかを調べる - IsMissing関数

Sub/Functionの引数の数を任意にする場合は、
ParamArrayキーワードを使用します。

Function 自作関数(ParamArray 引数()) As Variant

 

この時、引数がひとつも渡されなかった場合は、
引数() の配列には「空の配列」がセットされています。

これを判定するには、IsMissing関数を使用します。

Function 自作関数(ParamArray 引数()) As Variant

    If IsMissing(引数) Then
        Err.Raise 1000, , "引数は必ずひとつ渡してください。"
    End If

    ' メインコード

End Function

引数が渡されなかった場合の処理を記述する場合は、
IsMissing関数を使用してください。

おまけ:Uboundで判定する

この空の配列は「Uboundが-1」という特徴があるため、
これを判定することでもParamArrayが省略されたかを調べることができます。

Function 自作関数(ParamArray 引数()) As Variant

    If Ubound(引数) = -1 Then
        Err.Raise 1000, , "引数は必ずひとつ渡してください。"
    End If

    ' メインコード

End Function

 
そしてこの仕様のおかげで、
以下のFor文が「0 To -1」となりノーエラースキップできるという特長があります。

Function 自作関数(ParamArray 引数()) As Variant

    Dim i As Long
    For i = LBound(引数) To UBound(引数)

    Next

End Sub

 
つまり、関数の仕様によってはIsMissingで判定しなくても、
「空の配列ならFor文が実行されない」
という仕様で事足りているということも往々にしてあります。


この仕様がとても便利なため、空の配列を自作して使用することもできます。

詳しくはこちらの記事をご覧ください。
www.limecode.jp