前提・実現したいこと
最終行の損益集計行の数字を出したいのですが、集計対象の項目行数(B列~E列)は集計対象の期間によって変わるため、関数を埋め込むことができません。
又、最終行は小計を単純に足すのではなく、
(損益集計)=(収入の小計)-(労務費(原価)小計)-(商品仕入小計)+(棚卸(期首)小計)-(棚卸(期末)小計)-(材料費小計)-(外注費小計)-(経費小計)-(販売管理費小計)+(営業外収益)
のように項目によってプラスとマイナスがあります。
項目の並びは、大科目順に並べてあるため、並び替えることができません。
このような場合、どのように損益の集計をしたら良いのでしょうか。
画像では、入りきらなかったため項目を非表示にしている行があるため、小計の金額が合っていないように見えますが、小計の出力までは正しく出力できています。
該当のソースコード
Sub 小計計算() Dim ws3 As Worksheet Set ws3 = Worksheets("部門別集計") '最終行を取得 Dim maxRow3 As Long maxRow3 = ws3.Cells(Rows.Count, 4).End(xlUp).row '最終列を取得 Dim maxCol3 As Long maxCol3 = ws3.Cells(5, Columns.Count).End(xlToLeft).Column '集計対象範囲を配列格納 Dim datasel As Range Dim sumdata As Variant Dim kcodedata As Variant Dim smalsum出力 As Range Dim smalsum計算 As Variant Dim nowRow As Long, nowCol As Long Dim sum_bottomRow As Long Set datasel = ws3.Range(ws3.Cells(8, 7), ws3.Cells(maxRow3, maxCol3)) sumdata = datasel.Value kcodedata = ws3.Range(ws3.Cells(8, 2), ws3.Cells(maxRow3, 5)).Value '■小計 With ws3 ReDim smalsum計算(1 To 1, 1 To UBound(sumdata, 2)) For nowRow = 1 To UBound(kcodedata, 1) For nowCol = 1 To UBound(sumdata, 2) If kcodedata(nowRow, 3) = "小計" Then datasel.Range(.Cells(sum_bottomRow, 1), .Cells(sum_bottomRow, maxCol3 - 6)) = smalsum計算 Erase smalsum計算 ReDim smalsum計算(1 To 1, 1 To UBound(sumdata, 2)) nowRow = nowRow + 1 nowCol = nowCol - 1 Else smalsum計算(1, nowCol) = smalsum計算(1, nowCol) + sumdata(nowRow, nowCol) sum_bottomRow = nowRow + 1 End If Next nowCol Next nowRow End With '■開放 Set smalsum計算 = Nothing End Sub
試したこと
先に大科目のコードが変わる所で行挿入・”小計”の文字を入力し、
上記のコードでは小計行以外は配列で計算し、小計行になったら計算結果を出力しています。
小計を出力した後に最終行の損益を計算するのか、小計を出力しながら損益を計算する方法があるのか、どちらも考えても解らずにいます。
また、コードの見にくい点ご容赦頂けたらと思います。
コードをこう直した方が良いなどありましたら教えて頂けたら在り難いです。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/27 08:12