【问题标题】:Excel - two columns - remove duplicate values buy comparing pairs in rowsExcel - 两列 - 删除重复值购买比较行中的对
【发布时间】:2021-07-11 01:07:05
【问题描述】:

我用的是Excel 2013,简化了实际数据,假设你有两列数据,类似如下:

Column1 Column2
A D
A C
B C
C B
C A
D A

我的目标是过滤或删除重复的对,无论它们在哪一列。我想要的输出如下:

Column1 Column2
A D
A C
B C

因此,如您所见,C-B 行已被消除,因为该对存在于包含 B-C 的行中。包含 C-A (A-C) 和 D-A (A-D) 的行也是如此。数据没有特定的顺序,删除两对匹配中的哪一个都没有关系。

解决方法可以是创建一个新表,甚至使用 VBA 输出一个新表。最简单的。

提前致谢!

【问题讨论】:

  • 您好,欢迎来到 SO。这不是免费的代码编写服务,但我们很乐意帮助您解决您在编写代码时遇到的问题。到目前为止,您尝试过什么?
  • 作为起点,您可以使用=IF(SUM(COUNTIFS(A$2:A2,B2,B$2:B2,A2),COUNTIFS(A$2:A2,A2,B$2:B2,B2))=1,TRUE,FALSE) 来识别每个组合的第一个条目,A 是您的 column1B 是您的 第 2 列。但是,它宁愿选择 VBA 解决方案。
  • @cybernetic.nomad,嗨,很抱歉,我不希望有人为我编写代码,我正在寻找一点方向。我对如何进行尚无定论。
  • @Qualia,谢谢。根据我在帮助中找到的内容,我认为 VBA 解决方案可能是最好的方法。不过,我会看看你的公式建议,看看它是否会指向正确的方向。
  • 对每一行进行水平排序;然后很容易找到/删除重复项。

标签: excel


【解决方案1】:

我能够让它为我工作,所以我想我会发布我的答案,希望能帮助别人。正如我所怀疑和 Quailia 建议的那样,VBA 是要走的路。

在此过程中几乎没有什么变化。我需要在表中添加一个额外的列,因为确定我需要保留一些重复项。第一列中的值现在将行组合在一起,因此保留了以后的重复项。我需要检查重复对的值在第 2 列和第 3 列中。

表1:

Column1 Column2 Column3
01 A D
01 A C
01 B C
01 C B
01 C A
01 D A

另外,我意识到我将处理固定数量的行,因此我不需要不断更改数组的大小。

Sub RemoveDuplicatePairs()
    'Checks a 3 column table for rows with duplicate values when column 2 and 3 are swapped, removes duplicates and outputs unique rows to a new table
    Dim aArrayList() As Variant
    Dim bArrayList(1 To 144, 1 To 3) As Variant
    Dim aRowNum As Integer, aColNum As Integer, bRowNum As Integer, bColNum As Integer
    
    aArrayList = Range("Table1")
    
    bRowNum = 1
    'Loop through rows of 1st array
    For aRowNum = 1 To UBound(aArrayList, 1)
        If aRowNum = 1 Then
            bArrayList(1, 1) = aArrayList(1, 1)
            bArrayList(1, 2) = aArrayList(1, 2)
            bArrayList(1, 3) = aArrayList(1, 3)
            'Debug.Print bArrayList(bRowNum, 1) & aArrayList(bRowNum, 2) & bArrayList(aRowNum, 3)
            bRowNum = 2
        ElseIf aRowNum > 1 Then
            'Check if current row in 1st array already exists in 2nd array by comparing values after flipping 2nd and 3rd column values from 1st array
            For i = 1 To bRowNum - 1
                If aArrayList(aRowNum, 1) = bArrayList(i, 1) And aArrayList(aRowNum, 2) = bArrayList(i, 3) And aArrayList(aRowNum, 3) = bArrayList(i, 2) Then
                   'Duplicate pair already exists, move onto next row of 1st array
                    GoTo SKIP
                End If
            Next i
        'No duplicate found, add row from 1st array to 2nd array
                bArrayList(bRowNum, 1) = aArrayList(aRowNum, 1)
                bArrayList(bRowNum, 2) = aArrayList(aRowNum, 2)
                bArrayList(bRowNum, 3) = aArrayList(aRowNum, 3)
                'Debug.Print bArrayList(bRowNum, 1) & bArrayList(bRowNum, 2) & bArrayList(bRowNum, 3)
                bRowNum = bRowNum + 1
SKIP:
        End If
    Next aRowNum

'Write array to new table
Sheets("Sheet1").Range("Table2").Value = bArrayList()

End Sub

表2:

Column1 Column2 Column3
01 A D
01 A C
01 B C

我确信有一种更简单、更简洁的方法来做同样的事情,但正如我的用户名所暗示的那样,我对此还是很陌生。当然欢迎任何改进或简化我的逻辑的建议。

【讨论】:

  • 这是一种可能更简单的方法:添加一个带有公式的辅助列:=IF(A2>B2, CONCATENATE(A2,B2),CONCATENATE(B2,A2))。然后做RemoveDuplicates 只看助手列。最后,删除辅助列。您可以在工作表上或使用 VBA 执行此操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 2018-10-06
  • 2021-08-09
  • 2019-12-10
  • 2011-04-05
相关资源
最近更新 更多