不連続な範囲の値を取得 の続きの続き

昨日は或る要望の追加仕様に応え、飛び石のように不連続に散らばった範囲について、その値を二次元配列として集約する関数を作成しました。

infoment.hatenablog.com

やれやれ、今度こそ、これで何とかなりそうだ。
「こんな感じでどうです?」
「ありがとうございます^^。ほとんどの場合は、これでOKです!」

え・・・ほとんどの場合?

「通常は2行で1セットなんですが、たまに3行で1セットのときもあります

つまりは、こんな感じです。

f:id:Infoment:20180721072000p:plain

「何ですと?」
「いえいえ、そんなにたくさんでは無いです^^」

有ると言っていつも無いのが、予算と納期と仕様書で
無いと言っていつも有るのが、追加仕様と例外処理

いや、予算と納期は、いつも元々無いかもしれない。
というわけで、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
  1. ◎行◇列の表に集約したい場合、◇列に相当する second_index を追加しています。正式な呼び名が分からなかったので「第2引数」のような感じの名前にしています。使用者のお好みに合わせて修正可です。
  2. 最大行数は、全データ数を列数で割って切り上げています。データを入れる箱の数が足りなくなると、集約結果が溢れてしまうので。


↓ テストと結果です ※ArrayPaste関数については、昨日分をご参照ください。

Sub test()
    Dim seq As Variant
    seq = ConvRangeToArray(Selection, 3)
    ArrayPaste Range("H11"), seq
End Sub

f:id:Infoment:20180721073939p:plain

やれやれ、本当に本当に、これで何とかなりそうだ。
「こんな感じになりました。どうです?」
「ばっちりです!ありがとうございます^^
 あと実は、もともと二行二列のデータがあって・・・」
「それは、また別の関数でやりましょう^^;」

このとき、「アインシュタインじゃないんだから」と付け加えかけましたが、伝わらない恐れがあるため止めました(ご参考 ⇒ 統一場理論 - Wikipedia )。

参考まで。