任何人都可以帮助我。我开发了跟踪大量数据的宏(在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上做。提前谢谢。
答案 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)
只需使用连接公式
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
它的工作。我认为这是更有前途的方法,因为你不需要排序或过滤技术,但一个未使用的列。任何反馈请告诉我