【VBA】ParamArrayで可変長の引数(任意の個数の引数)を受け取る方法

目次

はじめに

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 ループを使って、渡された引数を一つずつ順番に取り出して処理することができます。この例では、取り出した各 itemresult という文字列変数に、区切り文字を挟みながら連結しています。


まとめ

今回は、VBAの ParamArray を使って、任意の個数の引数を受け取れる柔軟な関数を作成する方法を解説しました。

  • 引数の宣言時に ParamArray キーワードを使う。
  • ParamArray で受け取る変数は、Variant 型の配列として宣言する。
  • ParamArray は、必ず引数リストの最後に配置する。

このテクニックをマスターすれば、複数のデータを扱う計算処理や文字列操作などを、非常にシンプルで直感的に呼び出せる関数として実装できます。Excelの組み込み関数のような、使い勝手の良いオリジナル関数の作成に、ぜひ挑戦してみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次