2014-12-04 56 views
-1

我有一個電子表格,可以從3種不同類型的文件中導入一堆數據。它將其格式化爲使所有三個輸出都相同,在一種情況下,需要根據該行的單元格中的內容刪除行。問題是,這需要花費大約1.5到2分鐘的時間,而其他文件的格式化所花費的時間(沒有刪除梯級的時間)需要花費幾秒鐘。工作表開始大約4000行,並刪除其中約1600。我目前的做法工作正常,一切正常,但有沒有辦法做到這一點會跑得更快?需要關於如何加快這一位代碼的建議

rw = 1 
Lastrow = 2600 
NewRow = 0 

NxtChk2: 
    If (Worksheets("ARCSRT.CND").Cells(rw, "c") >= "0") And (Worksheets("ARCSRT.CND").Cells(rw, "d") = "") Then 
     Worksheets("ARCSRT.CND").Rows(rw).EntireRow.Delete 
     rw = rw - 1 
    End If 
    If (Worksheets("ARCSRT.CND").Cells(rw, "b") = "0.0") And (Worksheets("ARCSRT.CND").Cells(rw, "c") = "") Then 
     Worksheets("ARCSRT.CND").Rows(rw).EntireRow.Delete 
     rw = rw - 1 
    End If 
    If rw = Lastrow Then GoTo LATER 
    rw = rw + 1 
GoTo NxtChk2 
+1

首先,關閉screenupdating,將計算設置爲手動,並禁用事件。如果這樣做不夠快,可以嘗試使用數組和集合來完成VBA中的所有工作,以避免多次讀取/寫入工作表。請參閱Chip Pearson的網站,瞭解如何在單個步驟中將數組讀取和寫入一個範圍。 – 2014-12-04 13:24:29

+0

一切已經關閉,這就是爲什麼其他兩種文件類型運行得足夠快。我沒有嘗試過陣列,並會檢查出芯片網站。謝謝。 – oshoguno 2014-12-04 14:00:15

+0

David,我看不出你的鏈接或下面的答案與我的問題有什麼關係。我正在問如何加快在Excel中刪除橫檔,而不是在Word中替換單詞。我不知道你們兩個在說什麼,除非我有什麼遺漏。 – oshoguno 2014-12-04 18:21:42

回答

0

,請嘗試以下
這個循環之前去:
Dim rng As Range

Set rng = Nothing

的循環,而不是排

刪除做到這一點:

If rng = Nothing Then
rng = Cells(rw, "A")
Else
rng = Union(rng, Cells(rw, "A"))
End If

再經過循環完成:

rng.EntireRow.Delete

記住我不知道它是如何將在1600非連續的行運行,在備份副本上運行

+0

我最終使用了你的答案變體和Chris Neilsen提供的答案。你在標記線路然後將其添加到一個範圍內,然後一次刪除整個範圍的速度會更快。我知道根據我現有的標準標記我的線,然後使用Siddharth Rout答案中的代碼來設置和刪除範圍。我的宏運行週期已經下降到大約1分鐘。感謝您的幫助。 – oshoguno 2014-12-08 15:06:31

0

如果列表的排序是一種選擇,而不是逐個刪除一行只是將它們標記有「旗幟」,在一個單獨的列,即字母「X」,一旦週期結束後,讓你的代碼要對該列上的數據進行排序,並一次刪除整批標記的行,它將執行一次刪除操作而不是1600次。從我的評論如下

+0

非常有趣,我仍然需要逐行使用代碼來確定是否需要刪除行並將其標記。這比直接刪除該行更快嗎? (是否將X放入單元格的過程比刪除行更快?)如果我需要維護其他兩個文件的格式,則在刪除行之後,如果不按照相同的順序放回數據,我無法對其進行排序。我的另一個想法是如何一次刪除1600個不相鄰的行?我很欣賞投入! – oshoguno 2014-12-04 19:22:50

+0

英里更快。它與刪除數百行的比較類似,在某些不連續的標準上篩選出來,與刪除相同的行相比較,但首先在篩選的標準上進行排序。 P.S.我試圖嘗試構建需要刪除的所有行的聯合,但它不會保留那麼多行來刪除,粗略計數,它將達到100個上限。 P.P.S如何做相反的循環:從下往上刪除行也是更快? – Raugmor 2014-12-04 19:50:32

+0

實際上嘗試了下面的方法,'dim rng as Range','set rng = Nothing',然後代替行刪除嘗試以下內容: '如果rng = Nothing然後 rng = Cells(rw,「A」) 其他 RNG =聯盟(RNG,細胞(RW,「A」)) 結束如果 ' 再經過整個循環跑這樣做:'rng.EntireRow.Delete ' 請注意我不知道它怎麼會在1600個非連續範圍上工作,所以在備份文件上也是如此 PS嗯,我真的應該弄清楚如何用換行符以更好的方式進行評論,將在一個單獨的答案中發佈代碼 – Raugmor 2014-12-04 20:05:16