アプリ版:「スタンプのみでお礼する」機能のリリースについて

VBA初心者です。
Excel2010を使用しています。
よろしくお願いします。

sheet1はデータが入力されているシートです。
1行目はタイトル行、
データは2行目から入力されています。
BG列が品名、CX列が単価です。

品名ごと単価ごとに集計して
sheet2に集計するマクロを教えて下さい。

sheet2は1行目はタイトル行で、入力は2行目、
A列から順に品名、単価、数量、金額です。

よろしくお願いします。

質問者からの補足コメント

  • d-q-t-p様

    マクロで、品名ごとの個数を数えて
    合計金額を集計する方法は理解しています。
    ここに、単価別という条件を加えると
    分からなくなってしまうため、
    質問いたしました。

    品名は、例えば「りんご」や「みかん」で
    単価は「50」「100」「150」など
    複数ありますが、無限ではありません。

    知りたいことは「りんご」のうち
    「50」は何個、「100」は何個、
    「150」は何個かということでした。

    ご回答ありがとうございました。

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/07/25 13:33
  • fujillin様

    こんにちは。
    ご回答ありがとうございます。

    やりたいことは、納品明細書の作成です。

    りんご 50
    みかん 50
    りんご 150
    りんご 100

    のように順不同で並んでいるデータを
    下記のように表示(集計)したい、です。

    りんご 50円 3個 150円
    りんご 100円 5個 500円
    りんご 150円 2個 300円
    みかん. 50円 7個 350円
    合計 1300円

    既に関数で集計するようにしてありますが、
    イレギュラーな単価が発生することがあるため
    見落とす可能性があること、
    データは週ごとに完全にリセットされること、
    そのため個数がゼロで項目だけが残ると
    分かりづらいこと、
    他にも何種類か、マクロで明細を
    出力できるようにしたため
    一緒に納品明細書も作成できると良いなと思って
    ご相談いたしました。

    No.3の回答に寄せられた補足コメントです。 補足日時:2017/07/25 17:38

A 回答 (4件)

集計のキーを品名ではなく「品名+単価」で行うようにしました。


連想配列を使います。キーは、厳密には、品名+タブ+単価です。
Sheet1へ出力時には、キーを品名と単価にわけて取り出すようにします。
標準モジュールへ以下のマクロを登録してください。
---------------------------------------------------------------------
Option Explicit
Public Sub 品名単価集計()
Const delm As String = vbTab
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim maxrow As Long
Dim row As Long
Dim dicT As Object '連想配列 キー:品名+タブ+単価 値:個数
Dim key As Variant
Dim elm() As String
Dim tanka As Variant
Set sh1 = Worksheets("Sheet1")
Set sh2 = Worksheets("Sheet2")
Set dicT = CreateObject("Scripting.Dictionary") '連想配列
maxrow = sh2.Cells(Rows.Count, "BG").End(xlUp).row 'Sheet2のBG列の最大行取得
'2行~最終行まで繰り返す
For row = 2 To maxrow
key = sh2.Cells(row, "BG").Value & delm & sh2.Cells(row, "CX").Value
'品名+単価で個数を管理する
If dicT.exists(key) = True Then
dicT(key) = dicT(key) + 1
Else
dicT(key) = 1
End If
Next
sh1.Rows("2:" & Rows.Count).ClearContents 'Sheet1の2行目以降をクリア
row = 2
For Each key In dicT
elm = Split(key, delm)
sh1.Cells(row, "A").Value = elm(0) '品名
sh1.Cells(row, "B").Value = elm(1) '単価
sh1.Cells(row, "C").Value = dicT(key) '数量
sh1.Cells(row, "D").Value = dicT(key) * sh1.Cells(row, "B").Value '金額
row = row + 1
Next
sh1.Range("A1").Sort key1:=sh1.Range("A1"), key2:=sh1.Range("B1"), Header:=xlYes
MsgBox ("完了")
End Sub
    • good
    • 0
この回答へのお礼

助かりました

tatsu99様

無事に動きました。
ありがとうございました。

前回、教えていただきました
Dictionaryを使うと予想して
(複数条件での重複チェックを質問した者です)
「品名+単価」で作成していましたが
分離の仕方が分からなくてずっと悩んでいました。

根本的に、このような場合のシートをまたいだ
出力の仕方もよく分からなかったため
実際にコードを見て勉強になりました。

また壁にぶち当たった時はよろしくお願いします。

お礼日時:2017/07/26 17:51

こんにちは



なさりたいことがいまいちわかりませんが、エクセルは表計算ソフトなので、簡単な集計程度であれば関数式などを設定しておく方が、結果が即時に反映できて便利なことが多いと思います。

なんとなくの雰囲気では、元データのシートから条件に合う項目数を集計したいように感じましたので・・・
例えば、集計用シートに以下の様な表を作成して、
     50 100 150
りんご
みかん
もも
ぶどう

表内の各セルに関数式をオートフィルすれば、それぞれの個数を一気に集計することが可能です。(ご質問を理解していないので、違っているかも知れませんが・・)
具体的には、COUNTIFS関数やSUMPRODUCT関数を利用することで、複数条件に合った項目数を集計することができます。
(セル位置や値の内容(質)がわからないので、実際の関数式は示せません。)


もちろんマクロでも処理は可能と思いますが、No1様もおっしゃっているように、情報が不足しているのと「何故」かが不明ですね。
というのも、「何故」の部分に使い方の上での条件とか、処理方法上の制約などが隠されている場合も多いのです。

それ以外では「何故」は特に大きな影響にはなりませんが、例えば、マクロの練習を兼ねて作成したいのであれば、まずはご自身で作成してみることです。
作成してみれば(完成できなくとも)、作成するのに最低でもどのような情報が必要で、どのような情報は無くても良いのかが整理できるはずです。
(多くの質問で、質問者様の思う情報しかなく、実際には情報不足のものが多いのも事実です)

これによって、同じ質問をするにしても、説明の内容や手順も変わってくるはずと思いますし、ご自身がわからないところもはっきりしてくるので、より具体的な質問ができるようになり、的確な回答を得られる可能性も増加することと思います。
この回答への補足あり
    • good
    • 0

> ここに、単価別という条件を加えると


> 分からなくなってしまうため、
それなら今のコードを提示して下さい。その方が早いです。
ついでに添削もしてもらえるでしょう。

> 知りたいことは「りんご」のうち
> 「50」は何個、「100」は何個、
> 「150」は何個かということでした。
繰り返しになりますがピボットテーブルでやらない理由はなん
ですか? 「品名」「単価」別の「データの個数」ですよね。
    • good
    • 0

> sheet2に集計するマクロを教えて下さい。


初心者だと自分で書いているのですから まずは自分でやってみて下さい。
最初から人に作ってもらうようなのは 初心者でも何でもないでしょう。
さっぱり分からない人にマクロは無理です。まずは勉強して下さい。

そもそも 何故マクロが必要なのですか?
ピボットテーブルではできないことなのですか?

いずれにしてもこの説明でマクロを組むことはできません。何故なら肝心
なことが説明されていないからです。何を「集計」するのですか?

入力表にはどんな風に入力されているのでしょう。単価が変動する商品な
のかどうかすら分かりません。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!