表の編集 1行1レコード化

実際に受けた相談内容を、少し変更して紹介します。

残業時間を集計した既存の表があり、列方向に月日が推移する形式になって
いました。

f:id:Infoment:20180702193025p:plain

この表を「1行1レコード(記録)にしたい」という要望があり、マクロで
成形してみました。↓最終形は、こんな感じです。

f:id:Infoment:20180702193129p:plain

実際に作成したマクロがこちらです。

Sub Sample()

    Dim OrgData As Variant  ' 元データ貼り付け用
    Dim seq     As Variant  ' 加工済データ格納用
    Dim i       As Long     ' 繰り返し作業用整数
    Dim r       As Long     ' 配列の行番号
    Dim c       As Long     ' 配列の列番号
    Dim rMax    As Long     ' 最大行数
    Dim cMax    As Long     ' 最大列数
    
    ' 元データを一旦、配列に格納。    
        OrgData = Range("A1").CurrentRegion
        
    ' 行と列の最大値を取得。    
        rMax = UBound(OrgData, 1) - 1
        cMax = UBound(OrgData, 2) - 1
    
    ' 元データから、加工済データ格納用配列を再定義。    
        ReDim seq(1 To rMax * cMax + 1, 1 To 3)
        
    ' 一行目にラベル情報をセット。        
        seq(1, 1) = "日付"
        seq(1, 2) = "名前"
        seq(1, 3) = "残業(h)"
    
    ' 二行目以降に、元データを並び替えて格納する。        
        For i = 2 To UBound(seq)
        
        ' データを入力する行番号rと列番号cを取得。       
            r = ((i - 2) Mod rMax) + 2
            c = WorksheetFunction.RoundUp((i - 1) / rMax, 0) + 1
            
        ' 配列にデータ格納。            
            seq(i, 1) = OrgData(1, c)
            seq(i, 2) = OrgData(r, 1)
            seq(i, 3) = OrgData(r, c)
        
        Next
    
    ' 加工済みデータ貼り付け用シート追加。        
        Sheets.Add After:=Sheets(Sheets.Count)
    
    ' 配列を貼り付け。    
        Range("A1").Resize(UBound(seq), UBound(seq, 2)) = seq

End Sub

一番のポイントは、AさんからEさんまで入力したのち、またAさんから
始まる「循環」の仕組みでしょうか。

r=(2-2)÷ 5 のあまり +2 = 0+2 = 2
r=(3-2)÷ 5 のあまり +2 = 1+2 = 3
r=(4-2)÷ 5 のあまり +2 = 2+2 = 4
r=(5-2)÷ 5 のあまり +2 = 3+2 = 5
r=(6-2)÷ 5 のあまり +2 = 4+2 = 6
r=(7-2)÷ 5 のあまり +2 = 0+2 = 2
r=(8-2)÷ 5 のあまり +2 = 1+2 = 3

のように、2~6を繰り返します。「余り」を利用した数の繰り返しは大変
有効ですので、ぜひ使ってみてください。

また同様に、2~6のグループが幾つ目か?も、割り算で求めています。

(2-1)÷ 5 = 0.2 ⇒ 1の位へ切り上げ ⇒ 1 ⇒ 1+1=2
(3-1)÷ 5 = 0.4 ⇒ 1の位へ切り上げ ⇒ 1 ⇒ 1+1=2
(4-1)÷ 5 = 0.6 ⇒ 1の位へ切り上げ ⇒ 1 ⇒ 1+1=2
(5-1)÷ 5 = 0.8 ⇒ 1の位へ切り上げ ⇒ 1 ⇒ 1+1=2
(6-1)÷ 5 = 1.0 ⇒ 1の位へ切り上げ ⇒ 1 ⇒ 1+1=2
(7-1)÷ 5 = 1.2 ⇒ 1の位へ切り上げ ⇒ 2 ⇒ 2+1=3
(8-1)÷ 5 = 1.4 ⇒ 1の位へ切り上げ ⇒ 2 ⇒ 2+1=3

のように、5進んで初めて1増えることになりす。この方法も大変有効です。上記と合わせて活用してみましょう。

参考まで。