宏在2007年及以后工作,但在2003年没有工作(删除重复)。我必须做些什么才能让它在2003上运作

时间:2011-08-19 04:20:53

标签: excel vba excel-2007 excel-2003 excel-2010

任何人都可以帮助我。我开发了跟踪大量数据的宏(在excel 2007 vba中开发的注释),它删除了带有一些用户表单选项的重复条目。

让我解释一下我的工作我有20列和15000行(可能每个月都在增加)。 我必须删除每个月添加的重复行。如果最小6列(20个中的)是相同的,则该行被认为是重复的。您不需要检查行中的所有20个cloumns值,但是如果只检查6个列值,则那些6列的2行值是相同的,那么你应该消除那一行

这就是我在excel 2007中所做的事情

Workbooks(1).Worksheets("duplicate_raw_sheet").Range(("$A$1:$R$65535"))._
 RemoveDuplicates Columns:=Array(1, 2, 6, 7, 8,9), Header:=xlYes

这是在excel 2007 vba中添加的宏,用于删除重复的条目。我只是检查列1,2,6,7,8,9并使用上面的2007宏删除行但不幸的是它在excel 2003上不起作用。

现在我需要在2003年实现它。但是excel 2003不支持这个宏。有没有可用于执行这些任务的代码?当我用Google搜索时,我发现了高级过滤器=>唯一的记录,但这不起作用我想是这样,因为我只需要检查6列值,但高级过滤器检查所有列。但我不需要,因为有时6列可能相等而其他列可能不相等,高级过滤器可能不会将其过滤为重复。

请帮助我们..我必须遵循的代码或其他任何方式。从2天开始尝试,但没有找到解决方法。建议我生效的任何方法或告诉我要遵循的路径我会在excel vba 2003上做。提前谢谢。

2 个答案:

答案 0 :(得分:1)

是的,不幸的是,您使用的功能仅在2007 +。

那么,您只关心第1,2,6,7,8,9列中的单元格是否相同?我假设这意味着你不在乎10-20是否完全相同。

有了这个假设,你可以尝试一下这个想法:

根据第一列对整个范围进行排序。 然后,循环遍历第一列中的每个单元格。 检查下一个单元格的值。如果下一个单元格相同,则偏移并检查同一行中的单元格的值,但是检查第二列。如果匹配,则继续通过所有6列。如果它们都匹配,则删除整行。

这样的事情(你需要为实现修改)

Sub test()
  Dim rng As Range
  Dim lastRow As Integer
  Dim rowsToDelete As New Collection
  Dim i As Integer
  lastRow = Range("A1").End(xlDown).row

  For Each rng In Range("A1:A9")
    For i = rng.row + 1 To lastRow
      If RowIsDuplicate(rng, i) Then _
        If NotExists(rowsToDelete, i) Then rowsToDelete.Add i
    Next i
  Next rng

  'now loop through the rowsToDelete collection and delete all of the rows

End Sub

Function RowIsDuplicate(source As Range, row As Integer) As Boolean

  RowIsDuplicate = False
  For n = 0 To 5
    'Offset(0, n) means, from the range, go down 0 rows and over n columns
    If source.Offset(0, n).Value <> Range("A" & row).Offset(0, n).Value Then _
      Exit Function
    If n = 5 Then RowIsDuplicate = True
  Next n

End Function

Function NotExists(col As Collection, i As Integer) As Boolean
  Dim v As Variant

  For Each v In col
    If v = i Then
      NotExists = False
      Exit Function
    End If
  Next v
  NotExists = True
End Function

我使用范围A1:F9

中的信息对此进行了测试
1   2   3   4   5   6
1   2   3   4   5   5
1   6   5   4   9   87
1   2   3   4   5   6
1   6   5   4   9   87
1   2   3   4   5   5
1   2   3   4   5   5
1   2   3   4   5   5
1   2   3   4   5   5

我在上表中有6个重复的行。我发布的代码抓住了他们。

已经很晚了,我累了......希望有所帮助。

答案 1 :(得分:0)

Hii Justin以及我问过上述问题的那些人。当我继续思考它时,我有了一个想法。这就是我试图做的事情

只需使用连接公式

 Cells(2,"T").Formula = "=CONCATENATE(A2,B2,F2,G2,H2,I2)" 'append all column values into one string then insert the formula till the end
 Range("T2").Copy Destination:=Range("T3:T39930") 'Apply formula to end of sheet 

现在在单个列中使用删除重复项。您可以删除重复的行。

Sub Remove_Duplicates_in_a_column()
Dim x As Long
Dim LastRow As Long
LastRow = 39930 ' last row number say 39930
For x = LastRow To 1 Step -1
If Application.WorksheetFunction.CountIf(Range("T1:T" & x), Range("T" & x).Text)>1 Then
        Range("T" & x).EntireRow.Delete
    End If
Next x
MsgBox "Finished The Process"
End Sub

它的工作。我认为这是更有前途的方法,因为你不需要排序或过滤技术​​,但一个未使用的列。任何反馈请告诉我