Excel VBA排序范围,其中空白和空值位于范围的底部

时间:2016-08-12 19:27:09

标签: vba excel-vba sorting excel

我在Excel中排序了一个非常大的范围,它包含多个列,而不是所有列都已填充。在某些列中,有时会输入空格和单元格为Empty的时间。我想要做的是将空白区域和空单元格移动到范围的底部。目前,excel将白色空间值置于顶部,将空单元格置于底部。或者,我不会介意可以通过范围并使用Empty替换空白值的清理功能。我写了一个,但是我给出的范围非常慢(接近4000行,完成需要2分钟以上)。同样,我发布了{I}使用的排序sub

我查看了自定义订单,但看起来它需要您指定您计划使用的所有值。是否可以使用自定义比较函数,而无需编写全新的排序sub

Sub SortCallLog()
    Application.ScreenUpdating = False
    Dim longTime As Double
    longTime = Millis
    Dim lastRow As Long
    Dim ws As Worksheet
    Dim sortOrder As Variant
    Set ws = Worksheets("CallLog")
    Call addToIndexesHV(FirstCBSort, SecondCBSort, ThirdCBSort, FourthCBSort) ' These are global variables referring to the sort order
    sortOrder = getSortOrder(False)
    lastRow = GetLastRow(ws)
    With ws.Sort
        .SortFields.Clear
        For sortIndex = 0 To getVariantLength(sortOrder) - 1
            .SortFields.Add Key:=Range(ConvertCBSortToColRow(CStr(sortOrder(sortIndex)))), Order:=xlAscending, SortOn:=xlSortOnValues, DataOption:=xlSortNormal
        Next sortIndex
        .Header = xlYes
        .MatchCase = False
        .SetRange ws.Range("B1:X" & (lastRow))
        .Apply
    End With
    Debug.Print (Millis - longTime)
    Application.ScreenUpdating = True
Exit Sub

消毒部分

For Each cell In ws.Range("B2:L" & (lastRow)).Rows.Cells
    cell.value = Trim(cell.value)
    If "" = cell.value Then
        cell.value = Empty
    End If
Next cell

1 个答案:

答案 0 :(得分:1)

而不是为每个单元格使用数组来清理你的单元格

将sheet1.usedrange替换为您的实际范围。这需要1或2秒

Sub test()
    Dim arr
    Dim lctrRow As Long
    Dim lctrCol As Long

    arr = Sheet1.UsedRange

    For lctrRow = LBound(arr, 1) To UBound(arr, 1)
        For lctrCol = LBound(arr, 2) To UBound(arr, 2)
            If Trim(arr(lctrRow, lctrCol)) = "" Then
               arr(lctrRow, lctrCol) = Empty
            End If
        Next
    Next

    Sheet1.UsedRange.Cells(1, 1).Resize(UBound(arr, 1), UBound(arr, 2)) = arr
End Sub

这将永远减少。当您开始排序/消毒时,还要确保您的计算模式是manaul。这也许有帮助。