excel 2007 VBA下标超出范围,ReDim Preserve问题没有找到重复项

时间:2013-06-13 17:04:22

标签: excel vba

我使用下面的代码来识别列中的重复项,如果找到则删除所有重复项。我在另一个工作簿中有完全相同的代码,它工作正常。但是,当我编译下面的代码时,我收到“下标超出范围”错误。亮点在于“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

4 个答案:

答案 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 arraySubscript out of range在你的情况下说数组是空的,它没有成功地被Redim'med。