見出し画像

マクロVBA練習問題15

問題

エクセルの神髄さんの練習問題15(Withとオブジェクト変数の練習)を解いた。
https://excel-ubara.com/excelvba9/EXCELVBA615.html

解答

リーダブルコード版

Sub 練習問題15_リーダブル()
    
    '設定
    Sheet15_2.Range("A1").CurrentRegion.Offset(1, 1).ClearContents      '出力先初期化
    Dim 売上表 As Variant: 売上表 = Sheet15_1.Range("A1").CurrentRegion
    Dim 集計表 As Variant: 集計表 = Sheet15_2.Range("A1").CurrentRegion
    
    '処理
    Dim i As Long, J As Long
    For i = 2 To UBound(売上表, 1)
        
        '集計表の支店列番号を取得
        For J = 2 To UBound(集計表, 2)
            If 売上表(i, 1) = 集計表(1, J) Then
                Dim 支店Col As Long: 支店Col = J
                Exit For
            End If
        Next J
        
        '集計表の分類行番号を取得
        For J = 2 To UBound(集計表, 1)
            If 売上表(i, 2) = 集計表(J, 1) Then
                Dim 分類Row As Long: 分類Row = J
                Exit For
            End If
        Next J
        
        '売上を集計表に加算
        集計表(分類Row, 支店Col) = 集計表(分類Row, 支店Col) + 売上表(i, 3)
        
    Next i
    
    '出力先に貼付け
    Sheet15_2.Range("A1").Resize(UBound(集計表, 1), UBound(集計表, 2)).Value = 集計表
    
End Sub

後で読み返す、修正することを意識してコードを書いた。
とにかく書いた最初のコードは下記になります。
ネストが深く、どんな処理をしているかが分かりにくいですよね。
このようなコードを結構作ってしまったので、少しずつリーダブルなコードに書き換えていきたいと思いました。

とにかく問題を解くために書いたコード

Sub 練習問題15()
    
    With Sheet15_1.Range("A1").CurrentRegion
        
        '設定
        Sheet15_2.Range("A1").CurrentRegion.Offset(1, 1).ClearContents '出力先初期化
        Dim StartRow As Long: StartRow = 2
        Dim EndRow As Long: EndRow = .Rows.Count
        
        '処理
        Dim 集計表 As Variant: 集計表 = Sheet15_2.Range("A1").CurrentRegion
        Dim i As Long, J As Long, K As Long
        For i = StartRow To EndRow
            For J = 2 To UBound(集計表, 2)
                If .Cells(i, "A").Value = 集計表(1, J) Then
                    For K = 2 To UBound(集計表, 1)
                        If .Cells(i, "B").Value = 集計表(K, 1) Then
                            集計表(K, J) = 集計表(K, J) + .Cells(i, "C").Value
                            Exit For
                        End If
                    Next K
                    Exit For
                End If
            Next J
        Next i
        
        '貼付処理
        .Range("E1").Resize(UBound(集計表, 1), UBound(集計表, 2)).Value = 集計表
        
    End With
    
End Sub

いいなと思ったら応援しよう!