不連続な範囲の値を取得 の続きの続き
昨日は或る要望の追加仕様に応え、飛び石のように不連続に散らばった範囲について、その値を二次元配列として集約する関数を作成しました。
やれやれ、今度こそ、これで何とかなりそうだ。
「こんな感じでどうです?」
「ありがとうございます^^。ほとんどの場合は、これでOKです!」
え・・・ほとんどの場合?
「通常は2行で1セットなんですが、たまに3行で1セットのときもあります」
つまりは、こんな感じです。
「何ですと?」
「いえいえ、そんなにたくさんでは無いです^^」
有ると言っていつも無いのが、予算と納期と仕様書で
無いと言っていつも有るのが、追加仕様と例外処理
いや、予算と納期は、いつも元々無いかもしれない。
というわけで、1セットになる単位を引数に追加しました。
'============================================================ ' Name : ConvRangeToArray ' Input : ' myRng As Range 集約対象となるデータが入力された範囲 ※不連続でも可 ' second_index As Long 第2引数の数 ' Output : 指定範囲から抽出したデータ(配列) ' Purpose : 不連続範囲のデータの集約 ' Remarks : https://infoment.hatenablog.com/entry/2018/07/21/075254 ' Author : infoment ' Start : 2018/7/20 ' Version : 1.1 '============================================================ Public Function ConvRangeToArray(myRng As Range, _ Optional second_index As Long = 2) As Variant ' ----- 1. Dim r As Range Dim col As Collection Set col = New Collection For Each r In myRng col.Add r.Value Next Dim seq As Variant Dim iMax As Long iMax = WorksheetFunction.RoundUp(col.Count / second_index, 0) ' ----- 2. ReDim seq(1 To iMax, 1 To second_index) Dim i As Long, j As Long, k As Long k = 1 For i = 1 To iMax For j = 1 To second_index seq(i, j) = col.Item(k) k = k + 1 Next Next ConvRangeToArray = seq End Function
- ◎行◇列の表に集約したい場合、◇列に相当する second_index を追加しています。正式な呼び名が分からなかったので「第2引数」のような感じの名前にしています。使用者のお好みに合わせて修正可です。
- 最大行数は、全データ数を列数で割って切り上げています。データを入れる箱の数が足りなくなると、集約結果が溢れてしまうので。
↓ テストと結果です ※ArrayPaste関数については、昨日分をご参照ください。
Sub test() Dim seq As Variant seq = ConvRangeToArray(Selection, 3) ArrayPaste Range("H11"), seq End Sub
やれやれ、本当に本当に、これで何とかなりそうだ。
「こんな感じになりました。どうです?」
「ばっちりです!ありがとうございます^^
あと実は、もともと二行二列のデータがあって・・・」
「それは、また別の関数でやりましょう^^;」
このとき、「アインシュタインじゃないんだから」と付け加えかけましたが、伝わらない恐れがあるため止めました(ご参考 ⇒ 統一場理論 - Wikipedia )。
参考まで。