我正在使用Excell 2010中的数据库,发现了许多重复的名称。我试图制作一个VBA脚本来解决这个问题,但它只是在一个无限循环上结束。我希望它在碰到空白单元格时停止。下面是我提出的代码
Sub excluirDuplicatas()
Dim lngCont As Long
Dim lngLinhas As Long
Dim rngNom1 As Range
Dim rngNom2 As Range
lngCont = 0
lngLinhas = Cells.SpecialCells(xlCellTypeLastCell).Row
While lngCont <= lngLinhas
Set rngNom1 = ActiveCell
Set rngNom2 = rngNom1.Offset(1, 0)
While rngNom1.Value = rngNom2.Value And rngNom2 <> lastRow
rngNom2.Select
rngNom2.EntireRow.Delete
Set rngNom2 = ActiveCell
Wend
Set rngNom1 = rngNom2
Set rngNom1 = ActiveCell
Set rngNom1 = rngNom2
rngNom1.Select
lngCont = lngCont + 1
Wend
End Sub
我不知道什么是错的,我的猜测是我陈述的部分
rngNom2 <> Cells.SpecialCells(xlCellTypeLastCell).Row
请注意,我今天(3月22日)主持了VBA节目。如果你能不仅请发布答案,还要快速解释,我将不胜感激。
PS:数据表长度超过2000行
答案 0 :(得分:2)
我建议您使用For循环,这样就可以避免使用.Select
您可能希望看到THIS LINK
例如,您的代码看起来像这样
For i = 1 To lastRow
If Len(Trim(Sheets("Sheet1").Range("A" & i).Value)) = 0 Then Exit For
'
'~~> Rest of your code
'
Next i
答案 1 :(得分:0)
我认为这个命令可以帮到你。将Range("a1")
替换为您要测试的范围。
IsEmpty(Range("a1"))
即do while isempty(range("a1"))
...或do while not isempty(range("a1"))
答案 2 :(得分:0)
嗯,我不是100%肯定你在做什么,但这将是一个开始。
首先声明一个范围变量rng
taht包含您要检查的所有单元格。我设置此rng
变量的方式会自动停在列中的第一个空白单元格。
我们将使用计数器r
迭代这些单元格,从最后一个到第一个单元格(删除时这是必要的)。
在此迭代过程中,我们将使用变量cl
作为单个单元格区域。
Sub excluirDuplicatas()
Dim rng as Range
Dim r as Integer 'row counter.
Dim cl As Range
lngCont = 0
lngLinhas = Cells.SpecialCells(xlCellTypeLastCell).Row
set rng = Range(ActiveCell.Address, Range(ActiveCell.Address).End(xlDown))
For r = rng.Rows.Count to 1 Step - 1 'Step backwards when deleting, otherwise you have infinite loop
'This tests to see if the cell value is the same as the value below it.
' and deletes it if it is the same value.
If cl.Value = cl.Offset(1,0).Value Then
cl.EntireRow.Delete
End If
Next
End Sub