Vba 按行颜色排序不一致

Vba 按行颜色排序不一致,vba,excel,sorting,Vba,Excel,Sorting,我有一个sub,它根据在特定列范围内找到的单元格值高亮显示每一行,然后使用下面的代码按其单元格颜色按特定颜色顺序对每一行进行排序。sub的颜色部分使用FindAllOccurrences函数和本问题中的if公式完成。我遇到的问题是排序函数。在目前的形式下,它是有效的,但不是绝对有效的。我的意思是,最后一种颜色是红色,只用于突出显示我工作表上的非连续项目,排序功能应该对最后一种颜色进行排序,如果它在那里,它会这样做,如果它不在那里,它似乎会覆盖颜色,使我工作表上的最后一种颜色变为红色,而不管它是否

我有一个sub,它根据在特定列范围内找到的单元格值高亮显示每一行,然后使用下面的代码按其单元格颜色按特定颜色顺序对每一行进行排序。sub的颜色部分使用FindAllOccurrences函数和本问题中的if公式完成。我遇到的问题是排序函数。在目前的形式下,它是有效的,但不是绝对有效的。我的意思是,最后一种颜色是红色,只用于突出显示我工作表上的非连续项目,排序功能应该对最后一种颜色进行排序,如果它在那里,它会这样做,如果它不在那里,它似乎会覆盖颜色,使我工作表上的最后一种颜色变为红色,而不管它是否已停止。我通过改变不同的变量对它进行了测试,得到了不同的结果

这可能是我没有看到的,但唯一适合解释为什么它不一致的原因是排序函数不包含if命令。这意味着如果找不到颜色,代码中的任何内容都不允许跳过。我假设,因为它是一个排序函数,所以它无法对不存在的颜色进行排序,因此它会自动跳到找到的下一种颜色,但可能我不正确?有什么建议吗

 Set WS = ThisWorkbook.Sheets(1)
 Set LastRow = WS.Range("FU3:FU5002")
 With WS.Sort
    .SortFields.Clear

    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(204, 255, 255)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(102, 0, 102)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(204, 255, 204)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(128, 128, 0)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(150, 150, 150)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(255, 255, 204)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(204, 204, 255)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(0, 128, 128)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(102, 102, 153)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(192, 192, 192)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(128, 128, 128)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(0, 255, 0)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(0, 255, 255)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(128, 0, 0)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(255, 255, 153)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(128, 0, 128)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(0, 102, 204)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(153, 204, 255)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(255, 153, 204)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(204, 153, 255)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(255, 0, 255)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(255, 153, 0)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(255, 0, 255)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(153, 51, 102)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(153, 204, 0)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(255, 204, 0)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(0, 204, 255)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(0, 0, 255)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(255, 102, 0)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(51, 153, 102)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(51, 51, 153)
    .SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = RGB(255, 0, 0)

    .SetRange DataSheet
    .Header = xlNo
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With
本质上,我是说“这是一个你没有问过的问题的答案”,因为我不知道为什么excel会这样做,但既然我在评论中提到了这一点,我会发布它。我认为这不是一种好的方法

将独特的颜色读入字典,并将其转换为RGB数组

然后,我想为每个
sortfield
添加一个过滤器-但那将是荒谬的,因为我想象你有一个你想要的配色方案。因此,相反,可以按照颜色的顺序,比较每种颜色,看看它是否在数组中,如果是的话,进行排序。否则,跳过颜色

Sub test()
Dim col As Variant

Dim d As Object
Set d = CreateObject("Scripting.Dictionary")

For Each c In Range("FU3:FU5002")
    col = (c.Interior.Color)
    d(col) = 1
Next
Dim v As Variant
Dim j As Integer
j = d.Count
Dim colores() As String
ReDim colores(j)
i = 1
For Each v In d.keys
    colores(i) = Convert_Dec2RGB(v)
    i = i + 1
Next

'With ActiveSheet.Sort
    'For k = 1 To j
    '.SortFields.Add(LastRow, xlSortOnCellColor, xlAscending, , xlSortNormal). _
                    SortOnValue.Color = colores(k)
    'Next
'End With

End Sub

Private Function Convert_Dec2RGB(ByVal myDECIMAL As Long) As String
'https://socko.wordpress.com/2008/10/07/convert-decimal-to-rgb-color-value/
  Dim myRED As Long
  Dim myGREEN As Long
  Dim myBLUE As Long

  myRED = myDECIMAL And &HFF
  myGREEN = (myDECIMAL And &HFF00&) \ 256
  myBLUE = myDECIMAL \ 65536

  Convert_Dec2RGB = "RGB(" & CStr(myRED) & "," & CStr(myGREEN) & "," & CStr(myBLUE) & ")"
End Function
请尝试使用下面的代码。 您必须找到所有要排序的颜色代码,并按所需顺序添加用于排序的颜色代码

子测试()


这是一个有趣的想法,我不知道这是可能的。你能在回答中详细说明一下吗?使用您心目中的这种方法,是否可以指定优先级顺序?这不是绝对必要的,但如果可能的话,这将是理想的。我认为尝试检索RGB可能会变得太复杂-对不起。删除了我的评论。
Dim dis As Object

Set dis = CreateObject("Scripting.Dictionary")

P = 1
Rcnt = Range("AU65000").End(xlUp).Row

For i = 3 To Rcnt
    On Error Resume Next
    dis.Add Range("A" & i).Interior.Color, P
    P = P + 1
Next i

'sorting
ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Clear
'red
If dis.exists(255) = True Then ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add(Range("A2:A10"), _
    xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = 255
'yellow
If dis.exists(65535) = True Then ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add(Range("A2:A10"), _
    xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = 65535
'blue
If dis.exists(12874308) = True Then ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add(Range("A2:A10"), _
    xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = 12874308
'orange
If dis.exists(3243501) = True Then ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add(Range("A2:A10"), _
    xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = 3243501
'green
If dis.exists(5287936) = True Then ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add(Range("A2:A10"), _
    xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = 5287936
With ActiveWorkbook.Worksheets("Sheet2").Sort
    .SetRange Range("A2:A10")
    .Header = xlGuess
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With
Range("A1").Select