>Dが空白でない場合、GにE*Fの答えを入力させるには、どうしたらよいのでしょうか?
E*Fを計算できるようにしてみました。
操作方法は前回と同じで、A2~G13を選択状態にしてマクロを実行します。
こういう風に小計を出していくには、このようなTree構造のほうが処理が行いやすいかもしれませんね。判定に未入力セルを有効に使えます。
Sub TreeTotal()
Dim Area As Range '選択範囲
Dim top As Range '一番左上のセル
Dim TTLcolumns As Integer '選択範囲の列数
Dim TTLrows As Integer '選択範囲の行数
Set Area = Selection
TTLcolumns = Area.Columns.Count - 1
TTLrows = Area.Rows.Count - 1
Set top = Area.Range("A1")
Dim c As Integer '列カウンタ
Dim r As Integer '行カウンタ
Dim TTL As Long 'トータル
Dim Elm As Long '単価×個数の値
With top
'単価×個数の計算
For r = TTLrows To 0 Step -1
If .Offset(r, TTLcolumns - 3) <> "" Then
Elm = .Offset(r, TTLcolumns - 2) * .Offset(r, TTLcolumns - 1)
.Offset(r, TTLcolumns) = Elm
End If
Next
'小計、合計の計算
For c = TTLcolumns - 4 To 0 Step -1
For r = TTLrows To 0 Step -1
If .Offset(r, TTLcolumns - 3) <> "" Then
TTL = TTL + .Offset(r, TTLcolumns)
ElseIf .Offset(r, c) <> "" Then
.Offset(r, TTLcolumns) = TTL
TTL = 0
End If
Next
Next
End With
End Sub
単純なアルゴリズムで集計できます。
質問の表なら、A2~G13を選択状態にして下記マクロを実行します。
質問にある※部分にその合計を書き込んでいきます。
質問のように表構造が守られていれば、何列何行あっても問題ありません。
必要とする表構造の要件は『最下層の計算は選択範囲の右4列で計算されている』ということだけです。
ここから
↓
Sub TreeTotal()
Dim Area As Range '選択範囲
Dim top As Range '一番左上のセル
Dim TTLcolumns As Integer '選択範囲の列数
Dim TTLrows As Integer '選択範囲の行数
Set Area = Selection
TTLcolumns = Area.Columns.Count - 1
TTLrows = Area.Rows.Count - 1
Set top = Area.Range("A1")
Dim c As Integer '列カウンタ
Dim r As Integer '行カウンタ
Dim TTL As Long 'トータル
With top
For c = TTLcolumns - 4 To 0 Step -1
For r = TTLrows To 0 Step -1
If .Offset(r, TTLcolumns - 3) <> "" Then
TTL = TTL + .Offset(r, TTLcolumns)
ElseIf .Offset(r, c) <> "" Then
.Offset(r, TTLcolumns) = TTL
TTL = 0
End If
Next
Next
End With
End Sub
お礼
本当にありがとうございます。なんとお礼を言って良いのやら。 早速会社の人間に見せて、驚かせました。 ただ、コードを見てもなぜこれで計算出来るのか、今一つ理解出来ない自分が玉に瑕です。(^^; 本当にありがとうございました。