2014-06-06 46 views
4

我想隱藏列A中單元格的爲空(即空)的所有行。我嘗試使用下面的代碼:更快的方法來隱藏空行

Range("A7:A117").SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True 

然而,在A列的每個單元都有一個VLOOKUP公式和xlCellTypeBlanks認爲與公式的單元格,但沒有價值,是空白。

所以我嘗試使用下面的代碼,但它非常緩慢。

For i = 17 To 117 
    If ActiveSheet.Cells(i, 1) = "" Then 
    ActiveSheet.Cells(i, 1).EntireRow.Hidden = True 
End If 

如何加快速度?

+1

是否已打開屏幕更新了嗎?我發現如果在運行之前設置'application.screenupdating = false',然後'application.screenupdating = True',那麼使用for循環足夠快。對於我來說,緩慢的部分是在每一行更新後更新屏幕 –

+0

我喜歡'IsEmpty',就像在If IfEmpty(Sheet1.Cells(i,1))那麼' –

回答

5

你爲什麼不嘗試自動篩選:

Range("A7:A117").AutoFilter 1, "<>", , , False 
+0

+ 1 Yup'Autofilter'是比循環更快的方式:) –

1

這不是for循環很慢它是要更新的畫面,每次有新的變化(這裏採用的處理能力,從而公平的位減慢一切)。如果在隱藏行之前關閉屏幕更新,那麼只需更新一次,腳本運行速度會快得多,然後重新打開屏幕更新。我試了100行,幾乎是瞬間的。

Sub hideEmptyRows() 

Application.ScreenUpdating = False 

For i = 1 To 117 
    If ActiveSheet.Cells(i, 1) = "" Then 
    ActiveSheet.Cells(i, 1).EntireRow.Hidden = True 
End If 
Next i 

Application.ScreenUpdating = True 

End Sub 
+0

通過將空白單元格寫入循環內的一個範圍(使用Union)並且只針對連接範圍調用一個'EntireRow.Hidden'調用,可以使其更快。 –

0
Range("A7:A117").AutoFilter 1, "<>", , , False 

它隱藏空單元格,但如果你試圖用鼠標取消隱藏你不能

+0

你沒有看到這個確切的答案已經提供? –

+0

你是什麼意思? – Servlet

+0

看看下面L42的答案。 –

0

這裏有沒有自動篩選答案:

Dim totalRange As Range 
ActiveSheet.Range("A17:A117").Hidde = false 


For Each cell In ActiveSheet.Range("A17:A117") 
    If cell = "" And totalRange Is Nothing Then 
     Set totalRange = cell 
    ElseIf cell = "" Then 
     Set totalRange = Application.union(totalRange, cell) 
    End If 
Next 

If Not totalRange Is Nothing Then 
    totalRange.EntireRow.Hidden = True 
End If