问题是,我有一个专栏,例如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个条目中的重复项
提前致谢
答案 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.不确定这个例子是否只是一个假设,但是想确保它不是'这是奇怪行为的原因。
注意,这是未经测试的!请在尝试之前保存您的工作簿!