我使用下面的代码来识别列中的重复项,如果找到则删除所有重复项。我在另一个工作簿中有完全相同的代码,它工作正常。但是,当我编译下面的代码时,我收到“下标超出范围”错误。亮点在于“m = UBound(toDel2)到LBound(toDel2)步骤-1。我在网上寻求帮助,几个小时都遇到了麻烦。有人可以提供帮助吗?
Dim toDel2(), m As Long
Dim RNG2 As Range, Cell2 As Long
Set RNG2 = Range("a1:a1000") 'set your range here
For Cell2 = 1 To RNG2.Cells.Count
If Application.CountIf(RNG2, RNG2(Cell2)) > 1 Then
ReDim Preserve toDel2(m)
toDel2(m) = RNG2(Cell2).Address
m = m + 1
End If
Next
For m = UBound(toDel2) To LBound(toDel2) Step -1
Range(toDel2(m)).EntireRow.Delete
答案 0 :(得分:1)
如果未找到重复项导致toDel2为空,则会发生错误,因此您无法获取UBound或LBound。
这将为您解决问题:
Sub Example()
Dim toDel2(), m As Long
Dim RNG2 As Range, Cell2 As Long
Set RNG2 = Range("A1:A1000") 'set your range here
For Cell2 = 1 To RNG2.Cells.Count
If Application.CountIf(RNG2, RNG2(Cell2)) > 1 Then
ReDim Preserve toDel2(m)
toDel2(m) = RNG2(Cell2).Address
m = m + 1
End If
Next
On Error GoTo NO_DUPLICATES
For m = UBound(toDel2) To LBound(toDel2) Step -1
Range(toDel2(m)).EntireRow.Delete
Next
On Error GoTo 0
Exit Sub
NO_DUPLICATES:
End Sub
答案 1 :(得分:0)
如果事实证明没有要删除的行,您会在提及的行上看到错误,因为在这种情况下toDel2
将不会被重新编辑。我的猜测就是发生了这种情况,因为m
变量如果toDel()
被重新定义会导致问题,所以这不可能发生。鉴于m
一开始为零,您应该在m=m+1
之前获得ReDim
答案 2 :(得分:0)
这一行是问题所在:
ReDim Preserve toDel2(m)
您没有将m
设置为此行之前的任何内容,因此它仍为0.当您使用此ReDim
格式时,您告诉它分配m
或零项目数组。
答案 3 :(得分:0)
我认为这句话:
if Application.CountIf(RNG2, RNG2(Cell2)) > 1 Then
永远不会返回True
,因此永远不会完全宣布您的toDel2 array
。 Subscript out of range
在你的情况下说数组是空的,它没有成功地被Redim'med。