2013-07-12 151 views
30

我是VBA的新手,我試圖想出一種方法來刪除所有行(並將單元格向上移動,如果可能的話),其中網站列單元格包含單詞none。該表包含5000多條記錄,這將爲我節省大量時間。如果單元格包含字符串,則刪除整行X

我欣賞任何建議。提前謝謝了!

http://i39.tinypic.com/5ano1d.png

+3

你有沒有嘗試過任何代碼(有**本網站的如何刪除使用VBA行非常**的例子很多),如果沒有,你有沒有考慮排序,然後刪除一個連續範圍,這對於大容量的可無論如何要快得多? – pnuts

+0

有一個答案几乎就是你正在尋找的。你只需要修改自動過濾器的標準。 [有效的方法來刪除整行,如果...](http://stackoverflow.com/a/16901714/138938) –

回答

61

這不是一個VBA任務 - 這個特定的任務是最簡單的解決與自動過濾器。

1.Insert自動過濾器(在Excel 2010中點擊首頁 - >(編輯)排序&過濾器 - >過濾器)
2.過濾器的 '網站' 列
3.標記 '無',並刪除他們
4.清除過濾器

0

嘗試......

Dim r as Range 
Dim x as Integer 

For x = 5000 to 4 step -1 '---> or change as you want //Thanx 4 KazJaw 

    set r = range("E" & format(x)) 
    if ucase(r.Value) = "NONE" then 
    Rows(x).EntireRow.Delete 
    end if 

Next 
+0

5000+記錄更好地過濾和刪除,而不是循環。 – Santosh

+0

@Santosh ..你可能是對的! ..我會嘗試添加.. – matzone

+1

@matzone,你不應該使用這種循環刪除過程。如果要刪除某些類型的所有元素,請始終使用'For I = 5000 to 4 Step -1'! –

1

這是暗示在另一條評論,但你可以嘗試這樣的事情。

Sub FilterAndDelete() 

Application.DisplayAlerts = False 

    With Sheet1 'Change this to your sheet name 

     .AutoFilterMode = False 
     .Range("A3:K3").AutoFilter 
     .Range("A3:K3").AutoFilter Field:=5, Criteria1:="none" 
     .UsedRange.Offset(1, 0).Resize(ActiveSheet.UsedRange.Rows.Count - 1).Rows.Delete 

    End With 

Application.DisplayAlerts = True 

End Sub 

我沒有測試過這一點,它是從內存中,所以它可能需要一些調整,但應把工作,而無需通過數千行的循環完成。您需要刪除11-Jul,以便UsedRange正確,或將偏移量更改爲.Offset(1,0)中的2行而不是1。

通常,在我做.Delete之前,我會用.Select代替Delete來運行宏,我可以確定刪除了正確的範圍,這可能值得做檢查以確保刪除合適的範圍。

16

好吧,我知道這對VBA,但如果你需要爲一次過批量做刪除您可以使用以下Excel功能:http://blog.contextures.com/archives/2010/06/21/fast-way-to-find-and-delete-excel-rows/希望這有助於任何人

實例看字符串「紙」:

  1. 在「查找和替換」對話框的「查找內容」框中鍵入「paper」。
  2. 單擊全部查找,查看帶有「紙張」的單元格列表
  3. 在列表中選擇一個項目,然後按Ctrl + A選擇整個列表並選擇所有「紙張」單元格工作表。
  4. 在功能區的「主頁」選項卡上,單擊「刪除」,然後單擊「刪除工作表行」。
+0

輝煌!我可以找到批量執行此操作的唯一方法(不使用VBA)。 – Holf

+0

這是應該被接受的答案。當您有超過50,000行時,使用過濾器是不可行的 –

+0

僅供參考:這是一個僅限於Windows的解決方案,不適用於OSX Excel unfortunatley。 –

2

在「開發人員選項卡」中,轉到「Visual Basic」並創建一個模塊。複製粘貼以下內容。記住改變代碼,取決於你想要的。然後運行該模塊。

Sub sbDelete_Rows_IF_Cell_Contains_String_Text_Value() 
    Dim lRow As Long 
    Dim iCntr As Long 
    lRow = 390 
    For iCntr = lRow To 1 Step -1 
     If Cells(iCntr, 5).Value = "none" Then 
      Rows(iCntr).Delete 
     End If 
    Next 
    End Sub 

lRow:將當前文件具有的行數。

「5」中的數字「如果」是第五(E)列

4

我想添加到@ MBK的答案。雖然我發現@MBK的答案對於解決類似問題非常有幫助,但如果@MBK包含如何過濾特定列的屏幕截圖,會更好。 enter image description here

相關問題