エクセルで○段ずつ集計する方法

このQ&Aのポイント
  • エクセルで伝票印刷をするために、3段ずつ集計する方法を教えてください。
  • 例えば、下記のシート1のDBをシート2へ3段ずつ集計する方法について教えてください。
  • シート2では、購入者、品名、数量、単価の情報を3段ずつまとめて表示し、小計も計算されます。
回答を見る
  • ベストアンサー

エクセルでで○段ずつ集計する方法を教えてください。

エクセルで伝票印刷をするため、3段づつ集計する方法がありましたら教えてください。 たとえば、下記のsheet1のDBをsheet2へ集計する感じです。宜しくお願いします。 sheet1(DB)    A      B    C    D     購入者   品名 数量  単価 1  ああ   かか  3  100円 2  ああ    きき  6  150円  3  ああ    くく  8  100円 4  ああ    けけ  3  250円 5  いい    きき  4  150円 6  いい    けけ  6  250円 7  うう    くく  8  100円 8  ええ    きき  6  150円 sheet2(sheet1を3段づつ集計)    A   B  C   D     購入者  品名 数量  単価 1  ああ    かか  3  100円 2        きき  6  150円  3        くく  8  100円 4  小計     17  2300円  5  ああ    けけ  3  250円 6 7 8  小計        3  250円 9  いい    きき  4  150円 10 いい    けけ  6  250円 ・  ・     ・  ・   ・ ・  ・     ・  ・   ・ ・  ・     ・  ・   ・

質問者が選んだベストアンサー

  • ベストアンサー
  • pauNed
  • ベストアンサー率74% (129/173)
回答No.4

こんにちは。 一例です。地道にやるという方針なら、それほど難しくはありません。 Dim ck As String '改ページチェック文字を格納する変数 Dim i As Long  '行Loopカウント用 Dim n As Long  '挿入行カウント用 With Sheets("Sheet2") 'Sheet2に対する処理   i = 2  'データが始まる行。(項目行以外)   n = 3  '挿入行が最大3行なので。   ck = .Cells(i, 1).Value  'まずA2セルの値を最初のチェック文字とする。      Do     i = i + 1     'A3セルから下にLoopしながら、セルの値がチェック文字と違うor3行ごとという条件で行挿入。     If (.Cells(i, 1).Value <> ck) Or (n = 1) Then       .Rows(i).Resize(n).Insert       '行挿入により、Loop中のセル行が変わったため、挿入した行数を加算。       i = i + n       '1つ上の行に計算式を入れる。       With .Cells(i - 1, 1)         .Value = "小計"         .Offset(, 2).Resize(, 2).FormulaR1C1 = "=sum(r[-3]c:r[-1]c)"       End With       '挿入最大行数に再設定。       n = 3       '比較文字を再設定。       ck = .Cells(i, 1).Value     Else       '挿入条件に合わなかったら、A列セル値をクリア。       .Cells(i, 1).ClearContents       '挿入行数をカウントダウン。       n = n - 1     End If   Loop Until Len(ck) = 0 End With Sheet1からSheet2にデータをコピーした後に実行しなければなりません。 必要であればコピーするコードを自分で書き加えるなど、工夫してみてください。 A列をLoopしながらデータの切れ目をチェックし、行挿入と同時に数式をセットします。 自分でメンテナンスできないと意味がないので、 VBEの[ローカルウィンドウ]を表示させて、 変数の中味を確認しながら[F8]キーでワンステップずつ実行し、 コードの理解に努めてください。 データ量はどれくらいなのでしょうね。 何千件ともなれば、配列を使ったほうが効率が良いのですが、 とりあえず理解できるところから始めてみましょう。

その他の回答 (3)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

#2の補足です エラーが出るのは、ユーザー定義型の配列を渡そうとするところでしょうか? Sub outputブロック(ブロックデータ() As 販売データ) とすると、 Dim ブロックデータ() As 販売データ をモジュールレベルで宣言(Dim outputRow As Longの後ろに)して、 Sub outputブロック() と、引数無しにして、当然サブルーチンを呼ぶところも引数なしにしてみたらどうでしょうか。 If i > 1 Then Call outputブロック() 当方、2003を試せるインフラが無いため、検証はできません。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

面白そうなので作成してみました。普段は変数名に全角文字は使用しないのですが、分かり易くするためにあえて使ってあります。Excel2000のコードです。2002以上(特に2007)で動くかどうかは分かりません。 とりあえず動けば良いというコードですので、識者の方々、突っ込まないでください。 Option Explicit Type 販売データ 購入者 As String 品名 As String 数量 As Long 単価 As Long 数量※単価 As Long End Type Dim outputRow As Long Sub test() Dim ブロックデータ() As 販売データ Dim i As Long, j As Long Dim last購入者 As String j = 1 last購入者 = "" outputRow = 1 For i = 1 To Application.WorksheetFunction.CountA(Sheets("Sheet1").Range("$a:$a")) If j = 4 Or Cells(i, 1).Value <> last購入者 Then If i > 1 Then Call outputブロック(ブロックデータ()) ReDim ブロックデータ(1 To 3) As 販売データ j = 1 End If With ブロックデータ(j) .購入者 = Sheets("Sheet1").Cells(i, 1).Value .品名 = Sheets("Sheet1").Cells(i, 2).Value .数量 = Sheets("Sheet1").Cells(i, 3).Value .単価 = Sheets("Sheet1").Cells(i, 4).Value .数量※単価 = .単価 * .数量 last購入者 = .購入者 End With j = j + 1 Next i End Sub Sub outputブロック(ブロックデータ() As 販売データ) Dim j As Long Dim 数量合計 As Long, 数量※単価合計 As Long For j = 1 To 3 With ブロックデータ(j) Sheets("Sheet2").Cells(outputRow, 1).Value = .購入者 Sheets("Sheet2").Cells(outputRow, 2).Value = .品名 If .数量 <> 0 Then Sheets(2).Cells(outputRow, 3).Value = .数量 If .単価 <> 0 Then Sheets(2).Cells(outputRow, 4).Value = .単価 数量合計 = 数量合計 + .数量 数量※単価合計 = 数量※単価合計 + .単価 * .数量 End With outputRow = outputRow + 1 Next j Sheets("Sheet2").Cells(outputRow, 1).Value = "小計" Sheets("Sheet2").Cells(outputRow, 3).Value = 数量合計 Sheets("Sheet2").Cells(outputRow, 4).Value = 数量※単価合計 outputRow = outputRow + 1 End Sub 実行例です ああ    かか    3    100 ああ    きき    6    250 ああ    くく    8    100 小計          17    2600 ああ    けけ    3    250 小計          3    750 いい    きき    4    150 いい    けけ    6    250 小計          10   2100 うう    くく    8    100 小計          8    800 小計が質問と合わないのですが、考え方がちがうのかな? 配列を引数にするやり方を忘れていて、手こずりました。 コードの解説はご容赦下さい。

wasabi033
質問者

お礼

返事が遅くなって申し訳ありません。 試したところ、excel2003、2007でパブリックユーザー定義エラーがでて動かなそうです。 この事例は長年の懸案でもあります。なんとか解決したいものですが・・・皆様のお力が頼りです。よろしくお願いします。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

エクセルでは(データ数に左右される)不定位置に(行番号に)数の小計を挿入するのは、非常に難しい(式が難しくなる)。エクセルの経験が少なくそういう経験をしてないのだろう。 関数では行挿入はできないから、式の上では全面的組み換えの考えになる。 関数以外で、VBAでなら、まだプログラムロジックが組みやすい。 VBAも経験ないのだろうから、困ったことだ。小計を別列にする,かつ上から詰めてというのは我慢できないかな。それでも難しそうだが。

wasabi033
質問者

お礼

回答ありがとうございます。 やはりVBAを組まないと無理なのでしょうか・・・ もし、出来るようなら教えていただけるとありがたいのですが。 宜しくお願いします。

関連するQ&A

  • エクセル関数でグループ単位に集計を行う

    エクセル初心者です。 入力伝票データを元に、集計シートに自動的に品名コード順の合計を作成したいのですが、うまくできません。 データシートのデータをソートせずに関数だけで出来る方法をお教えください。 ※エクセルはExcel2003を使用しています。 《データシート》例 [見出し] A1:年月日,B1:伝票番号,C1:品名コード,D1:数量,E1:単価,F1:金額 [データ] A2:2008/10/1,B2:Z-001,C2:S0001,D2:3,E2:1,000,F2:3,000 A3:2008/10/1,B3:Z-002,C3:S0002,D2:1,E3:2,000,F3:2,000 A4:2008/10/1,B4:Z-003,C4:S0003,D4:2,E4:3,000,F4:6,000 A5:2008/10/2,B5:Z-004,C5:S0002,D5:1,E5:2,000,F5:2,000 A6:2008/10/2,B6:Z-005,C6:S0001,D6:3,E6:1,000,F6:3,000 A7:2008/10/3,B7:Z-006,C7:S0003,D7:2,E7:3,000,F7:6,000 《集計シート》例 [見出し] A1:品名コード,B1:伝票数,C1:数量計,D1:合計金額 [集計値] A2:S0001,B2:2,C2:6,D2: 6,000 A3:S0002,B3:2,C3:2,D3: 4,000 A4:S0003,B4:2,C4:4,D4:12,000 ※品名コードは固定せず、データシートに入力されたものだけを集計したい

  • エクセルで集計

    エクセルで集計 シート1:A列に日付2000行程度、B列に品名A,B,C,D…500種類程度、C列にその内容。日毎に行は増えていきま、同じ品名が何度も登場してきます。 シート2:ここに新しくシート1の集計をして、同じ品名の多い順に並べ替えてリストを作成したいと思います。 シート1に新しく行が増えると同時にシート2の集計に反映させたいのですが、いい方法はありますか?

  • Excel集計方法を教えてください!

    以下のようなシートがあります。 シート(1) A列、B列、C列、D列、E列 品名、商品名、A店、B店、C店 --------------------- 果物、いちご、8個、7個、6個 果物、ぶどう、2個、8個、2個 野菜、大根、3個、3個、2個 野菜、人参、2個、5個、8個 野菜、白菜、1個、2個、0個 肉、牛肉、2個、5個、10個 それを、以下のシート(2)のように集計するには、 シート(2)の各B列、C列、D列にどのような数式を埋めればいいか教えてください!! シート(2) A列、B列、C列、D列 品名、A店、B店、C店 --------------------- 果物、10個、15個、8個 野菜、5個、10個、10個 肉、2個、5個、10個

  • アクセス クエリ・集計・計算方法について

    アクセスの集計機能を使用して、品名毎の数量の合計と金額の合計を算出しようとしていますが、 思うようにできません。どなたか教えてください。 クエリのフィールドを左から・・・ (1)年月: Format([日付],"yyyy/mm")(集計:グループ化) (2)品名(集計:グループ化) (3)品名のカウント(集計機能:カウント) (4)単価(集計:グループ化) (5)金額: [単価]*[品名のカウント](集計:グループ化) このような形でクエリを実行していますが、すべての注文が1つだけなら問題ないのですが、実際には品名には数量が掛けられている場合もあり、現在設定しているクエリ設定では正しい数量の合計と金額の合計を出すことができません。どうか集計方法をご教授いただけないでしょうか。よろしくお願いします。 ■現在のテーブルの設計とリレーションを明記します。 【A】顧客テーブル (1)顧客ID (2)発注コード (3)氏名 【B】商品テーブル (1)商品ID (2)品名 (3)単価 【C】注文テーブル (1)注文ID (2)日付 (3)顧客ID 【D】注文明細テーブル (1)注文明細ID (2)注文ID (3)商品ID (4)数量 リレーション 【A】(1)-【C】(3) 【B】(1)-【D】(3) 【C】(1)-【D】(2)

  • 集計方法を教えてください。

    複数シートのデータを集計用に作成したシートにデータをコピーしたい。 シート1(支店A)  2008/03/31 ノート 100  2008/04/20 乾電池 200 シート2(支店B)  2007/10/31 乾電池 200  2008/01/06 鉛筆  100 シート3(集計表) (品名) (営業所)(数量) (日付)  乾電池  支店A  200  2008/04/20       支店B  200  2007/10/31  鉛筆   支店B  100  2008/01/06  ノート  支店A  100  2008/03/31 ※集計表には、品名と営業所名のみが記載されているため「数量」と「日付」のみをコピーしたい よろしくお願いします。

  • SUBTOTAL関数の不思議

    SUBTOTAL関数で期待する合計が出せません。 A列   B列   C列   D列 品名   数量   単価   金額 A     1    100    100 B     2    200    400 C     3    300    900 小計               0 →ここが期待どおりでない D2セルの式は =IF(A2="品名",SUBTOTAL(9,INDIRECT("D$2:D"&ROW()-1)),B2*C2) でD5までコピーしました。 つまりA列が"小計"でないときは数量×単価を、"小計"と入力されていたらD2:D4をSUBTOTALで集計するつもりなのに結果が0になってしまいます。 ちなみにD5に =SUBTOTAL(9,D2:D4) と手入力しても結果は0でしたが、D列に金額を直接入力すれば小計は正しく表示されます。 理由がおわかりの方、教えてくださいませんか

  • エクセルにて伝票番号ごとに小計を出す方法

    エクセル上に日付・伝票番号・品名・数量・単価・金額(=数量*単価)等が平打ちしてあるデータがあるのですが、それを伝票番号ごとに小計を出す関数はあるのでしょうか?

  • 内訳書に明細書の小計を集計したい!

    以下のような見積書を作ったとします。 Sheet1 (内訳書)   (A) (B) (C) (1) 名称 内訳 金額 (2) ** ** ** (3) (4) (5) (6) : Sheet2 (明細書)   (A) (B) (C) (D) (E) (1) 名称 内訳 数量 単価 金額 (2) 施工費 ** ** ** =IF(B2="","",B2*C2) (3) (4) (5) (6) : E3以下に =IF(A3="小計",SUM(D$2:D2)-SUMIF(A$2:A2,"小計",D$2:D2)*2,IF(B3="","",B3*C3)) これで明細書の小計は行を気にせずに出せるようになりました。 たとえばSheet2(明細書)のA2に施工費、B6に小計でE6に小計が出るとします。 これをSheet2(明細書)のA列の名称をSheet1(内訳書)のA2に、小計(上記の場合E6)をC3に・・・ という風に順次名称と小計を抽出するにはどうすればよいでしょうか? 分かりにくくてすいません。 どうぞ、宜しくお願い致します。

  • エクセルで注文書→請求書を作っていて困っています。

    下記のような注文書がSheet1にあります。 A列  B列 C列  D列 E列 品名  数量 単位 単価  小計 りんご 1  個  100 ¥100 みかん 0  個   30 ¥ 0 バナナ 2 本  100 ¥200 スイカ 2  個 200  ¥400 メロン 0 個  300 ¥ 0      合計 ¥700 上表のような顧客が数量を入力すれば小計が出るとこまでは出来ています。 Sheet2に注文のあった品目のみで請求書を生成したいのですが、 良い方法がありましたら教えていただけますでしょうか。 A列  B列  C列  D列  E列 品名  数量 単位  単価  小計 りんご 1  個   100 ¥100 バナナ 2 本   100 ¥200 スイカ 2  個 200  ¥400       合計 ¥700 ※要するに品名のラインナップがある中で0個のものは飛ばして  上図のような形に自動生成できるものが希望です。 色々な関数を試してみましたが、結果関数の意味も分からずやっているので、 なかなか思うようにできなくて困っています。 どうぞ、良い方法がありましたらご教示の程、よろしくお願いいたします。

  • ExcelのVBAで集計をしたいです。

    EXCELで、VBAを使用して元データのシートから、集計シートを作成したいです。 Sheet1 A B C D E F 1 品名 サイズ1 サイズ2 サイズ3 元のサイズ 売り上げた量 2 A 1 100 150 200 1000 50 3 B 2 100 200 100 1500 10 4 A 2 200 300 500 2000 100 5 A 1 150 150 100 1000 80 6 A 2 150 150 600 3000 100 Sheet2(集計用に新規作成されたシート:作成時は空シート) A B C D 1 品名 サイズ1 元のサイズ 売り上げた量の合計 2 A 1 1000 130 3 B 2 1500 10 4 A 2 2000 100 5 A 2 3000 100 元のサイズのものがどれだけ使用されて売れたのかを集計しようとしています。 ちなみにサイズ1は変更されません。 条件が複数個になるので、Sheet2の合計は、SUMPRODUCTを使用することになると思うのですが、 C列までの、品名、サイズ1、元サイズが重複しないように抽出するためには、 どのようにしたらよいのでしょうか?

専門家に質問してみよう