You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA循环删除行时出现Subindex out of interval(Error 9)错误求助

解决VBA代码的下标越界错误及语法问题

我来帮你定位并修复代码里的问题,你的错误主要来自两个关键问题,还有一个语法小问题:

1. 核心错误:变量误用导致下标越界

你外层循环用n来遍历第2、3张工作表,但在设置ws对象的时候,错误地使用了还未初始化的变量i:

Set ws = ThisWorkbook.Worksheets(i)

这时候i的初始值是0(因为Integer类型默认初始化为0),而Excel工作表的索引是从1开始的,尝试访问Worksheets(0)自然会触发Error 9 下标越界。你应该把这里的i改成n,因为n才是当前循环的工作表索引。

2. 语法错误:多余的End If

你的内层循环里,If Not idftl = "SW" Then后面多写了一个End If,导致代码结构不匹配,这也会干扰代码的执行流程。

3. 优化建议:动态确定最后一行

原代码固定从200行开始向上删除,但如果你的实际数据行数少于200,会处理大量空行。建议动态获取数据的最后一行,让代码更灵活。

修正后的完整代码

Sub Summrize()
    Dim n As Integer
    Dim i As Integer
    Dim identif As String
    Dim idftl As String
    Dim ws As Worksheet
    Dim lastRow As Long ' 用Long避免行数超过Integer范围的问题
    
    For n = 2 To 3
        Set ws = ThisWorkbook.Worksheets(n) ' 这里把i改成n
        With ws
            lastRow = .Cells(.Rows.Count, 3).End(xlUp).Row ' 获取第3列最后一行有数据的行号
            ' 从最后一行向上循环,避免删除行导致的索引错位
            For i = lastRow To 1 Step -1
                identif = .Cells(i, 3).Value
                ' 处理空单元格的情况,避免Left函数出错
                If identif <> "" Then
                    idftl = Left(identif, 2)
                    If idftl <> "SW" Then
                        .Rows(i).Delete ' 简化删除行的写法,不用拼接字符串
                    End If
                Else
                    ' 如果单元格是空的,也可以选择删除,根据你的需求调整
                    ' .Rows(i).Delete
                End If
            Next i
        End With
    Next n
End Sub

关键修改点说明

  • 把Worksheets(i)改为Worksheets(n),正确绑定当前循环的工作表
  • 移除了多余的End If,修复语法结构
  • 新增lastRow变量动态获取第3列的最后数据行,避免处理无效空行
  • 增加了对空单元格的判断,防止Left函数在单元格为空时出错
  • 简化了删除行的写法:.Rows(i).Delete比.Rows(i & ":" & i).Delete更简洁高效

内容的提问来源于stack exchange,提问作者Mauro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:45:55