按列(1,2)重复数据删除,但也按列(2,1)重复数据删除

时间:2014-06-25 07:20:41

标签: vba excel-vba excel

这是我目前的尝试:

Sub DeleteRows()

With ActiveSheet
    Set Rng = Range("A1", Range("B1").End(xlDown))
    Rng.RemoveDuplicates Columns:=Array(1, 2), Header:=xlYes
End With

End Sub

问题是,在转移到第2列之前,这只引用了第1列的重复数据删除。所以

HOME|AWAY|DATE
================
MARK|PAUL|JUNE1
PAUL|MARK|JUNE5
Sara|JOHN|JUNE8
JOHN|SARA|JUNE12

不进行重复数据删除。我想要实现的是我的代码将这些行视为相同,即使它们不是。这样我只有这两个竞争对手在这个月的第一天玩。以下是我正在寻找的最终结果。

HOME|AWAY|DATE
================
MARK|PAUL|JUNE1
Sara|JOHN|JUNE8

希望很清楚我在问什么。我把我的大脑搁浅了一点。我唯一能想到的是一些复杂的方法,通过它我可以翻转列并重复两次重复数据删除。但这似乎效率低下。

1 个答案:

答案 0 :(得分:2)

您需要使用组合名称执行另一个列。这个新专栏将按字母顺序对两个名字进行排序,以便Mark始终在Paul和John总是在Sara之前出现。然后在这个新列上重复删除。

伪代码:

For each row in rng

    'do a bubble sort on the two names to determine alphabetical order
    'enter in a new column as Name Name like: JOHN PAUL

next

'de-duplicate on the new column

Bubble sort procedure

基本上这个想法是,如果你有两个玩家,你需要使用冒泡排序来确定哪个是按字母顺序排列的。然后输入它作为MARK PAUL而不是PAUL MARK,这样您的数据就是一致的。当你完成排序过程后,马克总会来到保罗之前。现在您的重复数据删除工作将如您所愿。

冒泡排序后,您的数据将如下所示:

HOME|AWAY|DATE  |Sorted names
=============================
MARK|PAUL|JUNE1 |MARK PAUL
PAUL|MARK|JUNE5 |MARK PAUL
Sara|JOHN|JUNE8 |JOHN SARA
JOHN|SARA|JUNE12|JOHN SARA

现在,重复数据删除工作将在新专栏上按预期工作。

编辑:

其实没关系泡泡排序。这个公式就是创建新列所需的全部内容:

=UPPER(IF(B2<A2,B2&"_"&A2,A2&"_"&B2))