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

pra*_*ram 2 excel vba excel-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
Run Code Online (Sandbox Code Playgroud)

Sid*_*out 5

我看到几个问题

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

  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下面的代码,了解我的用法.

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

注意:

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
Run Code Online (Sandbox Code Playgroud)