Excel - 按另一个工作表中的列中的值进行自定义排序

时间:2017-03-06 12:20:57

标签: arrays excel vba excel-vba sorting

我正在尝试根据多个条件对Sheet2中的数据进行排序,其中一个标准应基于Sheet1列G中粘贴的值。首先,我想对数据进行排序基于第三列中值的升序,然后是我的自定义顺序。

我想在表2中对以下数据进行排序:

pic1

首先根据Rank(1-n),然后根据用户指定的col G Sheet 1中的自定义顺序输入Type:

pic2

结果应该是:

pic3

由于col G中的用户指定值可能会更改(也可能是不同的顺序),因此我无法使用静态列表。通过记录宏,我提出了以下代码(使用静态列表):

Columns("A:C").Select
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add Key:=Range("C2:C9999") _
    , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("B2:B9999") _
 , SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:="Type1,Type2,Type3" _
, DataOption:=xlSortNormal

With ActiveWorkbook.Worksheets("Sheet1").Sort
    .SetRange Range("A1:C9999")
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

所以我的问题是如何使用循环或者Excel知道如何将列中的所有值作为文本字符串提取,根据Sheet1 col G中的值对数据进行排序。

谢谢!

1 个答案:

答案 0 :(得分:1)

  

所以我的问题是如何使用循环或者Excel知道如何将列中的所有值作为文本字符串提取,根据Sheet1 col G中的值对数据进行排序。

转换一系列值,例如在Sheet2

enter image description here

以逗号分隔的字符串,您可以使用:

Join(WorksheetFunction.Transpose(ThisWorkbook.Worksheets("Sheet2").Range("A2:A4")), ",")

将返回:

Type1,Type2,Type3

因此,您的代码可能是:

Option Explicit

Sub Test()

    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim rngToSort As Range, rngOrderType As Range

    Set ws1 = ThisWorkbook.Worksheets("Sheet1")
    Set ws2 = ThisWorkbook.Worksheets("Sheet2")
    Set rngToSort = ws1.Range("A1:C5")
    Set rngOrderType = ws2.Range("A2:A4")

    With ws1.Sort.SortFields
        .Clear
        .Add Key:=rngToSort.Columns(3), _
            SortOn:=xlSortOnValues, _
            Order:=xlAscending
        .Add Key:=rngOrderType.Columns(2), _
            SortOn:=xlSortOnValues, _
            CustomOrder:=Join(WorksheetFunction.Transpose(rngOrderType), ",")
    End With

    With ws1.Sort
        .SetRange rngToSort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .Apply
    End With

End Sub

将从Sheet1转换为此内容:

enter image description here

对此:

enter image description here