Option Explicit
Public Sub 重複行削除()
Dim maxrow As Long
Dim ws As Worksheet
Dim dicT As Object
Dim wrow As Long '処理中行
Dim trow As Long '重複登録行(残す行)
Dim del_row As Long '削除対象行
Dim key As String 'キー(分類1+分類2)
Dim ctr As Long '削除行件数
Dim drows As Range '削除対象行の集まり
Set dicT = CreateObject("Scripting.Dictionary")
Set ws = ActiveSheet
maxrow = ws.Cells(Rows.Count, "B").End(xlUp).Row 'B列の最大行取得
ctr = 0
For wrow = 2 To maxrow
key = ws.Cells(wrow, "D").Value & "|" & ws.Cells(wrow, "D").Value
If dicT.exists(key) = False Then
'最初のキー出現時(重複無の場合)
dicT(key) = wrow
Else
'以降のキー出現時(重複有の場合)
trow = dicT(key)
If ws.Cells(wrow, "C").Value < ws.Cells(trow, "C").Value Then
'登録済み商品の個数が多い場合
del_row = wrow '当該行を削除
ws.Cells(trow, "A").Value = ws.Cells(wrow, "B").Value '削除商品記入
Else
'登録済み商品の個数が小さい場合
del_row = trow '登録済み商品の行を削除
ws.Cells(wrow, "A").Value = ws.Cells(trow, "B").Value '削除商品記入
dicT(key) = wrow '登録済み商品の行を書き換え
End If
'削除対象行を登録
If ctr = 0 Then
Set drows = Rows(del_row)
Else
Set drows = Union(drows, Rows(del_row))
End If
ctr = ctr + 1
End If
Next
'削除対象行があるなら削除
If ctr > 0 Then
drows.Delete
End If
MsgBox ("完了")
End Sub
T3B0aW9uIEV4cGxpY2l0ClB1YmxpYyBTdWIg6YeN6KSH6KGM5YmK6ZmkKCkKICAgIERpbSBtYXhyb3cgQXMgTG9uZwogICAgRGltIHdzIEFzIFdvcmtzaGVldAogICAgRGltIGRpY1QgQXMgT2JqZWN0CiAgICBEaW0gd3JvdyBBcyBMb25nICAgICAgICAn5Yem55CG5Lit6KGMCiAgICBEaW0gdHJvdyBBcyBMb25nICAgICAgICAn6YeN6KSH55m76Yyy6KGM77yI5q6L44GZ6KGM77yJCiAgICBEaW0gZGVsX3JvdyBBcyBMb25nICAgICAn5YmK6Zmk5a++6LGh6KGMCiAgICBEaW0ga2V5IEFzIFN0cmluZyAgICAgICAn44Kt44O877yI5YiG6aGeMe+8i+WIhumhnjLvvIkKICAgIERpbSBjdHIgQXMgTG9uZyAgICAgICAgICfliYrpmaTooYzku7bmlbAKICAgIERpbSBkcm93cyBBcyBSYW5nZSAgICAgICfliYrpmaTlr77osaHooYzjga7pm4bjgb7jgooKICAgIFNldCBkaWNUID0gQ3JlYXRlT2JqZWN0KCJTY3JpcHRpbmcuRGljdGlvbmFyeSIpCiAgICBTZXQgd3MgPSBBY3RpdmVTaGVldAogICAgbWF4cm93ID0gd3MuQ2VsbHMoUm93cy5Db3VudCwgIkIiKS5FbmQoeGxVcCkuUm93ICAgICdC5YiX44Gu5pyA5aSn6KGM5Y+W5b6XCiAgICBjdHIgPSAwCiAgICBGb3Igd3JvdyA9IDIgVG8gbWF4cm93CiAgICAgICAga2V5ID0gd3MuQ2VsbHMod3JvdywgIkQiKS5WYWx1ZSAmICJ8IiAmIHdzLkNlbGxzKHdyb3csICJEIikuVmFsdWUKICAgICAgICBJZiBkaWNULmV4aXN0cyhrZXkpID0gRmFsc2UgVGhlbgogICAgICAgICAgICAn5pyA5Yid44Gu44Kt44O85Ye654++5pmC77yI6YeN6KSH54Sh44Gu5aC05ZCI77yJCiAgICAgICAgICAgIGRpY1Qoa2V5KSA9IHdyb3cKICAgICAgICBFbHNlCiAgICAgICAgICAgICfku6XpmY3jga7jgq3jg7zlh7rnj77mmYLvvIjph43opIfmnInjga7loLTlkIjvvIkKICAgICAgICAgICAgdHJvdyA9IGRpY1Qoa2V5KQogICAgICAgICAgICBJZiB3cy5DZWxscyh3cm93LCAiQyIpLlZhbHVlIDwgd3MuQ2VsbHModHJvdywgIkMiKS5WYWx1ZSBUaGVuCiAgICAgICAgICAgICAgICAn55m76Yyy5riI44G/5ZWG5ZOB44Gu5YCL5pWw44GM5aSa44GE5aC05ZCICiAgICAgICAgICAgICAgICBkZWxfcm93ID0gd3JvdyAgJ+W9k+ipsuihjOOCkuWJiumZpAogICAgICAgICAgICAgICAgd3MuQ2VsbHModHJvdywgIkEiKS5WYWx1ZSA9IHdzLkNlbGxzKHdyb3csICJCIikuVmFsdWUgICAn5YmK6Zmk5ZWG5ZOB6KiY5YWlCiAgICAgICAgICAgIEVsc2UKICAgICAgICAgICAgICAgICfnmbvpjLLmuIjjgb/llYblk4Hjga7lgIvmlbDjgYzlsI/jgZXjgYTloLTlkIgKICAgICAgICAgICAgICAgIGRlbF9yb3cgPSB0cm93ICAn55m76Yyy5riI44G/5ZWG5ZOB44Gu6KGM44KS5YmK6ZmkCiAgICAgICAgICAgICAgICB3cy5DZWxscyh3cm93LCAiQSIpLlZhbHVlID0gd3MuQ2VsbHModHJvdywgIkIiKS5WYWx1ZSAgICfliYrpmaTllYblk4HoqJjlhaUKICAgICAgICAgICAgICAgIGRpY1Qoa2V5KSA9IHdyb3cgICAgJ+eZu+mMsua4iOOBv+WVhuWTgeOBruihjOOCkuabuOOBjeaPm+OBiAogICAgICAgICAgICBFbmQgSWYKICAgICAgICAgICAgJ+WJiumZpOWvvuixoeihjOOCkueZu+mMsgogICAgICAgICAgICBJZiBjdHIgPSAwIFRoZW4KICAgICAgICAgICAgICAgIFNldCBkcm93cyA9IFJvd3MoZGVsX3JvdykKICAgICAgICAgICAgRWxzZQogICAgICAgICAgICAgICAgU2V0IGRyb3dzID0gVW5pb24oZHJvd3MsIFJvd3MoZGVsX3JvdykpCiAgICAgICAgICAgIEVuZCBJZgogICAgICAgICAgICBjdHIgPSBjdHIgKyAxCiAgICAgICAgRW5kIElmCiAgICBOZXh0CiAgICAn5YmK6Zmk5a++6LGh6KGM44GM44GC44KL44Gq44KJ5YmK6ZmkCiAgICBJZiBjdHIgPiAwIFRoZW4KICAgICAgICBkcm93cy5EZWxldGUKICAgIEVuZCBJZgogICAgTXNnQm94ICgi5a6M5LqGIikKRW5kIFN1YgoK