引数の数が変わってしまう場合に配列はどう扱う2
引数の数が変わってしまう場合に配列はどう扱う2
![引数の数が変わってしまう場合に配列はどう扱う2](gazo2019/macro85b.png)
![引数の数が変わってしまう場合に配列はどう扱う2](gazo2019/macro85b.png)
マクロ 85_b回
コードの中でどんな変数を使うか
85回からの続きです。
コードの中でどんな変数を使ったらいいかということを考えていきます。
この記事は動画で視聴することができます。UDFの引数の数が変わってもParamArrayと動的配列で大丈夫
(サンプルファイルは、こちらです。 引数が不定でもParamArrayで大丈夫、ParamArrayでユーザーファンクション、サンプル100回)
(サンプルファイルは、こちらです。 引数が不定でもParamArrayで大丈夫、ParamArrayでユーザーファンクション、サンプル100回)
配列の個数が可変の時の引数と変数の設定
1. 例えば この3つのセルに入っている全体のレンジを配列として受け取りたい。
あるいは、セルが2つだったり4つだったりといろいろあることが想定されます。
![引数の数が変わってしまう場合に配列はどう扱う21](gazo2019/macro/macro85_b01.png)
2. そこで、ここではかたまりと考えて配列のひとつgroupedという変数を使います。
![引数の数が変わってしまう場合に配列はどう扱う22](gazo2019/macro/macro85_b02.png)
3. その中の1個1個はひとつの中のピースとして、変数pieceを使います。
![引数の数が変わってしまう場合に配列はどう扱う23](gazo2019/macro/macro85_b03.png)
4. そしてつかうのは、For文の中でFor Each piece In groupedのように使います。
![引数の数が変わってしまう場合に配列はどう扱う24](gazo2019/macro/macro85_b04.png)
5. 他に動的配列newArrayも使います。
Function ketugou(delimiter As String, ignore_empty As Boolean, _ ParamArray joinText() As Variant) Dim grouped As Variant, piece As Variant, i As Long Dim newArray() As Variant End Function
![引数の数が変わってしまう場合に配列はどう扱う25](gazo2019/macro/macro85_b05.png)
For文のネスト
6. 中身のコードですが、変数iの初期値を=0とします。変数iを使用したFor文を入れましょう。
For Each piece In grouped If Not ignore_empty Or Not IsEmpty(piece) Then ReDim Preserve newArray(i) newArray(i) = piece i = i + 1 End If Next piece
![引数の数が変わってしまう場合に配列はどう扱う26](gazo2019/macro/macro85_b06.png)
7.このFor文はさらにFor文でネストします。外側のFor文では、 引数で受け取ったjoinTextの中のgroupedを見ていくということになります。
![引数の数が変わってしまう場合に配列はどう扱う27](gazo2019/macro/macro85_b07.png)
8. そして、joinTextの中のgroupedがRangeかどうかの判定をして、Rangeならば内側のFor文で処理をします。
![引数の数が変わってしまう場合に配列はどう扱う28](gazo2019/macro/macro85_b08.png)
9. 次に内側のFor文では、受け取ったgroupedの中のpieceを空であるかどうかの判定 をして空でないなら、newArrayに渡してやります。
空でない=文字列がある
If Not ignore_empty Or Not IsEmpty(piece) Then
Function ketugou(delimiter As String, ignore_empty As Boolean, _ ParamArray joinText() As Variant) Dim grouped As Variant, piece As Variant, i As Long Dim newArray() As Variant i = 0 For Each grouped In joinText If TypeName(grouped) = "Range" Then For Each piece In grouped If Not ignore_empty Or Not IsEmpty(piece) Then ReDim Preserve newArray(i) newArray(i) = piece i = i + 1 End If Next piece ’ まだ Next grouped ’ まだ End Function
![引数の数が変わってしまう場合に配列はどう扱う29](gazo2019/macro/macro85_b09.png)