我在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
答案 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。这也许有帮助。