为什么在多级排序后出现空白行?

时间:2019-05-22 21:29:39

标签: excel vba

我有一个按颜色,按日期,然后按日期排序的宏。

如果我删除日期,则不只是重新排序,它还会重新排序,然后留下空白行,该行以前是删除日期的行。我尝试添加另一个排序层,在其中我按颜色RGB(0,0,0)进行排序。

  1. 为什么空白行坐在那里?
  2. 如何删除它们或根本不显示它们?
If Not Intersect(Target, Range("A:C")) Is Nothing Then
    MsgBox ("sorting")

    ActiveSheet.Sort.SortFields.Clear
    ActiveSheet.Sort.SortFields.Add(Range("C:C"), _
        xlSortOnCellColor, _
        xlDescending, _
        , _
        xlSortNormal).SortOnValue.Color = RGB(146, 208, 80)

    ActiveSheet.Sort.SortFields.Add2 Key:=Range("C:C"), _
        SortOn:=xlSortOnValues, _
        Order:=xlDescending, _
        DataOption:=xlSortNormal

   ActiveSheet.Sort.SortFields.Add2 Key:=Range("B:B"), _
        SortOn:=xlSortOnValues, _
        Order:=xlDescending, _
        DataOption:=xlSortNormal

   ActiveSheet.Sort.SortFields.Add2(Range("C:C"), _
        xlSortOnCellColor, _
        xlDescending, _
        , _
        xlSortNormal).SortOnValue.Color = RGB(255, 255, 255)

    With ActiveSheet.Sort
        .SetRange Range("A:C")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

End If

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

我相信我可能会对您的问题有一个答案,我确信第二个问题至少……

为什么空白行坐在那里?

我只能猜测,因为我没有您的源文件来检查任何不正常情况,也没有您的整个宏。如果我不得不猜测,我会说这是导致此问题的宏中的某个功能,或者也可能是如何定义排序范围的问题。您仅指定列,而不指定实际的开始单元,也没有结束单元。我用来对数据进行排序的方法是动态定义确切范围。

如何删除它们或根本不显示它们?

请尝试根据您提供的数据和提供的代码对我进行调整的代码:

If Not Intersect(Target, Range("A:C")) Is Nothing Then
    MsgBox ("sorting")

With ActiveWorkbook.ActiveSheet
    lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row '<-- get last row of data in column "A"
    .Sort.SortFields.Clear

    .Sort.SortFields.Add(Range("C1:C" & lastRow), _
    xlSortOnCellColor, xlDescending, , xlSortNormal).SortOnValue.Color = RGB(146, 208, 80)

    .Sort.SortFields.Add Key:=.Range("B1:B" & lastRow), _
                        SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal

    .Sort.SortFields.Add Key:=.Range("C1:C" & lastRow), _
                        SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal

    .Sort.SortFields.Add(Range("C1:C" & lastRow), _
                        SortOn:=xlSortOnCellColor, Order:=xlDescending, DataOption:=xlSortNormal).SortOnValue.Color = RGB(255, 255, 255)

    With .Sort
        .SetRange Range("A1:C" & lastRow)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End With

End If

主要调整是lastRow的声明,该声明调整数据范围的底部(在您的情况下这无关紧要,但是有时您可能会在想要排序的数据之前遇到数据,直到某些行,这将非常有用。此处定义的定义对其他很多宏非常有用,并且有助于动态设置范围。)

我还添加了开始数据,如您在Range("C1:C" & lastRow)

中所见

我已经在您提供的示例数据上对此进行了测试,并且可以正常工作。我希望它完全可以为您服务。