はじめに
Excelの SUM
関数が、SUM(A1, A2)
のように2つの引数でも、SUM(A1:A10)
のように多数の引数でも、柔軟に計算できるのはなぜだろう、と考えたことはありませんか?
VBAで自作の関数(Function
)を作る際にも、受け取る引数の個数を固定せず、2個でも10個でも、任意の個数に対応できるようにしたい場合があります。
このような「可変長の引数」を実現するのが ParamArray
というキーワードです。ParamArray
を使うと、プロシージャに渡された複数の引数を、一つの配列としてまとめて受け取ることができます。
この記事では、ParamArray
を使って、まるで SUM
関数のようないくつでも引数を受け取れる、柔軟なオリジナル関数の作り方を解説します。
ParamArray
を使ったVBAサンプルコード
この例では、渡された全ての文字列を、指定された区切り文字で連結する JoinStrings
という関数を作成します。ParamArray
を使って、連結したい文字列をいくつでも渡せるようにします。
完成コード
' --- ParamArrayを使って、可変長の引数を受け取るFunction ---
' 第2引数(values)が可変長の引数
Function JoinStrings(delimiter As String, ParamArray values() As Variant) As String
Dim result As String
Dim item As Variant
' ParamArrayで受け取った配列をループ処理
For Each item In values
' resultが空でなければ、区切り文字を追加
If result <> "" Then
result = result & delimiter
End If
' 配列の要素を連結
result = result & item
Next item
' 連結した文字列を戻り値として返す
JoinStrings = result
End Function
' --- 作成したFunctionを呼び出すSubプロシージャ ---
Sub Test_JoinStrings()
Dim text1 As String
Dim text2 As String
' --- 2つの文字列をカンマ区切りで連結 ---
text1 = JoinStrings(",", "Apple", "Banana")
' --- 5つの文字列をハイフン区切りで連結 ---
text2 = JoinStrings("-", "Tokyo", "Osaka", "Nagoya", "Fukuoka", "Sapporo")
' --- 結果をメッセージボックスに表示 ---
MsgBox "結果1: " & text1 & vbCrLf & _
"結果2: " & text2, vbInformation, "連結結果"
End Sub
実行結果
Test_JoinStrings
を実行すると、以下のメッセージボックスが表示されます。
結果1: Apple,Banana
結果2: Tokyo-Osaka-Nagoya-Fukuoka-Sapporo
コードの解説
Function JoinStrings(..., ParamArray values() As Variant)
これが、可変長の引数を定義している部分です。
ParamArray
: このキーワードを引数の前に付けることで、これ以降に渡される全ての引数が、values
という名前の配列にまとめられて渡されることを示します。values() As Variant
:ParamArray
で受け取る引数は、必ずVariant
型の配列として宣言する必要があります。()
を付けて配列であることを明示します。
重要なルール:
ParamArray
は、プロシージャの引数リストの一番最後に記述する必要があります。ParamArray
の後に、Optional
引数など、他の引数を続けることはできません。- 一つのプロシージャで使える
ParamArray
は一つだけです。
For Each item In values
ParamArray
によって values
は配列になっているため、For Each
ループを使って、渡された引数を一つずつ順番に取り出して処理することができます。この例では、取り出した各 item
を result
という文字列変数に、区切り文字を挟みながら連結しています。
まとめ
今回は、VBAの ParamArray
を使って、任意の個数の引数を受け取れる柔軟な関数を作成する方法を解説しました。
- 引数の宣言時に
ParamArray
キーワードを使う。 ParamArray
で受け取る変数は、Variant
型の配列として宣言する。ParamArray
は、必ず引数リストの最後に配置する。
このテクニックをマスターすれば、複数のデータを扱う計算処理や文字列操作などを、非常にシンプルで直感的に呼び出せる関数として実装できます。Excelの組み込み関数のような、使い勝手の良いオリジナル関数の作成に、ぜひ挑戦してみてください。