删除excel 2003 vba中列中的重复条目

时间:2011-08-24 11:21:41

标签: excel vba excel-vba excel-2003

问题是,我有一个专栏,例如Y列中有很多条目,接近40,000,每周都会增加。问题是我必须检查Y列中的重复项并删除整行。因此,Y列应该只有唯一的条目。

假设我有3,000个条目,一周后,我将有大约3,500个条目。现在我必须检查这些新添加的500列值而不是3,500与旧+新3,500条目并删除重复行。不应删除或更改旧的3,000。我找到了宏,但他们为整个专栏做了诀窍。我想过滤新的500个值。

 Cells(2, "Q").Formula = "=COUNTIF(P$1:P1,P2)=0"   'I have used these formula 
 Range("Q2").Copy Destination:=Range("Q3:Q40109")  'it gives false for the duplicate values

我知道我们必须使用countif作为重复条目。但我正在做的是应用公式,然后搜索错误的条目,然后删除它。我相信应用公式并找到假,然后删除它的一点点时间。

Sub DeleteDups() 
Dim x               As Long 
Dim LastRow         As Long 
LastRow = Range("A65536").End(xlUp).Row 
For x = LastRow To 1 Step -1 
    If Application.WorksheetFunction.CountIf(Range("A1:A" & x), Range("A" & x).Text) > 1 Then 
        Range("A" & x).EntireRow.Delete 
    End If 
Next x   
End Sub 

这是我在谷歌上发现但我不知道错误在哪里。如果我设置

,它将删除所有列
For x = LastRow To 1 Step -1 
For x = LastRow to step 3000 ' It is deleting all 500 columns but if it is -1 working fine

需要对这些功能进行任何修改吗?或者给我带来任何帮助我的好功能。检查整列中所选列范围的重复值。我的意思是检查500使用3500列条目值输入列值并删除500个条目中的重复项

提前致谢

3 个答案:

答案 0 :(得分:3)

这应该很简单。您需要在文件中的某个位置创建一个单元格,在删除所有欺骗后,您将每周写入Y列的单元格数。

例如,比如说第1周你删除了骰子,你剩下的范围是Y1:Y100。您的函数会在文件中的某处放置“100”以供参考。

下周,您的函数将从(来自参考编号的单元格)+ 1开始查看,因此Y:101到列的末尾。删除dupes后,该函数会将ref单元格更改为新计数。

以下是代码:

Sub RemoveNewDupes()

'Initialize for first time running this
If Len(Range("A1").Value) = 0 Then
    Range("A1").Value = Range("Y" & Rows.count).End(xlUp).row
End If

If Range("A1").Value = 1 Then Range("A1").Value = 0

'Goodbye dupes!
ActiveSheet.Range("Y" & Range("A1").Value + 1 & ":Y" & _
Range("Y" & Rows.count).End(xlUp).row).RemoveDuplicates Columns:=1, Header:=xlNo

'Re-initialize the count for next time
Range("A1").Value = Range("Y" & Rows.count).End(xlUp).row

End Sub

*抱歉不知道为什么自动语法突出显示会让人难以阅读

<强>更新

这是在Excel 2003中执行此操作的一种方法。诀窍是在列中向后循环,以便在删除行时不会销毁循环。我使用字典(我以过度使用着称),因为它可以让你轻松检查欺骗。

Sub RemoveNewDupes()

Dim lastRow As Long
Dim dict As Object
Set dict = CreateObject("scripting.dictionary")

If Len(Range("A1").Value) = 0 Then
    Range("A1").Value = 1
End If

lastRow = Range("Y" & Rows.count).End(xlUp).row

On Error Resume Next
For i = lastRow To Range("A1").Value Step -1
    If dict.exists(Range("Y" & i).Value) = True Then
        Range("Y" & i).EntireRow.Delete
    End If
    dict.Add Range("Y" & i).Value, 1
Next

Range("A1").Value = Range("Y" & Rows.count).End(xlUp).row

End Sub

答案 1 :(得分:2)

Excel如何知道条目是“新的”? (例如,我们怎么知道我们只需要考虑最后500行) 实际上,如果您上周已经执行了宏,那么前3000行将不会有任何重复,因此当前执行不会更改这些行。

您描述的代码几乎可以正常工作。如果我们保留它并稍微改变它:

Sub DeleteDups() 
Dim x               As Long 
Dim LastRow         As Long 
LastRow = Range("Q65536").End(xlUp).Row 
For x = LastRow To 1 Step -1
    'parse every cell from the bottom to the top (to still count duplicates)
    '  and check if duplicates thanks to the formula 
    If Range("Q" & x).Value Then Range("Q" & x).EntireRow.Delete 
Next x   
End Sub

[编辑]另一个(可能更快)解决方案:首先过滤值,然后删除可见行:

Sub DeleteDups() 
ActiveSheet.UsedRange.AutoFilter Field:=17, Criteria1:="True" 'filter column Q for True values
ActiveSheet.Cells.SpecialCells(xlCellTypeVisible).EntireRow.Delete
End Sub

无法在这里测试最后一个解决方案,抱歉。

答案 2 :(得分:0)

这是一个想法:

Sub test
LastRow = Range("A65536").End(xlUp).Row
For i = LastRow To 1 Step -1
  If Not Range("a1:a" & whateverLastRowYouWantToUse ).Find(Range("a" & i).Value, , , , , xlPrevious) Is Nothing Then
    Rows(i).Delete
  End If
Next i
End Sub

它检查当前单元格上方的整个范围是否有单个副本。如果找到,则删除当前行。

编辑我刚刚在你的例子中意识到,你说的是Y栏,但是在你的代码中你正在检查A.不确定这个例子是否只是一个假设,但是想确保它不是'这是奇怪行为的原因。

注意,这是未经测试的!请在尝试之前保存您的工作簿!