質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

897閲覧

vba 項目数が可変になる損益の計算について教えて下さい。

umebosi

総合スコア4

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/06/26 16:10

イメージ説明

前提・実現したいこと

最終行の損益集計行の数字を出したいのですが、集計対象の項目行数(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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

小計を出力しながら損益を計算するならこんな感じでどうでしょうか。

VBA

1'■科目、損益 2Dim 科目 'As Scripting.Dictionary 3Set 科目 = CreateObject("Scripting.Dictionary") 4With 科目 5 .Add "収入", 1 6 .Add "労務費(原価)", -1 7 .Add "商品仕入", -1 8 '(略) 9End With 10ReDim 損益(1 To 1, 1 To UBound(sumdata, 2)) 11 12'■小計 13With ws3 14 ReDim smalsum計算(1 To 1, 1 To UBound(sumdata, 2)) 15 16 For nowRow = 1 To UBound(kcodedata, 1) 17 For nowCol = 1 To UBound(sumdata, 2) 18 If kcodedata(nowRow, 3) = "小計" Then 19 損益(1, nowCol) = 損益(1, nowCol) + samlsum計算(1, nowCol) * 科目(kcodedate(nowRow, 2)) 20 21 '(略) 22

投稿2021/06/27 05:27

jinoji

総合スコア4592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

umebosi

2021/06/27 08:12

ありがとうございました! Dictionaryを使ってこんな方法で計算出来ることを学び、大変勉強になりました! 損益の配列をIfの満たした場合にすると、一列目の計算しか行わなかったため、 満たさなかった場合の処理に損益の計算用配列を入れて小計以外の全ての行を加算・減算することで正しい金額が出力できました。 全く考えつかなかった方法なので、勉強してこれからも応用させてさせて頂きたいと思います! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問