【问题标题】:macro works on 2007 and later but not on 2003 (remove duplicates). What I have to do to make it work on 2003宏适用于 2007 及更高版本,但不适用于 2003(删除重复项)。我必须做些什么才能让它在 2003 年运行
【发布时间】:2011-10-30 07:43:43
【问题描述】:

谁能帮帮我。我开发了一个宏来跟踪大量数据(在 excel 2007 vba 中开发的注释),它使用一些用户表单选项删除重复的条目。

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

这是我在 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 不支持此宏。是否有任何代码可用于执行这些任务?当我用谷歌搜索时,我发现高级过滤器 = > 唯一记录,但我认为这不起作用,因为我只需要检查 6 列值,但高级过滤器会检查所有列。但我不需要,因为有时 6 列可能相等,而其他列可能不相等,高级过滤器可能不会将其过滤成重复。

请帮帮我。我必须遵循什么代码或任何其他方式来做到这一点。从 2 天开始尝试,但没有找到解决问题的方法。建议我任何生效的方法或告诉我要遵循的路径,我将在 excel vba 2003 上执行。提前谢谢你。

【问题讨论】:

  • "从 2 天开始尝试,但没有找到解决问题的方法。"请向我们展示您的尝试。
  • 这6列你需要检查什么类型的数据?您可能能够将数据连接到一个辅助列中,或者使用其他方法将 6 列汇总到一个单元格中。删除重复项只是对帮助列进行排序并比较相邻行的问题
  • 在第一列我有一个名字,在第二列我有一个日期,在第三列我有数字,其余列包含数字
  • @jean 我尝试使用排序和公式来比较 6 列值,但这不是有效的任务,因为使用 2007 删除重复的宏我可以在 2 秒内删除 40000 个条目数据的重复项
  • @jean 并且工作仍然出错可能是公式我需要你们的帮助

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


【解决方案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 行重复。我发布的代码抓住了他们。

已经很晚了,我累了……希望对你有帮助。

【讨论】:

  • 与所涉及的行/单元格的数量有关,这将非常慢。最好将单元格值复制到 Variant 数组并迭代它
  • 天啊!我读了 150 行而不是 15000 行。是的,我同意。此外,它还可能使代码看起来更干净。
【解决方案2】:

嗨,贾斯汀和我问过上述问题的人。好吧,当我继续思考时,我有了一个想法。这就是我试图做的事情

只需使用连接公式

 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

它的工作原理。嗯,我认为这是更有前途的方法,因为您不需要排序或过滤技术​​,只需要一个未使用的列。有任何意见请告诉我

【讨论】:

    猜你喜欢
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多