【问题标题】:Excel Sort based on first columnExcel 根据第一列排序
【发布时间】:2015-09-16 21:58:45
【问题描述】:

只是一个简单的问题。假设我有四列数据 A、B、C 和 D。

A B C D 10 1 10 8 40 2 30 9 30 3 60 12 60 4 50 11 50 5 40 13 20 6 20 15

如何根据 A 的顺序对列 C 和 D 进行排序?即我想要以下结果;

A B C D 10 1 10 8 40 2 40 13 30 3 30 9 60 4 60 12 50 5 50 11 20 6 20 15

查看 C 列如何排列成与 A 相同,并且 D 中与它们在 C 中的相邻单元格相对应的值随它们一起移动。我尝试突出显示所有列并根据 A 列对数据进行排序,但它不起作用。有什么想法吗?

问候, 耶

【问题讨论】:

  • 所以您希望更改您的数据?一旦执行此操作,Excel 将无法将数据恢复到原始状态。
  • A列和C列的值是否相同但顺序不同?

标签: excel vba sorting


【解决方案1】:

这是您使用的一个小宏,它将根据 A 列对 C 列进行排序,而 D 列将自动排序。
它使用 'MATCH' 功能。为了您的理解,我已经放置了 cmets。
假设您的数据在 A:D 列中并且有标题。

Sub test1()
    Dim sht As Worksheet
    Dim rw As Long

    'SELECTING THE SHEET (CHANGE ME)
    Set sht = Sheets("Sheet2")

    'SETTING # OF ROWS
    rw = sht.UsedRange.Rows.Count

    'LOOPING AND PLACING FORMULA IN TEMPORARY COLUMN E
    For i = 2 To rw
        sht.Cells(i, 5).Value = "=MATCH(C" & i & ",$A$2:$A$" & rw & ",0)"
    Next

    'SORTING COLUMNS C,D AND E IN ASCENDING ORDER (WHICH WILL BE EXACTLY LIKE COLUMN A)
    Range("C2:E" & rw).Sort Key1:=Range("E2:E" & rw), Order1:=xlAscending

    'CLEARING THE TEMPORARY COLUMN E
    Range("E2:E" & rw).Clear

    'RELEASING THE OBJECT
    Set sht = Nothing
End Sub

【讨论】:

    【解决方案2】:

    在您的 VBA IDE 中,转到工具菜单并选择引用。选择“Microstoft ActiveX 数据对象 2.8 库。

    Private Sub CommandButton26_Click()
    
    Dim rs As New ADODB.Recordset
    Dim ws As Excel.Worksheet
    Dim lrow As Long
    
        Set ws = Application.ActiveSheet
    
        'Add fields to your recordset for storing data.
        With rs
            .Fields.Append "Row", adInteger
            .Fields.Append "ColumnC", adInteger
            .Fields.Append "ColumnD", adInteger
            .Open
        End With
    
        lrow = 1
    
        'Loop through and record what is in Columns C and D
        Do While lrow <= ws.UsedRange.Rows.count
    
            rs.AddNew
            rs.Fields("Row").Value = lrow
            rs.Fields("ColumnC").Value = ws.Range("C" & lrow).Value
            rs.Fields("ColumnD").Value = ws.Range("D" & lrow).Value
            rs.Update
    
            lrow = lrow + 1
            ws.Range("A" & lrow).Activate
        Loop
    
        'Now go through and rewrite columns C and D based on what is in A
        lrow = 1
        Do While lrow <= ws.UsedRange.Rows.count
    
            rs.Filter = ""
            rs.Filter = "ColumnC='" & ws.Range("A" & lrow).Value & "'"
            'If we have a match, write C and D
            If rs.RecordCount > 0 Then
                ws.Range("C" & lrow).Value = rs.Fields("ColumnC").Value
                ws.Range("D" & lrow).Value = rs.Fields("ColumnD").Value
            End If
    
            lrow = lrow + 1
        Loop
    
    End Sub
    

    【讨论】:

    • 对不起,我给出的例子很糟糕。想象一下,如果 A 列的顺序是 10 40 30 60 50 20,那么 C 列不能使用 sort 函数进行排序,因为 A 既不是升序也不是降序。对不起,我之前的错误。
    • 我已根据您的新数据更改了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 2014-12-02
    • 1970-01-01
    相关资源
    最近更新 更多