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

この記事から得るもの

For~Nextの2重処理。

1 今回のお題

画像1のように「売上」シートに横に日付と金額が入力されています。
行数・列数(日数)は増減します。
A列はセル結合されています。
画像2のようにデータベース形式に変換して「売上DB」シートに出力してください。
※「売上DB」は既存で見出しも入っています。

f:id:bimori466:20201122215948p:plain
f:id:bimori466:20201122220020p:plain

excel-ubara.com

2 今回のお題の意図

集計、分析をしやすくするためにDB形式にデータを集める。

3 回答

今回はやれる回だ!と思ったので、頑張って1から作ってみました。

私の回答

Sub ノック25本目()

Dim ws1 As Worksheet: Set ws1 = Worksheets("売上")
Dim ws2 As Worksheet: Set ws2 = Worksheets("売上DB")

Dim Affiliation As String: Dim Classification As String
Dim Price As Integer: Dim myDate As Date

Dim Write_IX As Long: Write_IX = 1

For i = 2 To ws1.Range("A1").CurrentRegion.Rows.Count
    If ws1.Cells(i, 1).MergeArea(1, 1).Value <> "" Then
        Affiliation = ws1.Cells(i, 1).MergeArea(1, 1).Value  '部門の取得
        
        For j = 2 To ws1.Range("A1").CurrentRegion.Columns.Count
            If j = 2 Then
                Classification = ws1.Cells(i, j).Value  '区分の取得
                
            Else
                Price = ws1.Cells(i, j).Value   '金額取得
                myDate = ws1.Cells(1, j).Value  '日付取得
                
                
                '書き込み処理
                Write_IX = Write_IX + 1
                
                ws2.Cells(Write_IX, 1) = Affiliation
                ws2.Cells(Write_IX, 2) = Classification
                ws2.Cells(Write_IX, 3) = myDate
                ws2.Cells(Write_IX, 4) = Price
            End If
        Next
    End If
Next

End Sub


行、列を2重ループします。ここを押さえておけば、OKな出題ですね。
ポイントは、列のループで2は、区分しかないので2とそれ以外で処理を分けています。

4 感想

2重ループ系は腐るほど書いてきたので割と早く回答することができました。書き込み先をクリアする処理を入れるか迷いましたが、まぁいいかなと。今回はOKOK。


ではでは、このへんで(^^)/~~~