2016-08-12 403 views
2

我在Excel中排序了一個非常大的範圍,它由多個列組成,而不是所有列都被填充。在某些列中,有時會輸入空格,並且單元格的時間爲Empty。我想要做的是將空白區域和空單元格移動到範圍的底部。目前,excel將頂部的空白值和底部的空白單元格放在一起。或者,我不介意可以通過範圍並用Empty替代空白值的消毒功能。我寫了一篇,但是我給出的範圍非常慢(接近4000行,需要2分鐘才能完成)。以及我發佈的排序sub我正在使用。Excel VBA排序範圍,空白和空值在範圍底部

我查看了自定義訂單,但它看起來像需要您指定您計劃使用的所有值。是否可以使用自定義比較功能,而無需編寫全新排序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

代替對每個小區使用陣列來淨化你的細胞

用您的實際範圍替換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。這可能也有幫助。

+1

是的,那好多了,好多了。在我的機器上花了94毫秒。這應該使它更清晰,我認爲這對我的應用程序來說已經足夠了。謝謝。 – RWA4ARC