【问题标题】:Sort Column Based on Another Column Order of Values根据值的另一列顺序对列进行排序
【发布时间】:2014-03-13 08:46:59
【问题描述】:

我在电子表格 1 中有两列:

Col1  Col2     

1     PDC      
2     SR3      
3     PDC      
4     VBM      
5     VBM
6     GAL
7     VBM
8     GAL
9     PDC

我在电子表格 2 中有 1 列:

Col1

PDC
SR3
VBM
GAL

如何根据电子表格 Col1 中的顺序对电子表格 1 中的 Col1 和 Col2 进行排序?

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    试试这个代码:

    Sub test()
        Dim wb As Workbook
        Dim ws1 As Worksheet
        Dim ws2 As Worksheet
        Dim lastrow As Long
        Dim rng As Range
    
        'if workbook2 is already opened
        Set wb = Workbooks("Book2") ' change Book2 to suit
        'if workbook2 is not opened
        'Set wb = Workbooks.Open("C:\Book2.xlsx")
    
        'change sheet1 to suit
        Set ws1 = ThisWorkbook.Worksheets("Sheet1")
        'change sheet2 to suit
        Set ws2 = wb.Worksheets("Sheet2")
    
        With ws1
            'change column B to column with your values "PDC", "SR3" and so on
            lastrow = .Cells(.Rows.Count, "B").End(xlUp).Row
            'change to address of range you wnat to sort
            Set rng = .Range("A1:B" & lastrow)
            With rng.Offset(, rng.Columns.Count).Resize(, 1)
                .EntireColumn.Insert
                .Offset(, -1).FormulaR1C1 = "=MATCH(RC[-1],'[" & wb.Name & "]" & ws2.Name & "'!C1:C1,0)"
                .Offset(, -1).Value = .Offset(, -1).Value
            End With
            With rng.Resize(, rng.Columns.Count + 1)
                .Sort Key1:=.Cells(1, .Columns.Count), Order1:=xlAscending, Header:=xlGuess
                .Cells(1, .Columns.Count).EntireColumn.Delete
            End With
        End With
    
        wb.Close
    End Sub
    

    说明:

    1. 有两个工作簿。代码应该放在第一个工作簿中(您要对范围进行排序的地方)
    2. 主要思想是使用=MATCH(B1,[Book2]Sheet2!A:A,0) 之类的公式添加临时列,以从 A 列 (workbook2) 中的 B 列 (workbook1) 中获取值的行数。
    3. 根据此数字对范围进行排序。
    4. 删除临时列

    注意事项:

    下一行假设带有“PDC”、“SR3”的列(在工作簿 1 中)位于所选范围的最后一个(Set rng = .Range("A1:B" & lastrow)):

    .Offset(, -1).FormulaR1C1 = "=MATCH(RC[-1],'[" & wb.Name & "]" & ws2.Name & "'!C1:C1,0)"
    

    如果不正确,请将RC[-1] 更改为,如果此列是最后一列,则说RC[-2],依此类推。

    C1:C1 部分公式表示在workbook2 的“PDC”列中,“SR3”是A 列(第1 列)。如果不正确,请将其更改为 C5:C5,这意味着该列是 E(第 5 列)。

    【讨论】:

      【解决方案2】:

      我发现这段代码看起来更简单,而且效果很好。

      Sub NewSortTest()
          Dim keyRange As Variant
          Dim sortNum As Long
      
          keyRange = ActiveWorkbook.Worksheets("Sheet2").Cells.Range("A1:A10").Value
      
          Application.AddCustomList ListArray:=keyRange
          sortNum = Application.CustomListCount
      
          ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
          ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add key:=Range("A1:A20"), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:=sortNum, DataOption:=xlSortNormal
          With ActiveWorkbook.Worksheets("Sheet1").Sort
              .SetRange Range("A1:B20")
              .Header = xlGuess
              .MatchCase = False
              .Orientation = xlTopToBottom
              .SortMethod = xlPinYin
              .Apply
          End With
      End Sub
      

      【讨论】:

        猜你喜欢
        • 2012-08-27
        • 2022-01-03
        • 1970-01-01
        • 1970-01-01
        • 2018-01-03
        • 1970-01-01
        • 2022-11-16
        • 1970-01-01
        • 2018-09-15
        相关资源
        最近更新 更多