2014-03-13 31 views
2

我目前有一个VBA宏,它已经做到了,但并不完全是我所需要的。查找并删除行中的重复单元格,而不是列

这里的VBA:

Sub StripRowDupes() 
    Do Until ActiveCell = "" 
     Range(ActiveCell, ActiveCell.End(xlToRight)).Select 
     For Each Cell In Selection 
      If WorksheetFunction.CountIf(Selection, Cell) > 1 Then 
       Cell.ClearContents 
      Else 
      End If 
     Next Cell 
     On Error Resume Next 
     Selection.SpecialCells(xlCellTypeBlanks).Delete Shift:=xlToLeft 
     ActiveCell.Range("A2").Select 
    Loop 
End Sub 

和示例片数据(是在每行中重复):

A | B | C | D 
dog | cat | goat | dog 
car | ship | plane | ship 

运行此宏之后,它删除第一行和结果副本的实例如下所示:

A | B  | C 
cat | goat | dog 
car | plane | ship 

我需要的是删除重复的最后一个实例,不是第一,有以下结果:

A | B | C 
dog | cat | goat 
car | ship | plane 

什么在当前VBA脚本改为得到期望的结果?

回答

3

UPD:

Sub StripRowDupes() 
    Dim c As Range, rng As Range 
    Dim lastcol As Long 
    Dim i As Long 
    Dim rngToDel As Range, temp As Range 

    Application.ScreenUpdating = False 

    Set c = ActiveCell 

    Do Until c = "" 
     lastcol = Cells(c.Row, Columns.Count).End(xlToLeft).Column 
     Set rng = c.Resize(, lastcol - c.Column + 1) 

     For i = lastcol To c.Column Step -1 
      If WorksheetFunction.CountIf(rng, c.Offset(, i - 1)) > 1 Then c.Offset(, i - 1).ClearContents 
     Next i 

     On Error Resume Next 
     Set temp = rng.SpecialCells(xlCellTypeBlanks) 
     On Error GoTo 0 

     If Not temp Is Nothing Then 
      If rngToDel Is Nothing Then 
       Set rngToDel = temp 
      Else 
       Set rngToDel = Union(rngToDel, temp) 
      End If 
     End If 

     Set c = c.Offset(1) 
     Set temp = Nothing 
    Loop 

    If Not rngToDel Is Nothing Then rngToDel.Delete Shift:=xlToLeft 

    Application.ScreenUpdating = True 
End Sub 
+1

呀。对于每个人都会很方便......但不幸的是,每个人都无法做到“向后”。 :D – Taosique

+1

@simoco谢谢你似乎以我需要的方式工作 – CamSpy

+0

@simoco似乎陷入了数千行大单。任何解决方法,所以它可以简单地完成任务,即使它需要更多的时间? – CamSpy

相关问题