- ベストアンサー
別シートに分類毎にまとめ合計を算出
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
まず、この質問になかなか、回答がつかない理由は、「Visual Basic」で質問しているからです。 もう一度、同じ内容で、「エクセル」で質問すれば、回答がすぐにつくと思います。 次に、私なりの回答ですが、前提条件から、 「シート1」(「一番左端のシート」、という意味で、名前そのものには意味はありません。どのような名前でも結構です。)の 「A1」=「表1」 2行目は、項目名で、 「A2」=「会社名」、「B2」=「区分」、「C3」=「作業班」、「D3」=「工数」、「E3」=「金額」 「A4」以降にそれぞれのデータが入っているものとします。 「シート2」(「左端から2番目のシート」、という意味。同上)の 「A1」=「表2」 2行目は、項目名で、「シート1」と全く同じです。 という、前提条件の下で、以下のマクロを走らせると、結果が出ているはずです。 (サンプルデータを作り、実際に試しています。) Option Explicit Sub Test() Dim a As String Dim n(), c, i, r As Integer Dim k, t As Long Dim s1, s2 As Worksheet Set s1 = Worksheets(1) Set s2 = Worksheets(2) r = s1.Range("A3").End(xlDown).Row s1.Range(s1.Cells(3, 1), s1.Cells(r, 5)).Copy s2.Range("A3") s2.Range(s2.Cells(3, 1), s2.Cells(r, 5)).Sort Key1:=s2.Range("A3"), Order1:=xlAscending a = s2.Range("A3").Value c = 3 k = s2.Cells(c, 4).Value t = s2.Cells(c, 5).Value Do c = c + 1 If a = s2.Cells(c, 1).Value Then k = k + s2.Cells(c, 4).Value t = t + s2.Cells(c, 5).Value ElseIf a <> s2.Cells(c, 1).Value Then s2.Rows(c).Insert s2.Cells(c, 4).Value = k s2.Cells(c, 5).Value = t c = c + 1 a = s2.Cells(c, 1).Value k = s2.Cells(c, 4).Value t = s2.Cells(c, 5).Value End If Loop Until s2.Cells(c, 1).Value = "" End Sub 簡単なプログラムの説明です。 「r = s1.Range("A3").End(xlDown).Row」は「シート1」の「A」列の最終行が、何行目なのかを取得しています(この場合、途中に空白のセルがあってはいけません)。 「s1.Range(s1.Cells(3, 1), s1.Cells(r, 5)).Copy s2.Range("A3")」 「シート1」のデータのある範囲をコピー(記憶)して、「シート2」の「A3」セルを基点にペースト(貼り付け)しています。 「s2.Range(s2.Cells(3, 1), s2.Cells(r, 5)).Sort Key1:=s2.Range("A3"), Order1:=xlAscending」 今、貼り付けた内容を、「A」列をキーとして、ソートしています(これで、同じ会社が集まります)。 あとは、まず、「A3」セルの「会社名」を読み込み、次から次へと行を調べ、同じ「会社名」だった場合は、「工数」と「金額」を足していきます。 「会社名」がそれまでと変わった場合、1行挿入して、そこに、それまでの「工数」と「金額」の合計を出力。 と、このような処理を繰り返しています。 最後の判断は、「会社名」を読み込んでみて、セルの値が空白だった場合、すべての処理を終了しています。
その他の回答 (1)
- Prome_Lin
- ベストアンサー率42% (201/470)
回答No.1です。 すみません、試行錯誤の段階で「Dim n()」とやっていたのですが、最終プログラムでは不要でした。 4行目の「n(),」は削除しておいてください。 申し訳ありません。