VBA100本ノック 25本目:マトリックス表をDB形式に変換

こちらで公開されている、100本ノックに挑戦。
www.excel-ubara.com
素晴らしい教材を公開いただき、ありがとうございます。

上記リンク先から、問題文を転載。

今回のお題は、マトリックス(行列)表からDB(テーブル)形式への変換。
列数は、登場する日付の最大値と最小値の差から求めてみた。従って、例えば
土日が無いなど不連続なデータの場合は成立しない。
※その場合は、使用する列数などで求めるべきか。

行数は、部門数と区分数を変数に持つことで対応。マトリックスから自動で
読み取ってはいないので、確実性には欠けるかもしれない。

ということで、作成したのがこちら。

Sub VBA_100Knock_025()

        Sheets("売上").Select

    ' 日付。
    Dim dMax As Long
        dMax = WorksheetFunction.Max(Rows(1)) - _
               WorksheetFunction.Min(Rows(1)) + 1
    ' 部門数。
    Dim DeptNumber As Long
        DeptNumber = 5
    ' 区分数。
    Dim ItemNumber As Long
        ItemNumber = 2
    ' 並び替えたデータを格納するための配列。
    Dim arr() As Variant
    ReDim arr(dMax * DeptNumber * ItemNumber, 3)
    ' ラベル行のデータ作成。
        arr(0, 0) = "部門"
        arr(0, 1) = "区分"
        arr(0, 2) = "日付"
        arr(0, 3) = "金額"
    
    ' マトリックス形式の表範囲。
    Dim SrcRange As Range
    Set SrcRange = Range("A1").CurrentRegion
    Dim r As Long
    Dim c As Long
    Dim i As Long: i = 1
        For r = 2 To SrcRange.Rows.Count
            For c = 3 To dMax + 2
                ' 結合セル対策。
                If SrcRange(r, 1) = vbNullString Then
                    arr(i, 0) = arr(i - 1, 0)
                Else
                    arr(i, 0) = SrcRange.Cells(r, 1)
                End If
                arr(i, 1) = SrcRange.Cells(r, 2)
                arr(i, 2) = SrcRange.Cells(1, c)
                arr(i, 3) = SrcRange.Cells(r, c)
                i = i + 1
            Next
        Next
    
    Dim Sh As Worksheet
    Set Sh = Sheets.Add
        Sh.Name = "売上DB"
        Sh.Range("A1").Resize(dMax * DeptNumber * ItemNumber + 1, 4) = arr
End Sub

実行した結果が ↓ こちら。

※冒頭リンク先の解答例および解説も、ぜひご一読ください。

参考まで。