ユーザー定義関数の引数の数が変わってしまう場合配列はどうするか マクロ講座

ユーザー定義関数の引数の数が変わってしまう場合配列はどうするか

引数の数が変わってしまう場合配列はどうするか
引数の数が変わってしまう場合配列はどうするか

マクロ 85回 引数の数を可変にできる ParamArray

常に一定ではなくてその都度変わるかもしれないというときに使う引数の使い方

この記事は、動画で解説しているマクロの、解説版です。
内容は、不連続なセル範囲の文字列の結合をするマクロとなります。
以前には、連続する文字列で、特定のセル範囲が決まっててそれを結合するという、 ユーザ定義関数を作ったことがあります。
けれど今回は連続している部分もあり、連続していない部分もあるケースです。個数も、セルの数が不揃いだということです。
ユーザー定義関数の引数として配列で受け取るデータの個数がその都度変わっても、大丈夫なコードを作成するにはどうすればよいかというテーマになります。

配列で受け取る引数の個数がその都度かわる場合

1. セル数がバラバラの文字列を結合することを想定しています。2個のセルを結合するマクロとか、3個の場合、4個の場合などというように、 ケースごとにマクロを作っていたのでは大変です。結合したいセル範囲を指定してやれば、行ごとに結合する文字列の個数が違っていても、結合できるようにしたいと思います。


引数の数が変わってしまう場合配列はどうするか1

2. そこで他のプロシージャから呼び出して使うFunctionプロシージャーやSubプロシージャには 引数を指定することができるので、引数を利用します。


引数の数が変わってしまう場合配列はどうするか2

3. 今回はその引数の数が変わってしまう時です。常に一定ではなくてその都度変わるかもしれないというときに使う 引数の使い方


引数の数が変わってしまう場合配列はどうするか3

4. この場合は ParamArrayキーワードというのを使うと プロシージャーの呼び出しの時に、その位置の後ろから指定される引数を配列として受け取りますので、 そのParamArrayとつけた引数に関しては、その都度引数が変わっても大丈夫なのです。


引数の数が変わってしまう場合配列はどうするか4

ParamArrayキーワードとは

5. SubプロシージャやFunctionプロシージャーには、書き方(構文)があります。その引数(arglist)の構文は、どういう構成かというと、以下のようになっています。
[Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type] [= defaultvalue]
これらの引数のなかで、varname 以外はすべて省略可能です。

ここでは、ParamArrayの説明だけします。
ParamArrayキーワードを使うと、任意の数の引数を渡すことができます。
そして、名称にArrayがつくことから、ご察しの通り、ParamArrayキーワードは、その引数がバリアント型(Variant)の要素を持つ配列であることを示します。そしてそれはまた省略可能(Optional)です。


引数の数が変わってしまう場合配列はどうするか5

ParamArrayキーワードの使用上の制限

6. ParamArrayを使用するときには、いくつかの決まりがあります。
1. 引数リストの最後の引数でしか使用できない

Sub sample1(引数1 As Integer, ParamArray 引数2() As Variant)
' 最後の引数にしか使えない
End Sub

2. ByVal、ByRef、Optionalの各キーワードといっしょに使うことはできない

Sub sample2(ParamArray ByVal 引数1() As Variant)
'これはエラー、ByValキーワード等、各キーワードを一緒につかえない。
End Sub

3. データ型はVaiantのみ

4. 名前付き引数は使えない
これらの制限を踏まえて、コードを考えていきます。

7. では最初に必要な引数とその名前を考えます。サンプルでは説明の際にわかりやすいような名前をつけています。
結合した文字:joinText
区切り:delimiter
空白の扱い:ignore_empty



引数の数が変わってしまう場合配列はどうするか6

8. Functionプロシージャーの引数として上記の3つを使います。ParamArrayキーワードを使うのは、結合した文字:joinTextになります。

Function ketugou(delimiter As String, ignore_empty As Boolean, _
   ParamArray joinText() As Variant)
End Function


引数の数が変わってしまう場合配列はどうするか7