2012-03-10 54 views
3

我不知道是否有人知道如何刪除重複的行..比方說,如何查找重複的行然後刪除其中的一個?需要VBA

A  B  C 

1 1  3  4 
2 2  6  9 
3 TEST  1  2 
4 TEST  1  2 
5 Both  1 
6 Hi    2 
7 None  3  3 
8 Loud  4  4 

對於具體的例子以上,試驗重複兩次。在其他一些情況下,該名稱可以是一些NOON,Morning等其他類型。而第8行不一定是最後一行。 我不知道如何比較行來檢查重複的名稱,然後將它們刪除。我需要運行一個宏,所以我需要VBA。如果你知道它,請與我分享..將感恩!

嘗試爲代碼:

Sub Macro1() 

    Dim LastRow As Long, n As Long, rowstodelete As Long 

    LastRow = Worksheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row 

     For n = 1 To LastRow 

    With Worksheets("Sheet1").Cells(n, 1) 
     If .Cells(n, 1) = .Cells(n + 1, 1) Then 
      rowstodelete = Worksheets("Sheet1").Cells(n, 1) 
      Rows(rowstodelete).Select 
      Selection.Delete Shift:=xlUp 
     End If 
    End With 
     Next n 

End Sub 

不幸的是,有超過了運行時錯誤在.Cells(N,1)。我不知道爲什麼它..如果你知道的東西可以與我分享或者修改它一下。會很感激!

+2

而不是重複行(即A2,B2,C3匹配A3,B3和C3等),它似乎你只想刪除列A中重複的記錄。刪除行時,最好刪除底部以避免跳過行。 – brettdj 2012-03-10 10:49:45

+1

+1同意「自下而上」 – 2012-03-11 10:58:46

+0

我認爲你可能錯過了我的帖子下面的我的一行VBA解決方案 – brettdj 2012-03-12 02:26:20

回答

6

user1204868

建議刪除行的時候,總是做相反的模式。看到這個代碼。在刪除之前,您也不需要選擇單元格。這會減慢你的代碼:)

Sub Sample() 
    Dim LastRowcheck As Long, n1 As Long 

    With Worksheets("Sheet1") 
     LastRowcheck = .Range("A" & .Rows.Count).End(xlUp).Row 

     For n1 = LastRowcheck To 1 Step -1 
      If .Cells(n1, 1).Value = Cells(n1 + 1, 1).Value Then 
       .Rows(n1).Delete 
      End If 
     Next n1 
    End With 
End Sub 

這裏是一個更好和更快方式

Sub Sample() 
    Dim LastRowcheck As Long, n1 As Long 
    Dim DelRange As Range 

    With Worksheets("Sheet1") 
     LastRowcheck = .Range("A" & .Rows.Count).End(xlUp).Row 

     For n1 = 1 To LastRowcheck 
      If .Cells(n1, 1).Value = Cells(n1 + 1, 1).Value Then 
       If DelRange Is Nothing Then 
        Set DelRange = .Rows(n1) 
       Else 
        Set DelRange = Union(DelRange, .Rows(n1)) 
       End If 
      End If 
     Next n1 

     If Not DelRange Is Nothing Then DelRange.Delete 
    End With 
End Sub 

隨訪

任何想法,爲什麼反向行刪除比較好? - 富蘭克林29秒前

當你刪除行,你For循環弄亂你的目標行的定數。您必須像以前那樣編寫額外的代碼行,以跟蹤您刪除的行。它也會減慢你的代碼:)當你反向刪除時,你不必考慮刪除的行,因爲它不在當前的運行循環中。這樣你的代碼更快。但是就像我上面提到的,如果你不使用反向行刪除,那麼使用我給出的第二個代碼。這甚至更快。

但我想提一點。如果您使用的是Excel 2007/2010那麼@brettdj建議的一行代碼是最快的:)

HTH

希德

+0

任何想法爲什麼反向行刪除更好? – franklin 2012-03-13 17:46:58

+0

更新了我的文章:) – 2012-03-13 17:54:34

+0

@SiddharthRout:我正在經歷類似於問題中描述的情況。我試過你的代碼,但得到錯誤''聯盟'沒有宣佈。「請幫助。 – slyclam 2013-07-30 10:34:58

4

手冊
Bill Jelen's website提供三種非VBA技術

  1. 所有版本:使用在高級篩選唯一選項
  2. XL 07/10:使用條件格式化以重複標記
  3. XL 07/10:使用刪除重複圖標

對於(3)相當於VBA會是這樣的(因爲沒有頭)
ActiveSheet.Range("$A$1:$C$100").RemoveDuplicates Columns:=1, Header:=xlNo

enter image description here

處理現有的重複項目
我的免費Duplicate Master addin會讓你

  • 選擇
  • 顏色
  • 列表
  • 刪除的任何細胞

重複,整個行(這似乎是你的問題),或者某些列在一排

但更重要的是,它會讓你運行比精確字符串更復雜的匹配,即

  • 不區分大小寫/區分大小寫的搜索
  • 修剪/清潔數據
  • 刪除所有空格(包括CHAR(160))
  • 運行的正則表達式的列上的任意組合相匹配
  • 匹配(即列A,所有列,列A &乙等) enter image description here
+0

嗨,我需要vba ..我正在運行宏..這就是爲什麼。 – user1204868 2012-03-10 09:33:08

+0

@ user1204868以及你沒有在你的問題中指定該要求。我的插件是一個宏觀解決方案,但菜單驅動,而不是你可以直接編碼。 – brettdj 2012-03-10 09:45:51

+0

哦..對不起。我沒有意識到這一點,因爲我認爲可能與VBA和VBA excel的標籤,它應該是非常清楚..將注意到..順便說一句,你對編碼有什麼想法嗎? – user1204868 2012-03-10 09:49:17

0

我曾經再次嘗試我的代碼,它可以工作以及..釷anks!我將在這裏分享它來回答將來的類似問題!

Sub Macro1() 

    Dim LastRowcheck As Long, n1 As Long, rowschecktodelete As Long 

    LastRowcheck = Worksheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row 

    For n1 = 1 To LastRowcheck 
    With Worksheets("Sheet1").Cells(n1, 1) 
     If Cells(n1, 1) = Cells(n1 + 1, 1) Then 
     Worksheets("Sheet1").Cells(n1, 1).Select 
     Selection.EntireRow.Delete 
    End If 
    End With 
    Next n1 

    End Sub 
0
爲此在VBA(在2007或更高版本)

最簡單的方法:

Worksheet("Sheet1").Range("A1").CurrentRegion.RemoveDuplicates(Array(1, 2, 3))

根據您的工作表的佈局,你可能需要調整Range("A1").CurrentRegion到您的數據範圍......

+0

如何製作'Array(1,2,3)'dynamic – shareef 2016-03-24 07:34:02

+0

@shareef您想讓它變成動態的?元素的數量或哪些列?你顯然可以根據你的需要改變'Array(1,2,3)'到任何其他數組... – 2016-03-25 13:47:08

+1

謝謝你的答覆,實際上我解決了它,併發布我的答案在這裏我的問題http://stackoverflow.com/問題/ 36195792/VBA決策-A-列數variabl陣列換removeduplicates/36195793#36195793 – shareef 2016-03-25 15:43:08

-3

我認爲我們需要在運行這個宏之前先對數據進行排序,以完全刪除重複項。

相關問題