运行 a 删除带有变量的行时如何避免子集超出范围

How to avoid subset out of range when running a delete rows with variable

我知道这可能会以各种格式被问到,但是我对编码完全陌生,不明白如何将它应用到这个函数中。

当 运行 这个 vba.

时,我不断收到 下标超出范围错误 消息
Sub KeepOnlyAtSymbolRows()

    Dim ws As Worksheet
    Dim rng As Range
    Dim lastRow As Long

    Set ws = ActiveWorkbook.Sheets("Sheet1")

    lastRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row

    Set rng = ws.Range("A1:A" & lastRow)

    With rng
        .AutoFilter Field:=1, Criteria1:="<>*International SBU*"
        .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    End With
    ws.AutoFilterMode = False
End Sub

对于上下文,我的 sheet 目前有 178 行长,并且上升到 AK 但是行数会在每次更新时发生变化,列数不会

像这样对 sheet 的名称进行硬编码时要小心:

Set ws = ActiveWorkbook.Sheets("Sheet1")

因为如果您更改 Excel 中的名称,您也必须在您的代码中更改它(您很快就会通过错误消息找到它)

所以不同的方式 call/reference a sheet :

经典,有Sheet的名字

Set ws = ActiveWorkbook.Sheets("Sheet1")

使用索引

Set ws = ActiveWorkbook.Sheets(1)

使用Sheet的对象名称

Set ws = ActiveWorkbook.Sheet1

这个名字不会改变,即使你直接在Excel!

中重命名Sheet

我假设您没有使用 table。如果是这样,那么试试这个:

Sub KeepOnlyAtSymbolRows()

Dim ws As Worksheet
Dim rng As Range
Dim lastRow As Long

Set ws = ActiveWorkbook.Sheets("Sheet1")

lastRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row

Set rng = ws.Range("A1:A" & lastRow)
Application.DisplayAlerts = False 'to stop prompting for deletion
With rng
    .AutoFilter Field:=1, Criteria1:="<>*International SBU*"
    .Offset(1, 0).SpecialCells(xlCellTypeVisible).Delete
End With
ws.AutoFilterMode = False
Application.DisplayAlerts = True
End Sub