• ベストアンサー

数量を足すマクロ

A列に商品名があり、B列に数量があります。 A列はあいうえお順に並んでいます。 A列には重複した商品名があり、重複した商品名の数量を足すことはできないでしょうか。 例 A---------B みかん   8 みかん   9 りんご   10    ↓ 結果として、 A----------B みかん   17 りんご   10 にしたいのですが、ずっと考えていても答えが導け出せないので質問しました。 よろしくお願いします。

  • caim
  • お礼率57% (67/116)

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

  • ベストアンサー
noname#31658
noname#31658
回答No.6

サンプルです。 シート1のA2~最終行を対象にD,E列に書き出します。 並べ替えは必要ありません。 Sub Test() Dim Dic As Object Dim i As Long Dim a As Long Dim b As Long Dim v As Variant Dim x As Variant With Worksheets("Sheet1")    v = .Range("A2", .Range("A65536").End(xlUp)) _           .Resize(, 2).Value End With Set Dic = CreateObject("Scripting.Dictionary") For a = 1 To UBound(v, 1)    If Not Dic.Exists(v(a, 1)) Then       i = i + 1       Dic(v(a, 1)) = i       v(i, 1) = v(a, 1)       v(i, 2) = v(a, 2)    Else       b = Dic(v(a, 1))       v(b, 2) = v(b, 2) + v(a, 2)    End If Next Worksheets("Sheet1").Range("D2:E2").Resize(i _               ).Value = v End Sub

caim
質問者

お礼

ご回答ありがとうございます。 早速、noname#31658様のサンプルを試してみます。 本当にありがとうございました。

その他の回答 (7)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.8

こんにちは。 少し、私の今回の#7 のマクロについて説明をさせていただきます。 このマクロは、某VBA専門掲示板で、数年前に、さまざまなアイデアが出たときに、私は、その時、出されたものを全て出して、時間計測して、これだと思ったものを提示しました。それを、今では「定番」と呼んでいますし、また、これは、ツール-マクロ-新しいマクロの記録 で作れるものです。 ご質問者さんが、タイトル行と範囲さえ決めてあれば、そのまま、何も考えなくてよいのです。 > Const flgTITLE As Boolean = False '1行目タイトル行False=ナシ,True=アリ > Const flgTITLE_REMAIN As Boolean = True 'タイトル行を残す=True, ナシ =False などと、持って回った書き方はしていますが、記録マクロは、どんなに頭をめぐらしても結果自体はそれほど変わりませんので、コマンド自体にお任せをしてしまってよいわけです。 しかし、これでは、本当は、記録マクロでは、VBAの練習にはなりませんね。練習用というのは、「For i = 1 to 行数終わり まで」で作っていきますが、こういう基礎練習もまた必要かと思います。その時に、記録マクロは、良い場合とそうではない=何もならない、ことがあります。 オートメーションの "Dictionary" オブジェクトを使ったもので、これは、だいたい、VBAを一通り卒業しないと、ちょっと厳しいわけで、それに比較すると、こちらのマクロは、初心者の方でも作れるということなのです。

caim
質問者

お礼

記録マクロで作成するよりもやはりVBAで構文などを一から考え、作成したほうが勉強になります。 ご回答ありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

こんばんは。#4 です。 一応、時間切れとして、実務用のものを出しておきます。 #2さんの書いたものを、そのままマクロにしました。実験してみると、この方法が一番速いはずです。しかし、データ1万件程度では、あまり差がありません。練習用は、あくまでも、ループで解決したほうがよいです。以下のようなものは、定番マクロで、考える必要はありません。 なお、Const のフラッグに関しては、あまり考えなくてよいです。特別なオプションにしたいときのみ必要になるだけです。 Sub SampleTotal()   Const flgTITLE As Boolean = False '1行目タイトル行False=ナシ,True=アリ   Const flgTITLE_REMAIN As Boolean = True 'タイトル行を残す=True, ナシ =False      Application.ScreenUpdating = False   With ActiveSheet     On Error Resume Next     .Range("A1").CurrentRegion.Columns("C:D").ClearContents     On Error GoTo 0     If flgTITLE = False And .Range("A1").Value Like "*項目*" = False Then       .Rows(1).Insert Shift:=xlDown       .Range("A1").Offset(0).Resize(, 2).Value = Array("項目", "個数")     End If     .Range("C1").Consolidate _     Sources:=.Range("A1").CurrentRegion.Address(1, 1, xlR1C1), _     Function:=xlSum, _     TopRow:=True, _     LeftColumn:=True, _     CreateLinks:=False     If flgTITLE = False And flgTITLE_REMAIN = False Then       .Rows(1).Delete     Else       .Range("A1").Resize(, 2).Copy .Range("C1")     End If   End With   Application.ScreenUpdating = True End Sub このほかに、配列のアルゴリズムで処理する方法やAdvancedFilter で、重複のない項目を出して、それで、SUMIF 関数を使う方法などがありますが、この方法が最も速いはずです。

caim
質問者

お礼

ご回答ありがとうございます。 マクロでの回答をお待ちしていましたので、とても助かります。 早速、Wendy02様の回答を使ってみたいと思います。 ありがとうございました。

noname#31658
noname#31658
回答No.5

定番ならDictionaryかAdvancedFilterでしょう。 大量データの場合はAdvancedFilterのほうが早いと思います。

caim
質問者

お礼

もう少し噛み砕いて回答してくださると嬉しいです。 何しろ知識がないもので……。 ご回答ありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。 それは、マクロの練習問題なのでしょうか? もしそうだとするなら、問題としては「暫定的にアリ」のような気がしますね。 この種の問題というのは、入門編として好んで出されるような気がします。(私は、こういうようなものは出しません。これが出来るぐらいなら、プログラムの経験がある人で、それほど苦労なく出来ます。) 問題の条件としては、 並べ替えられている、関数は使わない、記録マクロを使わない、ループを使う、結果は別のシートに出す、というところでしょうか? 入門編としては、もし、私が入門レベルの頃を思い出すと、正直言って、たぶん出来ないかもしれませんね。使うものは、単に、For ~ to のループを使うだけです。 しかし、マクロの勉強としては、10分考えて、頭の中で何もアイデアが生まれないようだったら、解答をみて、それを参考にしたほうがよいです。 実務的には、「統合」を使ってしまうように思います。ただし、「統合」は、同じ場所に貼り付けることは出来ません。 ずっと考えているなら、考えた途中まで出したほうがよいと思います。 そうでないなら、こちらは、そのままにしておきます。

caim
質問者

お礼

マクロの練習問題というか、仕事上でこういった処理をすることが多く、自動化を図れないものか、と考えていたのです。 しかしVBAについての知識が乏しく、いくら考えても構文エラーなどが出てしまい、さらにデバックなどの知識も不足しているため、質問した次第です。 ご回答ありがとうございました。

  • Nayuta_X
  • ベストアンサー率46% (240/511)
回答No.3

SUMIF の使用方法 例; データ配置が下記の場合 A B みかん  8 みかん  9 りんご  10 ・・・・・・・・・・・・・・ 追加した後 A B 1みかん  8 2みかん  9 3りんご  10 11みかん  12りんご  ・・・・・・・・・・・・・・・・・ 式を入れた後 11みかん  =SUMIF(A2:A4,A11,B2:B4) 12りんご  =SUMIF(A3:A5,A12,B3:B5) 注意; 左端の番号は、行番号です。 解説 11 みかん は、A11 で、式(=SUMIF(A2:A4,A11,B2:B4)は、B12です。 参考まで。

caim
質問者

お礼

例では記載できていなかった事項があり、SUMIF関数では回答が導き出せませんでした。 ですが、再度そのような関数があることを知り、とても役に立ちました。ご回答ありがとうございました。

  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.2

マクロを使わない方法を紹介します。  1) 1行目を挿入し、A1・C1セルに「項目」、B1・D1セルに「個数」と見出しをつける。  2) C1・D1セルを選択し、上部メニューから「データ」→「統合」を選択  3) 「集計の方法」は「合計」を選択     「統合元範囲」をA1B1以下のデータを選択し「追加」     「統合の基準」で「上端行」「左端列」にそれぞれチェックして「OK」 マクロの方法が知りたければ、質問を締め切らないで下さい。 すぐに誰かが回答してくれると思います。

caim
質問者

お礼

統合という使い方があるのを始めて知りました。 これはこの場面だけではなく、知っていると便利ですね。 ありがとうございます。 マクロの勉強中でもありますので、なんとかマクロでできないものか、と考えてしまいエクセルの機能自体について考えていませんでした。 ご回答ありがとうございます。

回答No.1

マクロまでつかわなくともsumif()で事足りるんじゃ?

参考URL:
http://kokoro.kir.jp/excel/sumif.html
caim
質問者

お礼

お礼が遅くなりすみません。 行数が1000行近くあり、品名も長く種類が多いのでSUMIF関数では無理だと思います。質問内容の不足で適切に質問できていませんでした。すみません。

関連するQ&A

  • エクセルVBA条件一致したとき数量加算

    はじまして。最近VBAを勉強するようになり、壁にぶつかりました。      A      B     C    商品名    金額   数量 1   りんご     100    1 2   みかん    110      2 3    りんご    120      1 4   ぶどう     200     3 5     このような表にユーザーフォームを使い入力したいのですが (ユーザーフォームには商品名、金額、数量を入力するテキストボックスがあります。) 例えば次に「りんご 100(金額)  2(数量)」 と入力したときに、セルC1の数値が3になるようにしたいのです。 ようは商品名、金額の両方が一致したときにはそのあてはまる列の数量に加算し、 そうでない場合は下の5列に入力したいのですが、どうすればいいでしょうか。 初めての質問なのでわかりにくかったらすいません。

  • エクセルで同じ名前のものの数量を足したい

    表をまとめる作業をやっていて、同じ名前のものの数量を足して1行にしたいです。 初心者なので全くわかりません! A     B みかん   1 みかん   3 みかん   2 りんご   4 りんご    2 となっているものを A     B みかん   6 りんご   6 にするにはどのようにすればいいでしょうか???

  • エクセル 最大値データのある行のみを残したい。

    表題の質問をさせていただきます。よろしくお願いいたします。 A列には商品名 B列には販売数があるとします。 商品には一回しか出てこない物や何度も出てくるものがあります。 そこで、販売数が最大値のみの重複しない商品データにする方法をお聞きしたいのです。 できれば非表示的な処理ではなく不要行削除が望ましいです。 例 下の場合 りんご 3(重複商品の最大値) みかん 5(単独商品) りんご 1 バナナ 6(単独商品) りんご 2 イチゴ 2(重複商品の最大値) イチゴ 1 ↓にしたいのです。 りんご 3 みかん 5 バナナ 6 イチゴ 2 よろしくお願いいたします。

  • エクセル マクロ

    以下の処理を教えて頂ける方がいらっしゃいましたらご教示ください。 A - B - C - D - E 日付 - 商品名 - 単価 - 数量 - 金額 a41 - バナナ - 120 - 10 - 1,200 a42 - みかん - 110 - 20 - 2,200 a42 - りんご - 150 - 10 - 1,500 a42 - バナナ - 120 - 15 - 1,800 a42 - なし - 150 - 20 - 3,000 a51 - りんご - 150 - 30 - 4,500 a51 - バナナ - 120 - 25 - 3,000 a51 - なし - 160 - 20 - 3,200 a52 - りんご - 145 - 35 - 5,075 a52 - みかん - 120 - 40 - 4,800 a53 - バナナ - 115 - 25 - 2,875 上記、シート1のデータが、3000行あります。 A - B - C - D - E 日付 a42 a52 上記、シート2のデータが、150行あります。 A - B - C - D - E 日付 - 商品名 - 単価 - 数量 - 金額 a42 - みかん - 110 - 20 - 2,200 a42 - りんご - 150 - 10 - 1,500 a42 - バナナ - 120 - 15 - 1,800 a42 - なし - 150 - 20 - 3,000 a52 - りんご - 145 - 35 - 5,075 a52 - みかん - 120 - 40 - 4,800 シート3に上記データのように抽出するには、どうすればよろしいでしょうか。 オートフィルタで,抽出後、抽出範囲をシート3にコピー貼り付けを繰り返しているのですが、もっといい方法(VBA)で、できませんでしょうか。

  • あるセルの文字列が条件で、あるセルに色を設定するには?(2)

    例えば、下のような表で      A      B      C       D      1   商品名   数量     名前    2   りんご     2     さとう 3   みかん     1     さとう     3 4   ぶどう     1     すずき 5   ばなな     2     すずき     3 6   みかん     3     たなか 7   りんご     2     たなか 8   ぶどう     2     たなか     4 「みかん」という商品名の時だけ、C列の重複している名前の一番下のセルに、黄色を設定したい場合は、どうしたらよいのでしょうか? つまり、セルC3とC8に色をかけたいのです。不可能でしょうか(-_-;)ちなみにD列は、重複している名前の一番下の行に合計が出る関数が入っています。一番下が難しいなら、みかんの商品があるうちの重複している名前(さとう・たなか)すべてに色がついてもかまいません。 どなたかいい方法があれば教えてください。よろしくお願いします(>_<)

  • VBA 1年間売上トータルをマクロで集計

    A(エリア) B(日付)  C(商品)  D金額 東京   2009/09    みかん    210 東京   2011/09    みかん    210 大阪   2011/06    りんご    150 東京   2011/07    りんご    200 東京   2011/08    みかん    170 大阪   2011/10    みかん    140 東京   2011/11    みかん    110 東京   2012/03    みかん    190 大阪   2012/04    りんご    200 東京   2012/05    りんご    220 【やりたいこと】 1年間のりんごの売上とみかんの売上のトータルをマクロで 計算したいと思っています。 一年間の区切りは、期初(スタート)月:6月 締め月:5月です。 ただし、1年間といっても指定した日付までのトータル金額を出したいのです。 例1)InputBoxで「2012/04」と入力した場合は B列の「2011/06」~「2012/04」かつC列がりんごの金額の総合計を出す。 というようなイメージです。 例2)InputBoxで「2011/06」と入力した場合は B列の「2011/06」~「2011/06」かつC列がりんごの金額の総合計を出す 例3)InputBoxで「2010/02」と入力した場合は B列の「2009/06」~「2010/02」かつC列がりんごの金額の総合計を出す 恐れ入りますがどたなかご教示頂ければ幸いです。 どうぞよろしくお願い致します。

  • 複数の重複する文字を一つのセルにまとめて計算するには?

    エクセルにて重複する文字をまとめて、その値を計算したいのですが、 中々うまくいかなく困っております。        A      B        E     F  1|リンゴ| 50円|    |りんご| 150円|  2|みかん| 50円|    |みかん| 250円|  3|ぶどう| 400円|→   |ぶどう| 400円|  4|みかん| 200円|  5|りんご| 100円| 上記の表(A,B)の様にランダムに同じ商品名と価格が表示されています。 Eには重複する商品名をまとめて表示し、Fにはその重複商品の合計の数字を計算して表示したいのですが、何か良いアドバイスは無いのでしょうか? ※条件は、A列は常に同じ商品名ではなく変更する事があります。マクロには商品名そのものは使えません。 ※商品名(A)と価格(B)は「品名・価格登録シート」という別なシートから取得しております。 ※マクロでの処理でも何でも良いですので何卒ご教授宜しくお願い致します。

  • エクセルで別の行に並んだ重複データをチェックしたい

    ネットで色々調べてはみたのですがやり方がいまいち見つからずどなたかお力添えいただけると幸いです 同じ行にならんでいるデータ内で重複するものを見つける関数はわかったのですが 別の行に並んでいるそれぞれのデータで重複するものを見つけるやり方はありますか? 例)      A    B 1  みかん  りんご 2  みかん  ぶどう 3  りんご   もも 上記の場合、A3のりんごとB1のりんごが重複していますがこれを探したいのです ※A1のみかんとA2のみかんは含みません 不慣れな質問で大変恐縮ですが何卒よろしくお願いいたします

  • マクロでひとつのセルから複数表示したいです

    半年くらい前にこちらで回答いただいてすごく助かりました http://okwave.jp/qa/q8213128.html ただ、データが増えたからだと思いますが、ファイルを開くのも データが表示されるのも遅くなってしまい、 マクロを使って処理できないものかと調べてみましたが、 構文からどれを組み合わせたらうまく結果がでるのか 分かりません... マクロは、ほかのデータで、構文の本に載っているものを使ったりはしていますが... 詳しい方どうか教えてくださいよろしくお願いします。 データの内容ですが、エクセルのファイルが ”管理ファイル” ”商品一覧ファイル” の2個あり、 管理ファイルに入力すると、 商品一覧ファイルより検索して該当する部分を表示したいと思っています 商品一覧ファイルの中身は次のようになっています   A      B      C 1 分類番号 商品番号 商品名 2 F100    10      みかん 3        20      りんご 4 5 V500    10      にんじん 6         20      たまねぎ 7         30      かぼちゃ ・ ・ ・ 5000行ちかいデータがはいっています 管理ファイルには、 Aの列の日付とBの列の分類番号だけ手入力します。 Bの列に入力した分類番号で登録してある、 みかんとりんごが表示されるようにしたいです。   A    B      C 1 日付  分類番号 商品番号 商品名 2 7/30  F100    10     みかん 3              20     りんご 4 5 7/31  F100    10     みかん 6              20     りんご 7 8      V500    10     にんじん 9             20     たまねぎ 10            30     かぼちゃ ・ ・ 500行くらい入力したいです。 説明がうまくなくすみません。よろしくお願いします。

  • SQL文で表すには

    以下の表を用いてSQL文を作成しようと思ってるんですが、途中までしか思いつかないので、どなたかご教授のほうよろしくお願いします。 shohin shiire 商品番号 商品名 単価   仕入番号 仕入先名  0001 みかん 100     001  A 0002 りんご 200     002 B 0003 ぶどう 300     003   C tran 購入番号 商品番号 仕入番号 数量 1 0001 001 1 2 0001 002 2 3 0001 003 3 4 0001 001 4 5 0001 002 5 6 0002 003 6 7 0002 001 7 8 0002 002 8 9 0003 003 9 10 0003 001 10 11 null 0004 20 これを以下のように出力するためにはどのようなSQL文を書けばよいですか? 商品番号 商品名 仕入番号 仕入先名 数量 単価 金額  0001 みかん 001    A   5 100 500  0001 みかん 002    B   7 100 700  0001 みかん 003    C   3 100 300  0002 りんご 001    A   7 200 1400  0002 りんご 002    B   8 200 1600  0002 りんご 003    C   6 200 1200  0003 ぶどう 001    A   10 300 3000  0003 ぶどう 003    B   9 300 2700  0004 null 004   null   20 null null ここまでは正しいと思うのですが・・・ select shohin.商品番号, shohin.商品名, shiire.仕入番号,     tran.数量, shohin.単価, tran.数量 * shohin.単価 as 金額 よろしくお願いします。

専門家に質問してみよう