[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『複数項目での集計』(クロノ)
お世話様です。
他掲示板でも質問させていただいているのですが
マルチポストがOKということなのでこちらでも
質問させていただきます。
ご不快に思われた方、すみません。
お知恵をお貸しください。
ちょっと仕事で行き詰ってしまいました。
SHEET1の
A列に商品名
G列に在庫の有無(数字の1と2で表しています)
H列に販売先が入っています(これも1〜8数字で表されています)
AAA 1 5
BBB 2 7
CCC 1 4
AAA 2 6
BBB 1 7
CCC 2 2
SHEET2に
商品名別にG列内の1と2それぞれのデータ個数と販売先のデータ個数を出したいです。
商品 1(有) 2(無) 1(販売先) 2 3 4 5 6 7 8
AAA 1 1 1 1
BBB 1 2
CCC 2 1 1
分かりにくくてすみません。
ご理解いただけたでしょうか?
現在は手作業でちまちま集計をしているので
なんとかマクロで出来るようになりたいです。
よろしくお願いします。
因みにエクセルは2003でOS は WINDOWS XPです
他掲示板でもマルチポストはOKなの?
・・・まぁ一応。関数だけど
Sheet2
B2 =SUMPRODUCT((Sheet1!$A$1:$A$100=$A2)*(Sheet1!$G$1:$G$100=B$1)) C2にコピー。
D2 =SUMPRODUCT((Sheet1!$A$1:$A$100=$A2)*(Sheet1!$H$1:$H$100=D$1)) K2までコピー
C2:K2 下へコピー。
(GobGob)
マルチポスト先は下記のOffice TANAKAさんなんでマルチポストはOKですね。
http://officetanaka.com/patio/patio.cgi?mode=view&no=3280
(マルチーズ)
もともとの質問はマルチポスト先で解決済み。 現在は追加質問を行っている模様。
結局こちらの回答は放りぱなしで典型的(悪い意味で)なマルチポストだったな。 (マルチーズ)
御礼遅れまして申し訳ございません。
ありがとうございます。
関数だとこうなるのですね!勉強になります。
マルチーズ様
アドレス表記、ありがとうございます。
僕のほうで対応が遅れたため、ご不快にさせてしまい申し訳ございません。
上記にて既にマルチポスト先をご案内いただいておりますが、ご本人様の了解をいただきましたので
こちらにも念のため教えていただいたコードを記載しておきたいと思います。
お名前記載については確認を取っていなかったので(汗)
ご興味のある方はマルチーズ様の記載リンクよりご確認ください。
***************************************
こんにちは〜
[Sheet1]
A G H
商品名 在庫有無 販売先
AAA 1 5
BBB 2 7
CCC 1 4
AAA 2 6
BBB 1 7
CCC 2 2
のように、
1行目は列見出しだと仮定して、処理手順としては
(1) Sheet2 のA列に Sheet1 A列の商品名のユニークなリストを書き出す.
(2) Sheet2 A列のソート
(3) Sheet2 A列の商品名順に Sheet1のA列から一致する商品名の行をみつけ、
G列が1なら Sheet2 の第2列の集計、2 なら Sheet2 の第3列の集計
H列の値が 1〜8 であれば その値に +3した列の値を +1 する.
と、こんなことをしていけばいいと思いますが、
(1)の処理は 一般機能のフィルタオプションで 重複データのカットをして抽出すれば
できます。
(3)の処理は セル上でちまちまやると画面がチラつくので、商品数×10列 の集計用
配列をメモリ内に用意して、そこで集計します。(集計した最後に、シートに
戻します)
「ある商品が出力用配列の何行目のデータか」は dictionaryオブジェクトを使って
商品名と出力行番号の対応表を作っておけば、検索は各商品について一回で済みます。
★ 事前に Microsoft Scripting Runtime への参照設定が必要です。
Sub Try1()
Dim r1 As Range
Dim r2 As Range
Set r1 = Worksheets("Sheet1").Range("A1").CurrentRegion.Columns(1)
Set r2 = Worksheets("Sheet2").Range("A1")
r2.Worksheet.UsedRange.ClearContents
'Sheet1のA列のユニークな商品名を Sheet2 A列にリストする
r1.AdvancedFilter xlFilterCopy, CopyToRange:=r2, Unique:=True
Set r2 = r2.CurrentRegion
r2.Sort Key1:=r2, Header:=xlYes '商品名でソート
Dim i As Long
Dim c As Range
Dim dic As Dictionary
Set dic = New Dictionary
'ユニークな商品名をdicのキーに登録(Headerを除く)
For Each c In Intersect(r2, r2.Offset(1))
i = i + 1
dic.Add c.Value, i 'dicのアイテムに出力行番号をおぼえておく
Next
ReDim a(1 To dic.Count, 1 To 10) '出力用配列を用意
Dim j As Long
For Each c In Intersect(r1, r1.Offset(1))
i = dic(c.Value) 'dictionaryに覚えてある その商品名の行番号
Select Case c(1, 7).Value 'G列データ処理
Case 1: a(i, 1) = a(i, 1) + 1
Case 2: a(i, 2) = a(i, 2) + 1
End Select
j = c(1, 8).Value 'H列データ処理
Select Case j
Case 1 To 8
j = j + 2
a(i, j) = a(i, j) + 1 'H列データは配列a のj+2列でカウント
End Select
Next
r2.Item(2, 2).Resize(dic.Count, 10).Value = a 'Sheet2[B2]セル以降に 配列内容を貼り付けます
r2.Item(1, 2).Resize(, 10).Value = Array("在庫あり", "在庫なし", 1, 2, 3, 4, 5, 6, 7, 8) '見出しを書き込みます
Set dic = Nothing
End Sub
**********************************************
(クロノ)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.