如何通过匹配值对Excel中的多个列进行排序

时间:2018-07-14 06:49:09

标签: excel excel-formula columnsorting

我正在清理数据。我从多个Excel电子表格中收集了数据。 我正在尝试在完全匹配的基础上实现排序,即

number = 10
number2 = 20
while number > 0 and number2 > 0:
    number = number - 1
    number2 = number2 - 1
    print(number)

我想要结果的原因是因为我想找出要删除的记录。我想从Store1中删除不在store2和store3中的值。

原始数据集包含约4000条记录。普通字母排序不会显示Store1与Store2和Store3并排的确切列值。

到目前为止我尝试过的事情: 匹配函数Match(Store1,Store2:Store3,0),结果为错误。 我也尝试了Vlookup,但是Vlookup不会进行排序。

2 个答案:

答案 0 :(得分:1)

我个人认为,这是XY Problem,您正在尝试解决与实际问题无关的问题。

  

我想要结果的原因是因为我想找出要删除的记录。我想从Store1中删除不在store2和store3中的值。

应通过从底部到顶部循环遍历 FirstName_Store1 列中的每个单元格并在其余列上执行application.countif来轻松解决这种情况。

话虽如此,这是您实际提出的问题的一种解决方案。

Sample data before sortAndSift sub procedure

enter image description here

sortAndSift code for public module code sheet

Option Explicit

Sub sortAndSift()
    Dim i As Long, j As Long, m As Variant, n As Variant

    With Worksheets("sheet6")
        With .Cells(1, 1).CurrentRegion
            With .Cells.Resize(.Rows.Count - 1, .Columns.Count).Offset(1, 0)
                'store the original values
                m = .Value2
            End With

            'put all values into column A
            For i = 2 To .Columns.Count
                With .Range(.Cells(2, i), .Cells(Rows.Count, i).End(xlUp))
                    .Parent.Cells(.Parent.Rows.Count, 1).End(xlUp).Resize(.Rows.Count, .Columns.Count).Offset(1, 0) = .Value
                End With
            Next i
        End With

        'reassert CurrentRegion since it probably changed
        With .Cells(1, 1).CurrentRegion
            With .Columns(1).Cells
                'remove duplicates from column A
                .RemoveDuplicates Columns:=1, Header:=xlYes

                'sort column A
                .Sort Key1:=.Columns(1), Order1:=xlAscending, _
                      Orientation:=xlTopToBottom, Header:=xlYes
            End With

            'put a copy of the expanded, de-duplicated and sorted column A
            ' in all other columns and make a copy of the values
            With .Cells.Resize(.Rows.Count - 1, .Columns.Count).Offset(1, 0)
                .FillRight
                n = .Value2
            End With

            'remove values from each 'column' in the array that were not in the original
            For i = LBound(n, 1) To UBound(n, 1)
                For j = LBound(n, 2) To UBound(n, 2)
                    If IsError(Application.Match(n(i, j), Application.Index(m, 0, j), 0)) Then
                        n(i, j) = vbNullString
                    End If
                Next j
            Next i

        End With

        'put values back on the worksheet
        .Cells(2, 1).Resize(UBound(n, 1), UBound(n, 2)) = n
    End With

End Sub

Sample data after sortAndSift sub procedure

enter image description here

答案 1 :(得分:0)

通过将数据放入数据透视表中,可以轻松创建唯一列表( how 虽然对SO ref而言似乎不是主题)。例如,结果可能是“复制/粘贴特殊值/值”,“应用删除的重复项”,按字母顺序排序然后放在ColumnE中。

然后在F2中将其复制并向下复制到H8:

=IFERROR(IF(MATCH($E2,A:A,0),$E2),"")

复制标题。

假设Aat在A2中。