サイトについて      連絡先   検索

VBA 可変長な引数配列 ParamArray

はじめに

Excel VBA マクロの関数に可変長な引数 ParamArray を渡す方法を紹介します。

好きな数だけ引数を渡して、それが配列になります。

複数の異なる値を受け取って処理をしたいときなどに使います。

  • 目次
    • 可変長な引数を作成する
    • 任意の数の引数を渡す
    • 引数を省略する
    • 配列を渡す

可変長な引数を作成する

可変長な引数を作成するにはParamArray 引数名() As Variantのように入力します。必ず配列の Variant 型にします。ParamArray を付けると、任意の数の引数を配列に変換して受け取れます。


Sub 関数名(ParamArray 引数() As Variant)

End Sub

ParamArray を付けられるのは最後の引数だけです。


Sub 関数名(引数1 As Integer, ParamArray 引数2() As Variant)

End Sub

' これはできません。
Sub 関数名(ParamArray 引数1() As Variant, 引数2 As Integer)

End Sub

ParamArray の引数には ByVal, ByRef, Optional を指定できません。

ParamArray の引数があるときは、他の引数に Optional を指定できません。


' これはできません。
Sub 関数名(ParamArray ByVal 引数1() As Variant)

End Sub

' これはできません。
Sub 関数名(Optional ParamArray 引数1() As Variant)

End Sub

' これはできません。
Sub 関数名(Optional 引数1 As Integer = 1, ParamArray 引数2() As Variant)

End Sub

VBA では「Array 関数」や「Choose 関数」などで使われています。

任意の数の引数を渡す

ParamArray の引数に,で区切って複数の値を渡します。その数の要素数を持った配列になります。


Sub 実行()
    Call サブ(1, 2, 3)         ' 1,2,3
    Call サブ("Tips", "found") ' Tips,found
    Call サブ("Tips", 2)       ' Tips,2
End Sub

' この関数が呼び出されます
Sub サブ(ParamArray 引数() As Variant)
    Debug.Print(Join(引数, ",")) ' 配列をカンマ区切りで出力する
End Sub

ParamArray 以外の引数が先にあるときは、それを先に指定してから ParamArray の引数に,で区切って値を渡します。


Sub 実行()
    Call サブ(1, 2, 3)         ' 2,3
    Call サブ("Tips", "found") ' found
End Sub

' この関数が呼び出されます
Sub サブ(引数1 As String, ParamArray 引数2() As Variant)
    Debug.Print(Join(引数2, ",")) ' 配列をカンマ区切りで出力する
End Sub

引数を省略する

ParamArray の引数は省略できます。そのときは要素数0 To -1という異常な配列が作成され、要素はありません。


Sub 実行()
    Call サブ ' LBound = 0, UBound = -1
End Sub

' この関数が呼び出されます
Sub サブ(ParamArray 引数() As Variant)
    Debug.Print(LBound(引数))
    Debug.Print(UBound(引数))
End Sub

これは ParamArray の引数を For 文でループするときに、エラーにならないようにするためです。

配列を渡す

ParamArray の引数に配列を渡したときは、引数の配列の要素に渡した配列が入っています。自動で展開されることはありません。


Sub 実行()
    Call サブ(Array("配列"), 2, "三") ' Variant(), Integer, String
End Sub

' この関数が呼び出されます
Sub サブ(ParamArray 引数() As Variant)
    Dim v As Variant
    For Each v In 引数
        Debug.Print(TypeName(v)) ' 引数の要素の型を出力する、配列のときは Variant()
    Next
End Sub
  • 目次
    • 可変長な引数を作成する
    • 任意の数の引数を渡す
    • 引数を省略する
    • 配列を渡す