『工事番号を順番に並べて該当する原価を整列表示する方法』(老眼めがね)
御世話になります。
工事原価を材料・経費・外注費べつに、工事番号順に把握していますが、原価は必ずしも全ての原価項目で発生するわけではなく欠落番号も特定の工事では生じます。会計帳簿は原価発生番号のみの集計表となっているため、例として材料#189は経費集計表には記載されず外注費には発生が有ったため#189として表示されています。従って各原価の集計表では記載されている工事番号数が異なるため材料では90件 経費では40件 外注費では60件というような形になっています。工事原価として全ての工事番号を番号順に抽出して、各工事原価を該当する工事#セルに記入したいのですが、全ての工事番号を羅列集計する方法及び該当する工事#に該当する原価(未対応の工事#では空欄とする)を表示させる方法を教えて下さい。使用している工事#は100番から300番を使用しています。集計表の項目としては、番号順・材料・経費・外注費・総合計という形を考えております。関数ORマクロでも結構ですので教えて下さい。
< 使用 Excel:Excel2013、使用 OS:Windows11 >
サンプルを行番号・列番号がわかる表形式で示してもらえますか? 実行前はこういうもので、結果としてこういうものを得たい、という説明をして下さい。
# 適宜改行を入れたり、箇条書きで説明してもらうと、より可読性が高まったのでしょうけどねえ。 (xyz) 2025/07/05(土) 10:39:37
表を提示する際、行の最初を半角スペースで始めるとレイアウトが崩れにくいですよ。 (xyz) 2025/07/05(土) 10:54:51
|[A] |[B] |[C] [1]|列B(材料)|列C(経費)|列D(外注費) [2]|100 \90 |101 \80 |100 ¥96 [3]|102 \85 |102 \70 |103 ¥97 [4]|104 \89 |106 \69 |105 ¥95 [5]|105 \85 |107 \70 |106 ¥79 (隠居Z) 2025/07/05(土) 14:32:31
列B(材料) 列C(経費) 列D(外注費) 100 \90 101 \80 100 \96 102 \85 102 \70 103 \97 104 \89 106 \69 105 \95 105 \85 107 \70 106 \79 念のための確認ですが、 ・ひとつのセルに、工事番号と金額が二つとも入っているんですか? それは説明の都合上であって、本当は別々のセルです、ということでは? ・上記は4つの行ということなんですか? 関数をやりとりするにも、お互いに同一の前提のほうが提案も検証も 話が通じやすいと思うのですが、いかがですか?
列B C D E F G 1 100 \90 101 \80 100 \96 2 102 \85 102 \70 103 \97 3 104 \89 106 \69 105 \95 4 105 \85 107 \70 106 \79 といったことでいいのですか? そうでなければ、実際のありようをサンプルに反映してください。
# 行を半角スペースで始める、ということは伝わりにくいのですかねえ。 (xyz) 2025/07/05(土) 14:52:33
|[A] |[B] |[C] |[D] |[E] [1]|列A(番号順)|列B(材料)|列C(経費)|列D(外注費)|列E(原価総計) [2]| 100| 90| 0| 96| 186 [3]| 101| 0| 80| 0| 80 [4]| 102| 85| 75| 0| 160 [5]| 103| 0| 0| 97| 97 [6]| 104| 89| 0| 0| 89 [7]| 105| 85| 0| 95| 180 [8]| 106| 0| 69| 79| 148 [9]| 107| 0| 70| 0| 70 (隠居Z) 2025/07/05(土) 15:56:51
確認事項に回答いただけないので、ここまでです。 (xyz) 2025/07/05(土) 16:48:01
(隠居Z) 2025/07/05(土) 17:00:47
Option Explicit Private Sub VBACodeByFearfulSpeculationAndConjecture() Dim y As Long Dim x As Long Dim i As Long Dim Material&, Expenses&, OutsourcingC& Dim Dc As Object Dim v(), tmp(), dKey(), r Set Dc = CreateObject("Scripting.Dictionary") With Worksheets("Sheet1") Set r = .Cells(2, 2).CurrentRegion Set r = r.Offset(1).Resize(r.Rows.Count - 1) v = r.Value .Activate r.Select End With For x = 1 To UBound(v, 2) Step 2 For y = 1 To UBound(v, 1) Select Case x Case 1 Material = v(y, x + 1) Case 3 Expenses = v(y, x + 1) Case 5 OutsourcingC = v(y, x + 1) End Select If Not Dc.Exists(v(y, x)) Then Dc(v(y, x)) = Array(Material, Expenses, OutsourcingC) Else tmp = Dc(v(y, x)) tmp(0) = tmp(0) + Material tmp(1) = tmp(1) + Expenses tmp(2) = tmp(2) + OutsourcingC Dc(v(y, x)) = tmp End If Material = 0 Expenses = 0 OutsourcingC = 0 Next Next dKey = Dc.keys With Worksheets("Sheet2") .UsedRange.Clear .Cells(1, 2).Resize(, 5) = Array("工事番号", "材料", "経費", "外注費", "原価総計") y = 2 For i = 0 To UBound(dKey) .Cells(y, 2) = dKey(i) .Cells(y, 3).Resize(, 3) = Dc(dKey(i)) .Cells(y, 3).Offset(, 3).Value = Application.Sum(Dc(dKey(i))) y = y + 1 Next Set r = .Cells(1, 2).CurrentRegion r.Sort key1:=r.Columns(1), order1:=xlAscending, Header:=xlYes End With Erase v, dKey, tmp Dc.RemoveAll End Sub
しっかり、間違っていましたですね。 変数の初期化 3行追加修正
いたしました。
Material = 0 Expenses = 0 OutsourcingC = 0 でぇす。 << _ _ >> はずかし〜 m(__)m
(隠居Z) 2025/07/05(土) 19:08:15
(老眼めがね) 2025/07/05(土) 22:16:45
(隠居Z) 2025/07/06(日) 09:06:41
既に解決済みのようですが、別法として、手作業での方法も挙げておきましょう。 ・工事番号の列をコピーして縦一列に並べ、昇順にソートしてから、「重複の削除」を行って一意化します。 ・次に、SUMIF関数を使って、材料、経費、外注費ごとに、 工事番号に対応する費用の合計を作成します。 ・最後に、3つの合計をSUM関数で計算します。 (xyz) 2025/07/06(日) 14:08:04
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.