VBA100本ノック 25本目:マトリック表をDB形式に変換
1 今回のお題
画像1のように「売上」シートに横に日付と金額が入力されています。
行数・列数(日数)は増減します。
A列はセル結合されています。
画像2のようにデータベース形式に変換して「売上DB」シートに出力してください。
※「売上DB」は既存で見出しも入っています。
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。
ではでは、このへんで(^^)/~~~