kansai5963
@kansai5963

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

条件が一致した場合に商品名ごとに合計を表示する方法

解決したいこと

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も試しましたが、一列目のナンバーをキーとしてというところで引っかかっております。

0

3Answer

Excel VBA ではないですが,ピボットテーブルはやりたいことに近そうだなと思いました.

0Like

「1列目をキーに」というのがいまいちわかりませんが、2列目から重複なしのリストが得られればよいのでしょうか?
それであれば以下のように解決することもできるかと思います。

image.png

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より関数による解決がよいのかなと思いました。

0Like

他の方が書かれている通り、ピボットテーブルを使うべきです。
あえてVBAでやるならこんな感じですかね

module1
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
0Like

Your answer might help someone💌