2015-09-20 218 views
1

我想根据列G中的值对我的行进行排序。有3个可能的值:绿色,红色黄色。我想要排在绿色之上的行,然后黄色,然后红色通过自定义排序自定义排序

一切我尝试的排序顺序是按字母顺序排列的结果:绿色然后。在列R上有第二类排序,但这是正常工作。

我最近的代码如下。 rr是最后一行的编号。我曾尝试过,有没有Order1:=xlAscending

sCustomList =“绿”,“黄”,“红”

Application.AddCustomList ListArray:=sCustomList 
    Range("A3:T" & rr).Sort Key1:=Range("G3:G" & rr), Order1:=xlAscending, _ 
    OrderCustom:=Application.CustomListCount + 1, MatchCase:=False, _ 
    DataOption1:=xlSortNormal, Key2:=Range("R3:R" & rr), Order2:=xlAscending 
+1

请参见[使用自定义列表对数据进行排序](https://support.office.com/zh-cn/article/Sort-data-using-a-custom-list-DEF8FF2B-681A-4FC3-9BD2-A06455C379E1 )。 – Jeeped

+0

谢谢Jeeped。我看到这是如何工作的,但我需要能够使用VBA来完成。这是一个更大的宏的一部分 –

回答

1

看你的代码中,sCustomList看起来像一个字符串类型的变量,而不是一个变量数组。我自定义排序列表的成功是每次创建一个新索引并使用最高索引号来引用它。

Sub custom_sort() 
    Dim vCustom_Sort As Variant, rr As Long 

    vCustom_Sort = Array("green", "yellow", "red", Chr(42)) 
    Application.AddCustomList ListArray:=vCustom_Sort 

    With Worksheets("Sheet2") '<~~ set this properly! 
     .Sort.SortFields.Clear 
     rr = .Cells(Rows.Count, "G").End(xlUp).Row 
     With .Range("A3:T" & rr) 
      'use this to presort one or more secondary fields before the primary custom sort 
      '.Cells.Sort Key1:=.Columns(18), Order1:=xlAscending, _ 
         Key2:=.Columns(1), Order2:=xlDescending, _ 
         Orientation:=xlTopToBottom, Header:=xlYes 
      .Cells.Sort Key1:=.Columns(7), Order1:=xlAscending, _ 
         Orientation:=xlTopToBottom, Header:=xlYes, MatchCase:=False, _ 
         OrderCustom:=Application.CustomListCount + 1 

     End With 
     .Sort.SortFields.Clear 
    End With 

End Sub 

.Cells.Sort.SortFields.Add.Cells.Sort之间的扭曲,通常产生一些混乱。 .SortFields.Add method使用CustomOrder:=参数,而Range.Sort method使用OrderCustom:=参数。这两个绝对不是相同的,但经常互换使用,并带来灾难性后果。

+1

对于自定义列表,我使用GetCustomListNum方法来查看列表是否存在。如果没有,方法返回'0'。 –

1

如果您使用SortFields对象,则不必引用自定义列表: 在下面哪里更改各种范围引用应该很明显。我还添加了一个字母排序上,我会建议增加一个表显式排序为您的工作表(绿色= 1比G


Option Explicit 
Sub TrafficLightSort() 
    Dim WS As Worksheet 
    Dim rSortRange As Range, rSortKey As Range 
    Const sSortOrder As String = "Green,Yellow,Red" 

Set WS = Worksheets("sheet1") 
With WS 
    Set rSortRange = Range("E1", .Cells(.Rows.Count, "E").End(xlUp)).Resize(columnsize:=3) 
    Set rSortKey = rSortRange.Columns(3) 

    With .Sort.SortFields 
     .Clear 
     .Add Key:=rSortKey, _ 
      SortOn:=xlSortOnValues, _ 
      Order:=xlAscending, _ 
      CustomOrder:=sSortOrder 
     .Add Key:=rSortRange.Columns(1), _ 
      SortOn:=xlSortOnValues, _ 
      Order:=xlAscending 
    End With 

    With .Sort 
     .SetRange rSortRange 
     .Header = xlNo 
     .MatchCase = False 
     .Orientation = xlTopToBottom 
     .Apply 
    End With 
End With 

End Sub 

0

其他的一列,黄色= 2,等等)。然后在您的排序范围中添加一列,使用查找函数返回排序值并使用VBA根据该列运行标准排序。这会让你看到VBA代码更容易让开发人员阅读,允许没有阅读VBA的Excel用户看到你的排序顺序,并避免在你的宏中埋藏硬编码值。