![見出し画像](https://assets.st-note.com/production/uploads/images/165383000/rectangle_large_type_2_9d68bb58eca981498ca4df785583f49a.jpeg?width=1200)
マクロ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