运行 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
我知道这可能会以各种格式被问到,但是我对编码完全陌生,不明白如何将它应用到这个函数中。
当 运行 这个 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