- ベストアンサー
数量を足すマクロ
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
サンプルです。 シート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
その他の回答 (7)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 少し、私の今回の#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を一通り卒業しないと、ちょっと厳しいわけで、それに比較すると、こちらのマクロは、初心者の方でも作れるということなのです。
お礼
記録マクロで作成するよりもやはりVBAで構文などを一から考え、作成したほうが勉強になります。 ご回答ありがとうございました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。#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 関数を使う方法などがありますが、この方法が最も速いはずです。
お礼
ご回答ありがとうございます。 マクロでの回答をお待ちしていましたので、とても助かります。 早速、Wendy02様の回答を使ってみたいと思います。 ありがとうございました。
定番ならDictionaryかAdvancedFilterでしょう。 大量データの場合はAdvancedFilterのほうが早いと思います。
お礼
もう少し噛み砕いて回答してくださると嬉しいです。 何しろ知識がないもので……。 ご回答ありがとうございました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 それは、マクロの練習問題なのでしょうか? もしそうだとするなら、問題としては「暫定的にアリ」のような気がしますね。 この種の問題というのは、入門編として好んで出されるような気がします。(私は、こういうようなものは出しません。これが出来るぐらいなら、プログラムの経験がある人で、それほど苦労なく出来ます。) 問題の条件としては、 並べ替えられている、関数は使わない、記録マクロを使わない、ループを使う、結果は別のシートに出す、というところでしょうか? 入門編としては、もし、私が入門レベルの頃を思い出すと、正直言って、たぶん出来ないかもしれませんね。使うものは、単に、For ~ to のループを使うだけです。 しかし、マクロの勉強としては、10分考えて、頭の中で何もアイデアが生まれないようだったら、解答をみて、それを参考にしたほうがよいです。 実務的には、「統合」を使ってしまうように思います。ただし、「統合」は、同じ場所に貼り付けることは出来ません。 ずっと考えているなら、考えた途中まで出したほうがよいと思います。 そうでないなら、こちらは、そのままにしておきます。
お礼
マクロの練習問題というか、仕事上でこういった処理をすることが多く、自動化を図れないものか、と考えていたのです。 しかしVBAについての知識が乏しく、いくら考えても構文エラーなどが出てしまい、さらにデバックなどの知識も不足しているため、質問した次第です。 ご回答ありがとうございました。
- Nayuta_X
- ベストアンサー率46% (240/511)
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です。 参考まで。
お礼
例では記載できていなかった事項があり、SUMIF関数では回答が導き出せませんでした。 ですが、再度そのような関数があることを知り、とても役に立ちました。ご回答ありがとうございました。
- ka_na_de
- ベストアンサー率56% (162/286)
マクロを使わない方法を紹介します。 1) 1行目を挿入し、A1・C1セルに「項目」、B1・D1セルに「個数」と見出しをつける。 2) C1・D1セルを選択し、上部メニューから「データ」→「統合」を選択 3) 「集計の方法」は「合計」を選択 「統合元範囲」をA1B1以下のデータを選択し「追加」 「統合の基準」で「上端行」「左端列」にそれぞれチェックして「OK」 マクロの方法が知りたければ、質問を締め切らないで下さい。 すぐに誰かが回答してくれると思います。
お礼
統合という使い方があるのを始めて知りました。 これはこの場面だけではなく、知っていると便利ですね。 ありがとうございます。 マクロの勉強中でもありますので、なんとかマクロでできないものか、と考えてしまいエクセルの機能自体について考えていませんでした。 ご回答ありがとうございます。
- tux_the_penguin
- ベストアンサー率42% (69/163)
マクロまでつかわなくともsumif()で事足りるんじゃ?
お礼
お礼が遅くなりすみません。 行数が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列に入力したいのですが、どうすればいいでしょうか。 初めての質問なのでわかりにくかったらすいません。
- ベストアンサー
- Visual Basic
- エクセルで同じ名前のものの数量を足したい
表をまとめる作業をやっていて、同じ名前のものの数量を足して1行にしたいです。 初心者なので全くわかりません! A B みかん 1 みかん 3 みかん 2 りんご 4 りんご 2 となっているものを A B みかん 6 りんご 6 にするにはどのようにすればいいでしょうか???
- ベストアンサー
- その他(インターネット・Webサービス)
- エクセル 最大値データのある行のみを残したい。
表題の質問をさせていただきます。よろしくお願いいたします。 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)で、できませんでしょうか。
- ベストアンサー
- Visual Basic
- あるセルの文字列が条件で、あるセルに色を設定するには?(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列がりんごの金額の総合計を出す 恐れ入りますがどたなかご教示頂ければ幸いです。 どうぞよろしくお願い致します。
- ベストアンサー
- SE・インフラ・Webエンジニア
- 複数の重複する文字を一つのセルにまとめて計算するには?
エクセルにて重複する文字をまとめて、その値を計算したいのですが、 中々うまくいかなく困っております。 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行くらい入力したいです。 説明がうまくなくすみません。よろしくお願いします。
- ベストアンサー
- Excel(エクセル)
- 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 金額 よろしくお願いします。
- ベストアンサー
- Oracle
お礼
ご回答ありがとうございます。 早速、noname#31658様のサンプルを試してみます。 本当にありがとうございました。