2017-08-02 72 views
1

我看到幾篇關於刪除範圍內的空白行的文章,以及其他一些關於刪除基於單個空白列的表格行的文章,但沒有關於刪除完全空白的表格行的文章。什麼是刪除Excel表格的所有空行的最快方法?

這樣做最快的方法是什麼?

我在下面發佈了我的解決方案以幫助其他人,但我很想看看是否有人有更快的方法。

回答

2

下面是我用來刪除空白表格行的過程。我有時會使用大型(用於Excel)數據集,並且此方法更快。它將錶行加載到數組中,檢查數組中的空白行,並在最後執行一個range.delete操作。

您使用的過程是這樣的:

Sub Test() 
    DeleteBlankTableRows ActiveSheet.ListObjects(1) 
End Sub 

ActiveSheet.ListObjects(1)(通常)的第一個表的表活動工作表上。

這裏的實際步驟:

Sub DeleteBlankTableRows(ByVal tbl As ListObject) 
    Dim rng As Range 
    Set rng = tbl.DataBodyRange ' Get table data rows range. 
    Dim DirArray As Variant 
    DirArray = rng.Value2  ' Save table values to array. 

    ' LOOP THROUGH ARRAY OF TABLE VALUES 
    Dim rowTMP As Long 
    Dim colTMP As Long 
    Dim combinedTMP As String 
    Dim rangeToDelete As Range 

    ' Loop through rows. 
    For rowTMP = LBound(DirArray) To UBound(DirArray) 
     combinedTMP = vbNullString ' Clear temp variable. 

     ' Loop through each cell in the row and get all values combined. 
     For colTMP = 1 To tbl.DataBodyRange.Columns.Count 
      combinedTMP = combinedTMP & DirArray(rowTMP, colTMP) 
     Next colTMP 

     ' Check if row is blank. 
     If combinedTMP = vbNullString Then 
      ' Row is blank. Add this blank row to the range-to-delete. 
      If rangeToDelete Is Nothing Then 
       Set rangeToDelete = tbl.ListRows(rowTMP).Range 
      Else 
       Set rangeToDelete = Union(rangeToDelete, tbl.ListRows(rowTMP).Range) 
      End If 
     End If 
    Next rowTMP 

    ' DELETE BLANK TABLE ROWS (if any) 
    If Not rangeToDelete Is Nothing Then rangeToDelete.Delete 
End Sub 

這比其他方法的一些優點:

  1. SPEED:在一個表中的20萬行8列的測試,這種方法了19秒。對於相同的表格,這隻需要超過34秒的SpecialCells(xlCellTypeBlanks)方法的一半。
  2. 確定完整的空白錶行:與其他一些方法(如this one在某些情況下非常有用)不同,此方法在行的每個單元中查找空白而不是僅查找一個。
1

這應該有效。不知道它的速度更快,但它的另一種方式來做到這一點:

Sub delete_blank_table_rows() 
Dim Rng As Range, tempRng As Range 
Set Rng = Range("Table1") ' Change as necessary 
Set Rng = Range(Cells(Rng.Rows(1).Row, Rng.Columns(1).Column), Cells(Rng.Rows(Rng.Rows.Count).Row, Rng.Columns(Rng.Columns.Count).Column)) 

Dim i  As Long 
For i = Rng.Rows.Count To 1 Step -1 
    Cells(Rng.Rows(i).Row, Rng.Columns(1).Column).Select 
    Set tempRng = Range(Cells(Rng.Rows(i).Row, Rng.Columns(1).Column), Cells(Rng.Rows(i).Row, Rng.Columns(Rng.Columns.Count).Column)) 

    If WorksheetFunction.CountA(tempRng) = 0 Then 
     tempRng.Delete shift:=xlUp 
    End If 

Next i 
End Sub 

編輯:當然,在它運行時加快步伐,你應該關閉屏幕更新,計算。

+0

感謝張貼此。我首先按原樣跑完,並在4分13秒內完成。屏幕更新和計算設置爲手動,它被縮減爲1分17秒 - 更快,但仍然比我發佈爲答案的方法所獲得的19秒慢得多....似乎應該有一個更快的方法。 – ChrisB

0

我覺得這可能會更快(可以修改LASTROW和LASTCOL,以滿足您的檯面尺寸):

Sub delete_rows_blank2() 

t = 1 
lastrow = ActiveSheet.UsedRange.Rows.Count 
lastcol = ActiveSheet.UsedRange.Columns.Count 

Do Until t = lastrow 

For j = 1 To lastcol 

    If Cells(t, j) = "" Then 

     j = j + 1 

      If j = lastcol Then 
      Rows(t).Delete 
      t = t + 1 
      End If 

    Else 

     t = t + 1 

    End If 

Next 

Loop 

End Sub 
相關問題