2016-06-23 40 views
0

我有一列数据,其中有字符串值。我想通过该列中的每个单元格进行比较,并检查值是否重复。比较需要全文以及通配符。使用vba删除excel中的重复行

下面

是我的数据的截图

Screenshot

,如果你看到的截图,该公司CES有限公司第3排的存在,以及对列17与另一家公司ECLERX SERVICES LTD沿着| CES有限公司。所以我想突出显示这样的重复值。

下面是我写的

Dim rangeToUse As Range, singleArea As Range, cell1 As Range, cell2 As Range, i As Integer, j As Integer 
 

 
Set rangeToUse = Selection 
 

 
Cells.Interior.ColorIndex = 0 
 
Cells.Borders.LineStyle = xlNone 
 

 
For Each singleArea In rangeToUse.Areas 
 
    singleArea.BorderAround ColorIndex:=1, Weight:=xlThin 
 
Next singleArea 
 

 
For i = 1 To rangeToUse.Areas.Count 
 
    For Each cell1 In rangeToUse.Areas(i) 
 
    MsgBox cell1.Value 
 
     For j = 1 To rangeToUse.Areas.Count 
 
       For Each cell2 In rangeToUse.Areas(j) 
 
        If cell1.Value = cell2.Value Then 
 
         cell2.Interior.ColorIndex = 38 
 
        End If 
 
        MsgBox cell2.Value 
 
       Next cell2 
 
     Next j 
 
    Next cell1 
 
Next i

但是代码突出显示所有不同的细胞中的代码。任何人都可以让我知道我在做什么错?

+0

当谈到创建在Excel中唯一值的列表,没有什么比一个很好的旧['Dictionary'对象(http://stackoverflow.com/questions/915317/does-vba - 具备词典结构)。 – Tim

+0

它们将是相同的颜色,因为当你遍历列表时,在某个时候,'cell1'和'cell2'将引用同一个单元格,这当然会通过你的匹配测试。您需要排除cell1与自身进行比较。 –

回答

0

您的代码总是会找到重复因为你的比较之一将永远是自己的单元格。

以下是使用Collection对象来检测重复项的方法。如果尝试使用与现有项目相同的密钥添加项目,集合将返回错误。我们测试了这一点。

我们还需要在单元中有两个(或更多)时拆分公司名称。在你的示例中,它们看起来被|(被空间包围的管道)分开,但检查有时截图并不理想。

看看这个让你开始:


Option Explicit 
Sub ColorDups() 
Dim rangeToUse As Range, singleArea As Range, cell1 As Range, cell2 As Range, i As Integer, j As Integer 
Set rangeToUse = [a1:a23] 'hard coded for testing 

Cells.Interior.ColorIndex = 0 
Cells.Borders.LineStyle = xlNone 

For Each singleArea In rangeToUse.Areas 
    singleArea.ClearFormats 
    singleArea.BorderAround ColorIndex:=1, Weight:=xlThin 
Next singleArea 

'Generate Unique companies list and flag duplicates 
Dim colCompanies As Collection 
Dim vCompany As Variant 
Dim S(0 To 1) As String 
Set colCompanies = New Collection 
On Error Resume Next 
For i = 1 To rangeToUse.Areas.Count 
    For Each cell1 In rangeToUse.Areas(i) 
     vCompany = Split(cell1.Text, " | ") 
     For j = LBound(vCompany) To UBound(vCompany) 
      S(0) = Trim(vCompany(j)) 
      S(1) = cell1.Address 
      colCompanies.Add S, S(0) 
      Select Case Err.Number 
       Case 457 'we have a duplicate 
        Err.Clear 
        cell1.Interior.ColorIndex = 38 
        Range(colCompanies(S(0))(1)).Interior.ColorIndex = 38 
       Case Is <> 0 'debugstop 
        Debug.Print Err.Number, Err.Description 
        Stop 
      End Select 
     Next j 
    Next cell1 
Next i 
On Error GoTo 0 

End Sub 

这是使用你的数据和上面的宏结果。您可以通过使用多种不同的颜色和/或通过输出匹配的单元格范围来增强;等

enter image description here

+0

嗨@Ron,谢谢......您的解决方案帮助了我。谢谢你的帮助。我将修改为具有不同的颜色 –

0

这会给你出现的次数在您选择

WorksheetFunction.CountIf(rangeToUse, “” &小区2 & “”)

它看来,您将可以通过迭代一个不连续的选择。如果您希望计算小区2的区域出现的次数使用

WorksheetFunction.CountIf(rangeToUse.Areas(J), “” &小区2 & “”)

0

在我看来,你正在编码以匹配确切的单元格值,但在你的例子中,你声明CES Limited和ECLERX SERVICES LTD | CES Limited应该返回一场比赛。

您还需要考虑如何将其标记为不同的颜色,如果ECLERX再次出现在它自己的/其他颜色上,会发生什么样的颜色?

如果您确实只是想按照以下代码返回重复项,您可能可以通过查找来实现此目的,如果您需要单独分隔代码公司,并且可能需要在单元格中拆分字符串,看看,如果这对你的作品,它会标志,其中一个单元的整个字符串在列放置1构成任何其他的一部分旁边:

Sub Whatever() 

Dim Loc As Range 
Dim Loc2 As Range 
Dim cell As Range 
Dim myrange As Range 

Set myrange = -Put Your Range Here- 

For Each cell In myrange 

    Set Loc = myrange.Cells.Find(What:=cell.Value) 
    Set Loc2 = myrange.FindNext(Loc) 
    If Not Loc2.Address = Loc.Address Then 

     Loc.Offset(0, 1) = 1 

     Do Until Loc2.Address = Loc.Address Or Loc2.Offset(0, 1) = 1 

      Loc2.Offset(0, 1) = 1 
      Set Loc2 = myrange.FindNext(Loc2) 

     Loop 

    End If 

Next cell 

Set Loc = Nothing 
Set Loc2 = Nothing 

End Sub