2012-01-04 50 views
2

我有一個包含三列的列表。第一列包含名稱,其他兩列包含數字。該宏取第一個名稱(A1),然後向下搜索列A以查找另一個事件。加快搜索和刪除宏

當它找到它時,會刪除整行。然後轉到A2並執行相同的操作。它適用於大約500個條目,但使用3000個條目會顯着降低速度。有沒有辦法加快這個代碼?

Sub Button1_DeleteRow() 

Dim i As Integer 
Dim j As Integer  
Dim Value As Variant 
Dim toCompare As Variant 

For i = 1 To 3000  
    Value = Cells(i, 1) 
    For j = (i + 1) To 3000 
     toCompare = Cells(j, 1) 
     If (StrComp(Value, toCompare, vbTextCompare) = 0) Then 
      Rows(j).EntireRow.Delete 
     End If 
     Next j 
Next i 

End Sub 

回答

4

如果您正在運行xl07/10,那麼你可以用Remove Duplicates一行做到這一點。如果您運行的03,然後用自動篩選的解決方案將是最有效的(我可以提供這樣的,如果你是上了年紀的版本)

刪除重複

  1. 手動

    • 選擇列A
    • 數據....刪除重複項目
    • 展開選擇
  2. 代碼

    ActiveSheet.Range("$A$1:$A$3000").EntireRow.RemoveDuplicates Columns:=1, Header:=xlNo

before only A after

+2

+1很好的呈現! – 2012-01-04 07:46:26

+0

謝謝,很好的答案。你可以建議,但爲什麼宏需要這麼長時間?我如何加快速度? – Ali 2012-01-04 13:50:37

+1

@Ali你是指你目前的代碼?如果是這樣,它運行= 3000 *(3000/2)-1500 = 4498500循環。範圍內環路固有的慢一)加快步伐,你chould在代碼年底關閉ScreenUpdating和計算的代碼開始(並重新打開)b)如果您刪除行,你必須刪除下向上頂不下來,以避免跳過行(即,如果你有兩個連續的代碼會丟失你的代碼)。 – brettdj 2012-01-05 00:22:04

3

只選擇A列中找到重複爲了補充@ brettdj的答案,如果你正在運行的Excel 2003年,你可以做到這一點唱AdvancedFilter如下:

Range("A1:A11").AdvancedFilter Action:=xlFilterInPlace, Unique:=True 

注:AdvancedFilter假定您的範圍(在此示例行A)的第一行包含列標題和將不包括在過濾該行。

要做到這一點手動:數據>篩選>高級篩選...>重複的記錄

2

使用Bretts技術是一個很好的答案:但要回答你爲什麼要花這麼長的問題:
- 你的宏從一個接一個超過400萬個單元獲得價值。這非常慢。
- 我沒有看到您的宏已關閉屏幕更新和自動計算:每次刪除一行時,屏幕將刷新並重新計算Excel。如果你還沒有關閉它,它會很慢。
此代碼應該運行得更快

Option Explicit 
Sub Button1_DeleteRow() 
Dim i As Long 
Dim j As Long 
Dim vArr As Variant 
Dim iComp As Long 
Dim Deletes(1 To 3000) As Boolean 
Application.ScreenUpdating = False 
iComp = Application.Calculation 
Application.Calculation = xlCalculationManual 
vArr = Range("a1:A3000") 
For i = 1 To 3000 
    For j = (i + 1) To 3000 
     If (StrComp(vArr(i, 1), vArr(j, 1), vbTextCompare) = 0) Then 
      Deletes(j) = True 
     End If 
     Next j 
Next i 
For j = 3000 To 1 Step -1 
If Deletes(j) Then Rows(j).EntireRow.Delete 
Next j 
Application.ScreenUpdating = True 
Application.Calculation = iComp 
End Sub 
0

排序的列A的數據,然後將使它瑣碎單程


識別和刪除重複的迴應評論下面,我將解釋爲什麼排序是一種有用的技術。

到A列排序爲順序,刪除重複簡直變成相鄰條目A列中比較然後,您可以刪除重複的行,你找到他們或標誌,以備日後缺失的問題。

這個過程實際上應該沒那麼繁瑣,因爲你只需要對列表進行排序(並且排序,內置,往往非常快),然後通過列表刪除一次(而不是4498500) /正在標記(顯然,如果你去標記,你需要一個後續的清理通行證)。

在改變列表中的順序的問題,通過添加一個額外的列(例如,列d)開始,並且具有D2包含值2(即只是行數)。稍後快速填充並每行都編號。在排序和刪除/標記後,恢復原始訂單只是在D列上重新排序然後可以刪除的問題。

我用這個方法時,我必須在重複執行一些操作或其它。換句話說,列A具有重複的值,但列B和C中的值是有意義的(例如,我可能想要彙總來自與列A的特定值有關的所有條目的這些值)。在許多情況下,但是,它會更容易只是使用SQL來達到同樣的效果

+0

爲什麼?列表進行排序,帶你沒有接近刪除其他的受騙者不是使極端的方法(在3000項少一些繁瑣的手動檢測),加上它改變紙張佈局 – brettdj 2012-01-05 08:45:22

+0

@brettdj我已經編輯我的回答對您的評論作出迴應 – barrowc 2012-01-07 07:18:54