2014-03-24 102 views
1

我一直用下面的公式來測試一個列有一個條目是否在第二列中存在:比較列表和刪除重複

=COUNTIF($E$1:$E$99504,$I1)>0 

我希望能夠做的是說如果上述式的值爲真,刪除來自第二列中的重複條目(即,在E1-E99504範圍重複的),和移位該條目向上的細胞。我相信,除了單元格移位之外,這可以在沒有VBA的情況下完成。

不過,我有5列在這種特殊情況下進行比較,更多的可能是在未來。因此,我試圖確定一種方法來使用VBA在多個列上執行上述操作。否則,我需要運行相同的過程10次,我真的覺得我應該學習更有效的方法。比較的層次結構如下所示:

假設我們有列A,B,C,d,E。甲相比B,然後到C,然後到d,其中在未定影的列每次重複被去除,而在A中的條目保持。然後B被固定,以相同的方式移動通過C,D和E,並且B中的條目被保留。類似地,直到D與E比較並且過程完成。有人已經做出了這樣的算法嗎?任何幫助,將不勝感激。

+0

刪除單元格**可能需要** VBA ** –

+0

您可以在工作簿中創建一些元數據,方法是列出要比較的列並將VBA代碼指向該列表。在你的代碼可以同時搜索在任一列的副本,並避免通過片X倍(X =列數來比較)循環。 –

+0

你也可以創建一個只向上看的countif(在這種情況下'countif($ E $ 1:$ E1,$ I1)> 0')。如果您對所有x列執行此操作並取其全部最大值,則可以對其進行過濾並刪除所有違規的過濾行... –

回答

1

使用純VBA解決方案,假設你的數據是這樣的:

enter image description here

我推薦工作倒退,因爲我們刪除和周圍轉移數據。試試這個代碼:

Sub removeDuplicates() 
    Dim lastCol As Integer 
    lastCol = 5 'col 5 is column E 

    Dim wks As Worksheet 
    Set wks = Worksheets("Sheet1") 

    Dim searchRange As Range 
    Set searchRange = wks.Range("A1:A" & wks.Cells(Rows.Count, "A").End(xlUp).Row) 

    Dim compareArray As Variant 
    Dim searchArray As Variant 

    'Get all values from Col A to search against 
    compareArray = searchRange.Value 

    For col = lastCol - 1 To 1 Step -1 
     'Set values to search for matches 
     searchArray = searchRange.Offset(0, col - 1).Value 

     'Set values to last column to compare against 
     compareArray = searchRange.Offset(0, col).Value 

     For i = 1 To UBound(compareArray) 
      If compareArray(i, 1) = searchArray(i, 1) Then 
       'Match found, delete and shift left 
       Cells(i, col).Delete Shift:=xlToLeft 
      End If 
     Next i 
    Next col 
End Sub 

結果:

enter image description here


請確保您更新工作表名稱,範圍,最後一列號碼,以符合您的標準。

+0

這是非常有幫助的,我唯一的問題是,爲什麼在副本已被刪除後發生的變化。這不會將元素引入列中以前不存在的列嗎?理想情況下,我只能通過將單元格移動到空白處去除元素並擺脫空白區域。當我想起它時,我懷疑原因是我的描述太模糊了。 – 114

+0

我假設每一行都是自己的重要數據集。因此,代碼只能逐行匹配,刪除和移位數據。現在行之間沒有邏輯。如果我理解正確,那將需要另一個循環。如果您需要更多幫助,請編輯您的帖子以在拍攝前後包含樣本。 –

+0

我想我們是在同一頁面上,唯一的區別是每列是它自己的重要數據集。然而,我發現我可以很容易地轉換每一列,只要我正確理解宏,這就可以很好地工作。我的另一個想法是,我可以將Shift:xlToLeft語句更改爲Shift:xlUp,但是如果其餘代碼假定可能存在問題的基於行的字段。再次感謝你的幫助!編輯:進一步檢查後,搜索範圍似乎根據需要列爲基礎,所以我可能不清楚所用的過程。 – 114