引数の数を固定せず、任意の数の引数を渡せるようにする方法を解説します。-ParamArrayキーワードParamArrayを丸ごと省略した時の動き使いどころおまけ:Variant型であることの注意点やりたいことワークシート関数の「SUM」をイメージしてください。A5=SUM(A1:A4)A5=SUM(A1,A2,A3,A4)これはどちらもA1~A4の4セルを合計します。このようにSUM関数は、自由な数の引数を渡すことができます。呼び出すときに好きな数だけ渡せるプロシージャを作成する方法を解説します。16を返すこんな関数を例に説明していきます。渡す引数の数は自由です。-Oprtionalでゴリ押しする本題に入る前に、先に簡単な代替案から紹介します。引数を省略可能にする、「Optionalキーワード」というものがあります。これを使って、自由な数の引数を受け取る関数を↓のように作れます。エラー「引数の数が一致していません」まあ見ればわかる通り、まったく自由ではありません(笑)引数の数は「1個~5個」しか許していませんからね。実務ではこれで十分なことも多いんですよ。自由な数とはいっても、実務上のだいたいの上限はありますからね。配列に慣れていない方には、ハードルが高いかもしれません。引数の型がVariantしか指定できないため、データ型に気を使う場合は、意外と面倒があります。実際に使う引数の数が、多くても5個とかくらいなら、ちゃちゃっとOptionalで書いた方がいいことも多いでしょう。6個必要になったら、その時関数を書き換えても、それでも前の関数と互換性があるのがOptionalのいいところですしね。それを念頭に置いた上で、本題に入りましょう。-ParamArrayキーワード先ほどの「足し算」関数に、本当に「好きな数だけ引数を渡す」には、ParamArrayキーワードを使用して以下の通り書きます。48が返りますコードの通り、関数を呼び出す側では複数の引数として渡すことができ、プロシージャ内で実際に使うときは配列として扱うことができます。任意の数の引数を、1つの配列に変換して関数内に渡しているイメージですね。使う上での注意点ですが、前述の通り、ParamArrayはデータの型を指定できません。常にVariant型の配列になります。その他のルールとして、ParamArrayは最後の引数でのみ指定可能Optionalと併用不可ByVal/Refの指定不可などの制約があります。↑の足し算をテンプレートに、書き替えて使ってもいいくらいですね。数値」と書くとエラーになります。配列を表す()がないとダメなので注意してください。書けないんだから気を利かせて補完しろや。ParamArray引数以外の引数も使用する場合は、ParamArray引数の前に書けばよいです。↑のように普通の引数を追加します。ParamArrayを丸ごと省略した時の動きParamArray引数を1つも渡さなかった場合は、「配列の上限Uboundが-1で、要素はなし」という、いわゆる空の配列(≒Array())がセットされます。Forステートメントには、「初期値より最終値が小さい場合は1度も処理しない」という性質がありますので、エラーにはならずにしっかりと0は返ります。("最低1つは数値を渡してください。-1」を判定して例外処理を書いてください。使いどころ同じ型の値をたくさん受け取り、それをまとめるような処理に長けています。返るこんな汎用関数を作れます。」これをたくさん書くのに辟易とした経験がある方は、結構便利に感じると思います。入力規則のリストだったり、並び替えの順序指定など、Excelには結構カンマ区切りテキストを使うプロパティがありますからね。Functionと、配列を引数に持つ関数(今回はJoin)を使うこともできます。これでも「"みかん,りんご,いちご"」が返りますので、カンマ区切りの汎用関数を持っていきたい方はこちらをどうぞ。同じ型の変数をまとめるような汎用関数の作成に便利です。Range("A3"))こう呼んでみましょう。さっきと同じ様に動いているように見えます。実際の関数の中では、先ほどとは全く違う動きをしています。A3セル]という、3つのRangeオブジェクトを格納した配列が渡されています。String]という配列を渡したように錯覚してしまいがちですが、違うんですね。引数を渡したときではなく、関数内で参照されたときです。返ると、.Valueの有無で結果が変わるようになります。(ついでに、Join関数がオブジェクトの配列にもうまく動いてくれていることもわかります)まあこんな書き方をして実害に遭遇することはめったにないでしょうけどね。一応心の片隅に置いておくと、いつか何かあった時に解決の糸口になるかもしれません。「関数の引数」だったからです。Rangeと、Setキーワードの有無で、オブジェクトが渡されるか、既定のプロパティが渡されるかが決まります。この仕様も、心の片隅に置いておきましょう。20:34Tweet関連記事2023-02-17Sub/Functionプロシージャを呼ぶのにかかる時間マクロをSub分割したり自作関数を作り始めると、Sub/Functionを...2023-02-06Dir関数でサブフォルダの一覧を取得する方法Dir関数を使ってサブフォルダの一覧を取得する方法を解説します...2023-01-16マクロの処理時間を計測する-Timer関数の使い方マクロの処理時間を計測する方法を解説します。出てくる処理の汎用関数集を紹介します。「日本語の変数でプログラミングすれば、みんなが幸せになれる」という思想の元、主にExcelVBAのマクロやコードを解説しているブログです。この思想については↓の記事をご覧ください。変数を日本語にすればプログラミングが上達する記事の更新通知や質問の回答はTwitterでも行っております。お気軽にフォローください。12はてなブログをはじめよう!LimeCodeさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。