获取运行时错误9 - 下标超出范围

时间:2016-09-25 10:58:01

标签: excel excel-vba vba

运行以下代码时出现运行时错误。

Sub em()
    Dim strlogin As String
    Dim strnextlogin As String

    For i = 2 To Range("A1").End(xlDown).Row
        strlogin = Sheets("Untitled").cell(i, 1)
        strnextlogin = Sheets("Untitled").cell(i + 1, 1)
        If (strlogin = strnextlogin) Then
            Rows(i).Delete
            i = i - 1
        End If
    Next i
End Sub

1 个答案:

答案 0 :(得分:5)

我看到了几个问题

  1. 您正在使用xlDown查找最后一个单元格。我建议您查看有关如何查找最后一行的THIS链接。

  2. 您收到错误Runtime Error 9 Subscript out of range,因为Excel无法找到您所指的工作表。请确保表格存在。如果您可以直观地看到Untitled表单,那么我认为表单名称具有前导或尾随空格。

  3. 解决该问题后,您将收到的下一个错误是Runtime error 438: Object doesn't support this property or method。这是因为您使用的是cell而不是cells。例如,.cell(i, 1)应为.Cells(i, 1).cell(i + 1, 1)应为.Cells(i + 1, 1)

  4. 如果Sheets("Untitled")不是活动工作表,则声明您的对象,然后Rows(i).Delete将从错误的工作表中删除;)

  5. 避免删除循环中的行。它只会让你的代码变慢。了解我在下面的代码中如何使用delRange

  6. 解决这些问题,你会很高兴

    注意:

    Option Explicit
    
    Sub em()
        Dim delRange As Range
        Dim ws As Worksheet
        Dim i As Long, LRow As Long
    
        Set ws = ThisWorkbook.Sheets("Untitled")
    
        With ws
            LRow = .Range("A" & .Rows.Count).End(xlUp).Row
    
            For i = LRow To 2 Step -1 '~~> Even 2 To LRow will work :)
                If .Cells(i, 1) = .Cells(i + 1, 1) Then
                    If delRange Is Nothing Then
                        Set delRange = .Rows(i)
                    Else
                        Set delRange = Union(delRange, .Rows(i))
                    End If
                End If
            Next i
    
            If Not delRange Is Nothing Then delRange.Delete
        End With
    End Sub