Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2016)
条件に従って重複行を加算
投稿日時: 19/02/12 09:35:02
投稿者: 和美

マクロでどうしてもできないので教えてください。
 
変更したい表は以下です。
(途中の不要列は省略しています)
  B : E  :L
1:符号:記号 :数量
2:A1 :A331 :2
3:A1 :D090 :2
4:A1 :A315 :1
5:A2 :P4X50X10 :1
6:A2 :A315   :1  
7:A2 :D090 :1
8:A2 :D090 :5
9:A3 :P4X50X10 :2
10:A3 :X189 :1
 
したい事
・B列符号とE列記号が同じ場合はL列の数量を足す。
・E列記号が一致していてもB列が違う場合は足さずに無視。
表の4行目と6行目は符号がA1とA2なのでそのまま、
6行目と7行目は符号が同じA2なので加算です。
 
E列が同じならL列の数量を足すマクロは作ったのですが、
B列が同じ場合は、という条件のために改変するとおかしくなってしまいました。
 
ご協力宜しくお願い致します。

投稿日時: 19/02/12 09:44:36
投稿者: 和美

「マクロの作成依頼禁止」に引っ掛かりそうなので、挙動のおかしいマクロも載せておきます。
全ての重複列が加算削除されるわけではなく、思い通りにB列一致分だけ重複加算削除できるわけでもないので
どういう条件になってしまっているのかは自分でも理解できていませんが……。
 
Sub test()
Dim i, j As Long
For i = 2 To Cells(Rows.Count, 2).End(xlUp).Row - 1
For j = Cells(Rows.Count, 2).End(xlUp).Row To i + 1 Step -1
bmax = Range("B" & Rows.Count).End(xlUp).Row
For b = 2 To bmax
     
If Cells(b, "B") = Cells(b - 1, "B") Then
If Cells(i, "E").Value = "" Then Exit Sub
If Cells(i, "E").Value = Cells(j, "C").Value Then
Cells(i, "L").Value = Cells(i, "L").Value + Cells(j, "L").Value
Rows(j).Delete
End If
End If
Next
Next
Next
End Sub

回答
投稿日時: 19/02/12 10:37:07
投稿者: Suzu

ピボットテーブルでは用は足りませんか?
 
列が飛んでると面倒なので。。
 

	A	B	C
1	符号	記号	数量
2	A1	A331	2
3	A1	D090	2
4	A1	A315	1
5	A2	P4X50X10	1
6	A2	A315	1
7	A2	D090	1
8	A2	D090	5
9	A3	P4X50X10	2
10	A3	X189	1

とします。
 
1. A1からC12 まで選択した状態で「挿入」-「ピボットテーブル」
2. ピボットテーブルの作成 にて
    『テーブルまたは範囲を選択(S)』
         テーブル/範囲 に、 シート名!$A$1:$C$10
     でOK
3. 行ラベルに、符号、記号を追加 値に、数量を追加
4. ピボットテーブルツールの デザインの
    レポートのレイアウトで 「表形式で表示」を選択後「アイテムのラベルをすべて繰り返す」を選択
5. ピボットテーブルツールの デザインの 「ピボットテーブルスタイル」で一番左上を選択
 
    目的の数値がでませんか?
 
6. A1 集計/A2 集計/ A3 集計 が邪魔なら、
    「A1 集計」を選択しようとすると、「A1 集計/A2 集計/ A3 集計」が選択された状態になると思います。
    その状態で、右クリック「符号の小計」 の左側にレチェックが入っていると思います。
    選択し、レチェックを外すと、「A1 集計/A2 集計/ A3 集計」が消えます。

投稿日時: 19/02/12 10:50:19
投稿者: 和美

Suzu様
ご回答ありがとうございます。
ですが、他のデータ加工もあるマクロの一環でこの作業が必要なので、ピボットテーブルや関数ではなくマクロで行う必要があるのです。
 
今実験で使っているデータが元々1737行あり、マクロで不要なデータを削除して143行にまで減らしています。
全ての作業が自動化できれば他のデータにも転用する予定なので、すみませんがマクロでお願い致します。

回答
投稿日時: 19/02/12 13:00:10
投稿者: WinArrow
投稿者のウェブサイトに移動

B列とE列を文字列結合した作業列を使って
「データ」−「小計」コマンドを使うと、
簡単に集計できます。
 
この操作をマクロの記録でコードが作成可能です。
ループは、データ量が多いと時間がかかるし、何よりも検証が面倒です。
 

投稿日時: 19/02/12 15:00:15
投稿者: 和美

WinArrow様
ご回答ありがとうございます。
小計コマンドがよく分からなかったのですが、文字列の結合を使ったら、作成していたE列が同じならL列の数量を足すマクロで作業ができました。
自分では思いつかなかった方策をご提示頂き誠にありがとうございます。
 
解決したので、このトピックは解決済でクローズとさせて頂きます。
またお世話になることがありましたら、宜しくお願い致します。