2014-05-23 118 views
1

我正在努力應該是相當直接的事情,但是,我已經閱讀了至少15個這樣做的方法,似乎無法使其工作。刪除行重複數據VBA

下面是一個簡單的數據集:

9:30:01 584.7 
9:30:01 590 
9:30:01 595 
9:30:02 584.51 
9:30:03 584.62 
9:30:04 584.44 
9:30:05 584.05 

我只想每秒一行,所以第3行中,只有一個需要保持。我不在乎它是第一個還是最後一個,但是我一直使用的代碼保留了最後一個,在這種情況下是595。

我這樣做的方式是用for循環清除與其下面的行具有相同時間的行的內容。然後我整理整個範圍。

我想有一種簡單的方法可以簡單地刪除額外的行。但是,當我使用範圍上的刪除而不是清除時,它不會刪除所有重複的行。

這是我想要的數據看起來像:

9:30:01 595 
9:30:02 584.51 
9:30:03 584.62 
9:30:04 584.44 
9:30:05 584.05 

我需要這樣的事情發生的整個工作表。的時間是B列和值列C.

這裏是我使用的代碼,

LastRow = ActiveSheet.UsedRange.row - 1 + _ 
    ActiveSheet.UsedRange.Rows.Count 

For RowNum = 2 To LastRow 
    If (Range("B" & RowNum) = Range("B" & RowNum + 1)) Then 
    Range("B" & RowNum).EntireRow.Clear 
    End If 
Next RowNum 

Range("A2:C" & LastRow).Sort key1:=Range("B2:B" & LastRow), _ 
order1:=xlAscending, Header:=xlNo 
+1

如果你循環底部,那麼你可以立即刪除行。分享你的代碼,我會幫你解決這個問題。 –

+1

@PortlandRunner提供了一個很好的解決方案 - 您也可以爲此使用Range.RemoveDuplicates方法(特別是因爲您的列結構定義得非常好)...以下是MSDN參考:http://msdn.microsoft.com/ en-us/library/office/ff193823(v = office.15).aspx –

+0

@Portland Runner我已添加代碼。你的想法聽起來很聰明。 – mks212

回答

7

不要循環。使用RemoveDuplicates。比任何循環都快。一行代碼。

Sub test() 
    ActiveSheet.Range("B:C").RemoveDuplicates Columns:=1, Header:=xlNo 
End Sub 

編輯:截圖

enter image description here

enter image description here

編輯:不會在Excel 2011工作的Mac(去圖)。

+0

只有當兩列中的值都重複時,這才起作用。它不會僅基於9:30:01重複的事實刪除行。 – mks212

+0

你測試過了嗎? – teylyn

+0

@ user2926358我添加了一些屏幕截圖,並將代碼修改爲列B和C而不是A和B – teylyn

2

這應該做的伎倆:

Sub jzz() 
Dim i As Long 
For i = 1 To Cells.SpecialCells(xlLastCell).Row 'loop from row 1 to last row 
    If Cells(i, 1) <> vbNullString Then 'check if something is in the cell 
     If Cells(i, 1) = Cells(i + 1, 1) Then 'check if cell is the same as next cell 
      Cells(i + 1, 1).EntireRow.Delete 'if so; delete 
      i = i - 1 'go back one row 
     End If 
    End If 
Next i 
End Sub 

另一種選擇是從去自下而上,如下所示:

Sub jzz() 
Dim i As Long 
For i = Cells.SpecialCells(xlLastCell).Row to 1 step -1'loop from last row to row 1 
    If Cells(i, 1) <> vbNullString Then 'check if something is in the cell 
     If Cells(i, 1) = Cells(i + 1, 1) Then 'check if cell is the same as next cell 
      Cells(i + 1, 1).EntireRow.Delete 'if so; delete 
     End If 
    End If 
Next i 
End Sub 

如果您是個人用戶,您更願意使用哪種方式。請考慮teylyn的答案,在這種情況下,它非常有用。

+0

謝謝Jzz。我有這樣的事情,它只會刪除第二項並離開第三項。 – mks212

+0

對不起,我的壞!只需忘記一行(至關重要)的代碼。我編輯了我的答案。訣竅是一旦刪除下面的行,就會返回一行,以便該值再次被評估。 – Jzz

+0

Jzz,這就行了!我可以打賭很多錢,我嘗試了這個確切的事情,但它沒有奏效。我會在明天完整的數據集上運行它,希望它能做到這一點。再次感謝。 – mks212