2011-08-19 64 views
0

任何人都可以請幫助我。我開發了宏跟蹤大量的數據(在Excel 2007 vba中開發的註釋),它用一些用戶窗體選項刪除重複項。宏在2007年和更晚的工作,但不是在2003年(刪除重複項)。我必須做些什麼來使它在2003年工作

讓我解釋我的工作我有20列和15000行(可能會增加每月)。 我必須刪除每月添加的重複行。如果最小值6列(20)中的值相同,則該行被認爲是重複的。您不需要檢查行中的所有20個cloumns值,但只有6列值如果2行的6列的值是相同的,那麼你應該消除該行

這是我在Excel 2007

Workbooks(1).Worksheets("duplicate_raw_sheet").Range(("$A$1:$R$65535"))._ 
RemoveDuplicates Columns:=Array(1, 2, 6, 7, 8,9), Header:=xlYes 

做了這是在Excel中添加2007 VBA宏刪除重複項。我只是檢查列1,2,6,7,8,9並刪除使用上述2007宏的行但不幸的是,它不適用於Excel 2003。

現在我需要在2003年實現它,但該宏在Excel 2003中不受支持。是否有任何代碼可用於執行這些任務?當我GOOGLE時,我發現先進的過濾器=>獨特的記錄,但這不起作用,我認爲是這樣,因爲我需要檢查只有6列值,但先進的過濾器檢查所有列。但我不需要,有時6列可能相等,其他列可能不相等,高級過濾器可能不會將其過濾爲重複。

請幫助我們..什麼代碼我必須遵循或任何其他方式來做到這一點。嘗試從2天,但沒有得到解決的辦法。向我建議任何可以生效的方法或向我展示遵循的途徑我將在Excel 2003 vba上進行操作。先謝謝你。

+0

「嘗試從2天,但沒有得到解決辦法。」請告訴我們你的嘗試。 –

+0

需要檢查的6列中的數據類型是什麼?您可以將數據連接到一個幫助列或使用其他方法將6列彙總到一個單元中。刪除重複只是一個問題,排序助手列和比較相鄰的行 – barrowc

+0

在1列中我有一個名稱,在2列中我有一個日期,在第三列中我有號碼和其餘列包含數字 – niko

回答

1

是的,不幸的是,你使用的功能只在2007+。

那麼,你只關心第1,2,6,7,8,9列中的單元格是否相同?我假設這意味着你不在乎10-20是否完全相同。

在這個假設下,這裏有一個想法,你可以嘗試:基於第一列整個範圍

排序。 然後,循環遍歷第一列中的每個單元格。 檢查下一個單元格的值。如果下一個單元格相同,則偏移並檢查同一行中第二列的單元格值。如果匹配,則繼續通過所有6列。如果全部匹配,請刪除整行。 F9

 
1 2 3 4 5 6 
1 2 3 4 5 5 
1 6 5 4 9 87 
1 2 3 4 5 6 
1 6 5 4 9 87 
1 2 3 4 5 5 
1 2 3 4 5 5 
1 2 3 4 5 5 
1 2 3 4 5 5 

我有6重複:

所以這樣的事情(你會需要修改你的實現)

Sub test() 
    Dim rng As Range 
    Dim lastRow As Integer 
    Dim rowsToDelete As New Collection 
    Dim i As Integer 
    lastRow = Range("A1").End(xlDown).row 

    For Each rng In Range("A1:A9") 
    For i = rng.row + 1 To lastRow 
     If RowIsDuplicate(rng, i) Then _ 
     If NotExists(rowsToDelete, i) Then rowsToDelete.Add i 
    Next i 
    Next rng 

    'now loop through the rowsToDelete collection and delete all of the rows 

End Sub 

Function RowIsDuplicate(source As Range, row As Integer) As Boolean 

    RowIsDuplicate = False 
    For n = 0 To 5 
    'Offset(0, n) means, from the range, go down 0 rows and over n columns 
    If source.Offset(0, n).Value <> Range("A" & row).Offset(0, n).Value Then _ 
     Exit Function 
    If n = 5 Then RowIsDuplicate = True 
    Next n 

End Function 

Function NotExists(col As Collection, i As Integer) As Boolean 
    Dim v As Variant 

    For Each v In col 
    If v = i Then 
     NotExists = False 
     Exit Function 
    End If 
    Next v 
    NotExists = True 
End Function 

我在範圍A1的信息測試這上表中的行。我貼的代碼抓住了他們。

它很晚了,我很累...希望有所幫助。

+2

與行數/單元格涉及,這將是非常緩慢的。最好將單元格的值複製到一個Variant數組中,然後通過這個來代替 –

+0

Oh Dhang!我讀了150行而不是15000.是的,我同意。此外,它可能會使代碼看起來更乾淨。 –

0

嗨,賈斯汀和我問上述問題的傢伙。當我一直在想這件事時,我有了一個想法。這就是我試圖做

只需使用串聯式

Cells(2,"T").Formula = "=CONCATENATE(A2,B2,F2,G2,H2,I2)" 'append all column values into one string then insert the formula till the end 
Range("T2").Copy Destination:=Range("T3:T39930") 'Apply formula to end of sheet 

現在使用刪除重複的一列。您可以刪除重複的行。

Sub Remove_Duplicates_in_a_column() 
Dim x As Long 
Dim LastRow As Long 
LastRow = 39930 ' last row number say 39930 
For x = LastRow To 1 Step -1 
If Application.WorksheetFunction.CountIf(Range("T1:T" & x), Range("T" & x).Text)>1 Then 
     Range("T" & x).EntireRow.Delete 
    End If 
Next x 
MsgBox "Finished The Process" 
End Sub 

而且其working.Well我認爲這是對的做法,因爲你不需要排序或篩選技術,但一個未使用的列更有前途的方法。任何反饋請讓我知道

相關問題