Excel VBA ではないですが,ピボットテーブルはやりたいことに近そうだなと思いました.
条件が一致した場合に商品名ごとに合計を表示する方法
解決したいこと
EXCELのVBAにて2条件が一致したときに合計を表示する方法を探しております。
1111 aaa 100 1
2222 bbb 100 1
3333 ccc 100 1
4444 ddd 100 1
5555 eee 100 1
1111 aaa 200 2
2222 bbb 200 2
3333 ccc 200 2
4444 ddd 200 2
5555 eee 200 2
1111 aaa 300 1
2222 bbb 300 1
3333 ccc 300 1
4444 ddd 300 1
5555 eee 300 1
四列目が1の時に一列目のナンバーをキーとして二列目の商品名と三列目の合計を表示させたいです。
aaa 400
bbb 400
ccc 400
ddd 400
eee 400
という結果を表示させたい。
発生している問題・エラー
計算結果の表示が出ない。数式の組み合わせ方が不明
または、問題・エラーが起きている画像をここにドラッグアンドドロップ
該当するソースコード
ソースコードを入力
自分で試したこと
SUMIF 複数条件にて検索しましたが、これといったものが見つかりませんでした。
sumifsも試しましたが、一列目のナンバーをキーとしてというところで引っかかっております。
3Answer
「1列目をキーに」というのがいまいちわかりませんが、2列目から重複なしのリストが得られればよいのでしょうか?
それであれば以下のように解決することもできるかと思います。
G1「=B1」
G2「{=VLOOKUP("*",IF(COUNTIF(G$1:G1,$B$1:$B$21)=0,$B$1:$B$21),1,FALSE)}」
G3から下はG2をコピペ
H1「=SUMIFS($C$1:$C$15,$D$1:$D$15,"=1",$B$1:$B$15,G1)」
H2から下はH1をコピペ
G列の数式の意味が知りたければ以下サイトを参考にしてください。
http://mt-soft.sakura.ne.jp/kyozai/excel_high/230_special/08_no_duptable.htm
もしOffice365版のExcelを使用されているのであれば、G列はG1に「=UNIQUE(B1:B15)」で済みます。
SUMIF/SUMIFSを試した、ということからVBAより関数による解決がよいのかなと思いました。
他の方が書かれている通り、ピボットテーブルを使うべきです。
あえてVBAでやるならこんな感じですかね
Sub Test()
Dim i As Long
Dim DicMain As Object: Set DicMain = CreateObject("Scripting.Dictionary")
Dim tmpDic As Object, key1 As Variant, key2 As Variant, val As Double
i = 1
With ActiveSheet
Do
key1 = CStr(.Cells(i, 4).Value)'1を想定
key2 = CStr(.Cells(i, 2).Value)'aaaを想定
val = CDbl(.Cells(i, 3).Value)'100を想定
If DicMain.Exists(key1) = False Then DicMain.Add key1, CreateObject("Scripting.Dictionary")
If DicMain.Item(key1).Exists(key2) = False Then DicMain.Item(key1).Add key2, 0
DicMain.Item(key1).Item(key2) = DicMain.Item(key1).Item(key2) + val
i = i + 1
Loop Until .Cells(i, 1).Value = ""
i = i + 5
For Each key1 In DicMain.keys
If key1 = "1" Then
For Each key2 In DicMain.Item(key1).keys
.Cells(i, 1) = key2
.Cells(i, 2) = DicMain.Item(key1).Item(key2)
i = i + 1
Next key2
End If
Next key1
End With
End Sub