• 締切済み

エクセル・マクロで、請求書番号ごとに集計する方法

請求書毎に集計した表をマクロで作りたいと思っています。 例えば、 取引先  請求書No  商品   売上 山田    0001   りんご  100   山田    0001   なし   200   山田    0001   みかん  300   鈴木    0002   りんご  100 鈴木    0002   バナナ  200 山田    0003   みかん  100   というデータがあるとします。 その場合 取引先  請求書No  売上 山田    0001   600 鈴木    0002   300 山田    0003   100 というように、請求書毎に、売上の合計と取引先名などが分かるように集計した表を作成したいと思っています。 請求書番号は、基本的には連番ですが、すこし飛ぶ可能性がありますし、 毎月、どのくらいの番号まで付番するのかははっきりしません。 また、請求書毎に、どれだけの種類の製品を出荷するのか(請求書毎に、何行になるのか)も不確定です。 ピポットですと、取引先名が表示されません。 また、所定の表を作って自動集計するというよりは、マクロで請求書毎に集計したほうが良いかと思っています。 基本的なコードや考え方を教えて頂けないでしょうか。 宜しくお願い致します。

みんなの回答

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.7

第三者さんからダメ出しが出ているのでコメントしておきます。 >エクセルのバージョンに依存した数字は使わない方が良いのではないでしょうか? ご相談者さんの「実際のエクセル」が6万件を超えるようなデータを処理している場合には、65536ではなくcells.rows.countを利用する必要があります。 ただし実用的には、そういった大規模データベースの処理を想定するのなら、抜本からやり直さないとお話になりません。ましてや1行ずつ総舐めしていくようなプログラムも問題外です。 現実的な想定範囲では、エクセルで「今回ご相談のようなデータ処理」ができるのはどんなに多くても数千件がいいところです。無駄にプログラムを作り込む必要は無いと思いますが、もちろん趣味の世界でrows.countにこだわるのはプログラマの自由です。また言わずもがなですが実際に仕事でそれを使う人は、ご自分が扱うデータ量をキチンと想定した上で適切なプログラムを作成しなければいけません。

promet
質問者

お礼

私もマクロに詳しいわけではないので、考え方が大変参考になります。

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.6

すみません! No.2です。 プログラム、間違っていました。 同じ人が集まっているときは合っているのですが、それ以外はダメでした。 直しましたので、よろしくお願いします。 なお、僭越(せんえつ)ながらNo.5の「keithin」さん、「lastrow = w.range("B65536").end(xlup).row」の「65536」というようなエクセルのバージョンに依存した数字は使わない方が良いのではないでしょうか? 私、今、エクセルVBAの勉強を始めたばかりで、ホント、こんなことを言うのは失礼なのですが、私が勉強しているサイトでは「Rows.Count」を使って、エクセルのバージョンに依存しないようにする旨、書かれていました。 「65536」は確か、エクセル2003ぐらいだと思いますが、「2007」以降は、もっともっと大きな数字です。 では、正しいプログラムです。 Option Explicit Sub Totalization() Dim e, p As Long Dim c, i, j, l As Integer e = Range("A1").End(xlDown).Row Range("F2").Value = Range("A2").Value Range("G2").Value = Range("B2").Value Range("H2").Value = Range("D2").Value l = 2 For i = 3 To e c = 0 For j = 2 To l If Cells(i, 2).Value = Cells(j, 7).Value Then c = 1 p = Cells(j, 8).Value p = p + Cells(i, 4).Value Cells(j, 8).Value = p Exit For End If Next j If c = 0 Then l = l + 1 Cells(l, 6).Value = Cells(i, 1).Value Cells(l, 7).Value = Cells(i, 2).Value Cells(l, 8).Value = Cells(i, 4).Value End If Next i End Sub

promet
質問者

お礼

ありがとうございます。私も初心者なので参考になります。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.5

>請求書毎に集計 その通りに作成してみます。 【準備】 元のシートの1行目にタイトル行、2行目からデータ、A,B,C,D列に取引先、請求書No、品名、売上が列記されている。 sub macro1()  dim w0 as worksheet  dim w as worksheet  dim LastRow as long ’抽出先シートを新調する  set w0 = activesheet  set w = worksheets.add(after:=w0)  w.range("A1") = w0.range("A1")  w.range("C1") = w0.range("D1") ’請求書Noを一覧にして抽出する  w0.range("B:B").advancedfilter action:=xlfiltercopy, copytorange:=w.range("B1"), unique:=true ’取引先、売上合計を計算する  lastrow = w.range("B65536").end(xlup).row  w.range("A2:A" & lastrow).formula = "=INDEX(" & w0.name & "!A:A,MATCH(B2," & w0.name & "!B:B,0))"  w.range("C2:C" & lastrow).formula = "=SUMIF(" & w0.name & "!B:B,B2," & w0.name & "!D:D)" end sub 元のシートを開いてマクロを実行する。

promet
質問者

お礼

ありがとうございます。年末年始忙しくてまだ試せていないのですが、このプログラムで何とかできると思います。 返事が遅くなりましたが、ありがとうございます。

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.4

回答No.3の「kagakusuki」さん、私、質問者ではありませんが、回答No.2の「Prome_Lin」です。 私には、難しいプログラムでしたので、コピーさせて頂き、勉強のため、実行してみましたところ、「Sheet2」の2行目に「請求書No:0001」の山田さんが、間違って存在しています。 取引先 請求書No 売上 山田   0001  100 山田   0001  600 鈴木   0002  300 山田   0003  100 こんな具合です。 一応、ご報告しておきます。 プログラム、勉強させて頂きます。

promet
質問者

お礼

いろいろ、ありがとうございます。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.3

 元データの表がどのシートのどのセル範囲に存在していて、それを集計した結果の表をどのシートのどのセル範囲に表示させれば良いのかという事が何も説明されておりませんので、取り敢えず仮の話として、元の表の中で「取引先」と入力されているセルがA2セルであり、その元の表があるシートを開いている状態でマクロを起動させると、集計済みの表がSheet2のA列~C列に出力されるようにするものとします。  その場合のVBAのマクロの一例は以下の様なものとなります。 Sub Macro() Const FirstRow = 2 Dim PasteSheet As Worksheet, LastRow As Long Set PasteSheet = Sheets("Sheet2") With PasteSheet .Cells.Delete ActiveSheet.Columns("A:D").Copy .Range("A1").Insert shift:=xlShiftToRight Application.CutCopyMode = False .Columns("C:C").Delete shift:=xlToLeft .Range("A" & FirstRow & ":C" & .Range("A" & Rows.Count).End(xlUp).row). _ RemoveDuplicates Columns:=Array(1, 2), Header:=xlYes LastRow = .Range("A" & Rows.Count).End(xlUp).row With .Range("C" & FirstRow + 1 & ":" & "C" & LastRow) .FormulaR1C1 = "=SUMIFS('" & ActiveSheet.Name & "'!C4,'" & ActiveSheet.Name & "'!C1,RC1,'" & ActiveSheet.Name & "'!C2,RC2)" .Value = .Value End With End With End Sub

promet
質問者

お礼

ありがとうございます。 参考にさせて頂きます。

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.2

前提条件としては、結果をF、G、H列に出力し、その1行目は項目行で、項目は入力済み、という前提でプログラムを組みました。 なお、出力先を指定して頂ければ、プログラムを直しますので、言ってください。 Option Explicit Sub Totalization() Dim e, p As Long Dim c, i, j, l As Integer e = Range("A1").End(xlDown).Row Range("F2").Value = Range("A2").Value Range("G2").Value = Range("B2").Value Range("H2").Value = Range("D2").Value l = 2 For i = 3 To e For j = 2 To l c = 0 If Cells(i, 2).Value = Cells(j, 7).Value Then c = 1 p = Cells(l, 8).Value p = p + Cells(i, 4).Value Cells(l, 8).Value = p Exit For End If Next j If c = 0 Then l = l + 1 Cells(l, 6).Value = Cells(i, 1).Value Cells(l, 7).Value = Cells(i, 2).Value Cells(l, 8).Value = Cells(i, 4).Value End If Next i End Sub

promet
質問者

お礼

ありがとうございます。

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.1

こんにちは セルA1から表があるとして セルE1にフィールド名として「グループ」などと入力して、 セルE2に =A2&" "&B2 と入力して下方にフィルコピーした表を小計で集計してはどうですか? グループの基準は「グループ」で、集計フィールドは「売上」で、 アウトライン2でまとめた表の可視セルをコピーして他のシートにコピーして 加工すればいいですし。 以上の作業をマクロに記録したコードを整理・修正すれば使いまわし出来ます。

promet
質問者

お礼

ありがとうございます。

関連するQ&A

  • エクセルの表の集計について

    エクセルの『集計』や『ピボットテーブル』を使わずに、関数でやる方法があれば教えてください。 1 名前  住所  りんご  みかん 2 山田 東京   1    3 3 鈴木 神奈川  3   8 4 佐藤 埼玉   4    10 5 山田 東京   5    5 6 佐藤 埼玉   6    5 とエクセルに表があるとします。 (7行目以降はデータが追加されるとします。) 別シートに下記のように名前ごとにりんご・みかんの数の合計を表に反映するようにしたいのです。 1 名前 住所  りんご  みかん 2 山田 東京   6   8 3 鈴木 神奈川  3  8 4 佐藤 埼玉   10  15 説明不足のところがありましたら補足いたしますので、お願いいたします。

  • エクセルの集計

    エクセルの集計で質問します。 A列に「りんご」か「みかん」が入っている行を集計したいと思っています。    A 1 りんご、なし 2 みかん、もも 3 りんご、みかん 4 ぶどう 5 りんご 6 ぶどう、もも 7 みかん という表があると、期待している集計値は「5」なのですが、どのような関数を使えばよいかわかりません。 よろしくお願いします。

  • エクセルの集計について

    エクセルの集計について 項目 単価 数量 合計 りんご 50 3 150 みかん 30 5 150 バナナ 80 4 320 みかん 30 3 90 りんご 50 6 300 りんご 50 2 100 バナナ 80 4 320 みかん 30 7 210 上記のような表で りんご 11 550 バナナ 8 640 というように、0以外のものを集計できますか?

  • 超初心者がマクロ集計をすることになりました

    マクロを使った集計システムを作成することになったのですが、マクロのマの字も知らない初心者です。 以下の表を集計するマクロを初心者向けで教えてください。 氏名        作業No   月No   時間内   時間外   社員No 山本太郎      3210      5     8      0      120 山本太郎      5120      8     8      12     120 山本太郎      3210      5     4      0      120 山田花子      1203      4     8      2      320 山田花子      3210      5     8      12     320 佐藤治郎      5201      10    8      8      91 佐藤治郎      3210      5     8      8      91 佐藤治郎      3210      5     8      12     91 という表があるとします。 これを、以下のようにしたい場合のマクロを教えてください。 氏名        社員No    作業No    時間内   時間外 山本太郎       120      3210-10    12       0 山本太郎       120      5120-8     8       12 山田花子      320      1203-4     8        2 山田花子       320      3210-5     8       12 佐藤治郎       91       5201-10    8        8 佐藤治郎       91       3210-10    16       20   ※作業Noと月Noのデータを“-”をつけて結合しています。 ※1人が同じ「作業No+月No」の作業を複数行っていたら、合計します。 すみませんが、よろしくお願いします。

  • VBAのマクロで、複数行を1行に集計

    お世話になります。VBA初心者です。 下記のような表があった場合、請求書番号が同じものをVBAで1行に集計するにはどうしたらよろしいのでしょうか? 請求書No.|顧客名|摘要|金額 111111  |鈴木 | A |100 111111 |鈴木 | S |160 222222 |佐藤 | F |500 555555 |山田 | A |150 555555 |山田 | D |200 888888 |鈴木 | S |160  ↓下記のように集計 請求書No.|顧客名|摘要|金額 111111 |鈴木 | A |260 222222 |佐藤 | F |500 555555 |山田 | A |350 888888 |鈴木 | S |160 摘要は各請求書番号の最初の行を使います。重複は2行とは限りません。また、最終的に何枚の請求書があるのかも計算させたいのです。ただしこれはどこかに関数"=counta()"を使えばVBAでなくても出来るのですが。 よろしくお願いいたします。

  • Excelで集計

    時間 商品 13:00 みかん 13:00 みかん 13:05 ぶどう 13:05 ぶどう 13:05 りんご 13:07 りんご 13:07 りんご 13:07 ぶどう Excelで上記のような表があった場合、各時間ごとに(売れた数ではなく)何種類のものが売れたかを集計したいと思っています。 (13:00では1種類、13:05では2種類、13:07では2種類といった感じです。時間に規則性はありません。) こういう目的に適した機能はないでしょうか?それともマクロを作成しないといけないでしょうか。 ちなみに、データは2000行ほどあります。 詳しい方、ご教授願います。

  • エクセルでの集計に関して

    こんにちは。いつもお世話になっております。 例えばですが、以下のようなCVSのデータがあります。 (エクセルで開けます。) 昇順 降順に変更可能です。 これが、何週間分かあり、タブがあって日にちごとに見れますが、 30件ほどの品目の、200件ほどのデータが50件ずつにのみ表示されます。 4/1分データ    品名   売り上げ数   りんご1  100    りんご2  200    みかん1  300    みかん2   400    バナナ1  500             次の50件→ -------------------------------------------- 4/2分データ    品名   売り上げ数   りんご1  1000    りんご2  2000    みかん1  3000    みかん2   4000    バナナ1  5000   バナナ2  6000   アボガド  7000   いちご   8000     次の50件→      ↓続く これを、エクセルで下記のようにしたいのです。 ********************************************** ID  品名    4/1分集計 4/2集計  4/3集計  4/4集計  4/4集計~~ A   りんご1  100   1000    300 B   りんご2  200   2000    400  C   みかん1  300   3000    500 D  みかん2   400   4000    600 E   バナナ1  500    5000    700 D  バナナ2        6000    800 E  アボガド       7000    900 F  いちご       8000    1000 日にちによって当然、新たな項目、アボガドやいちごがあったりします。みなさんでしたら、最速で一番簡単に行う為にどうしますか? ちょっといそいでてお知恵をどなたか下さい! ご教授下さいますようお願い致します。

  • エクセルの集計について質問です。

    いつもお世話になっております。 集計を使用しないで関数やマクロを使用して計算することは可能でしょうか? こういったリストを 名称 1日 2日 3日… りんご 1  0  3 りんご 0  0  1 みかん 1  1  4 なし   0  0  2 みかん 1  0  0 こんな感じに集計したいのです。 名称 1日 2日 3日… りんご 1  0   4 みかん 2  1   4 なし   0  0   2 順番とかは特に拘っておりません。 宜しくお願い致します。

  • Excelで名寄せしてデータ個数を集計する方法

    このような表があります。 001 山田 001 山田 002 鈴木 003 田中 004 高橋 004 高橋 005 鈴木 005 鈴木 005 鈴木 006 高橋 007 鈴木 008 鈴木 この名前(「山田」等)を基準にして名寄せをし、かつデータ個数を集計しなくてはなりません。 普通に集計をすると、 001 山田 001 山田 山田 データ個数 2 002 鈴木 鈴木 データ個数 1 003 田中 田中 データ個数 1 004 高橋 004 高橋 高橋 データ個数 2 005 鈴木 005 鈴木 005 鈴木 鈴木 データ個数 3 006 高橋 高橋 データ個数 1 007 鈴木 008 鈴木 鈴木 データ個数 2 ・・・という具合になりますが、番号(001等)の枠を超えて名寄せしたいのです。 希望する集計結果としては、 001 山田 001 山田 山田 データ個数 2 002 鈴木 005 鈴木 005 鈴木 005 鈴木 007 鈴木 008 鈴木 鈴木 データ個数 6 003 田中 田中 データ個数 1 004 高橋 004 高橋 006 高橋 高橋 データ個数 3 ・・・という表示になるようにしたいのです。(番号も必要データなので消去せずに残したいです) 今までは、番号&名前レベルでまず集計し、あとは検索して同じ名前があればカット&ペーストという非常に面倒な作業をマニュアルでしてきました。 何かもっと楽にできる方法をご存知の方はぜひ教えてください。

  • エクセル 集計について

    エクセル2003で表1を表2に集計する方法が分からず困っております。 ~表1~ アイテム 単価 販売量  リンゴ  100  5 リンゴ  80   5 リンゴ  100  1 ミカン  50   3 スイカ  100   0 ~表2~ アイテム 単価 販売量 リンゴ  100  6 リンゴ   80  5  ミカン   50  3 表1からアイテム名と単価が同じものをまとめて表2に出したい。 例)表1ではミカン 単価100 が販売数5と1があるが表2ではまとめて6で表記されている。 また販売量が0のものは表2に反映されないようにしたいです。 例)スイカは表1には記載されているが販売数が0なので表2では記載されない。 IF関数でうまく処理できないでしょうか? どうぞ宜しくお願い致します。

専門家に質問してみよう