【发布时间】:2023-03-27 19:32:01
【问题描述】:
在以下代码的几次迭代之后,我总是得到索引超出范围的错误。
For i = myworksheet.index To Worksheets.count
Sheets(i).delete
Next i
【问题讨论】:
-
您需要向后循环,否则您将尝试删除例如包含 3 张纸的文件的第 4 张。或使用工作表名称。或者使用 FaneDuru 的方法。
在以下代码的几次迭代之后,我总是得到索引超出范围的错误。
For i = myworksheet.index To Worksheets.count
Sheets(i).delete
Next i
【问题讨论】:
您不应该以这种方式删除工作表。
考虑你要它做什么。假设您有 5 个工作表 - Sheet1、Sheet2.. Sheet 5。
假设 myworksheet 是 Sheet3 (i=3)。
循环开始时,i 为 3。
Sheet3 被删除。
循环重新开始,i 现在是 4。
但是,现在只有 4 个工作表。所以Sheet5 (i=4) 被删除了。
循环重新开始,i 现在是 5。
但是,现在只有 3 个工作表。没有索引为 5 的工作表要删除。
实现目标的一种(多种)方法是执行以下操作:
i = myworksheet.Index
Do Until Worksheets.Count = i - 1
Worksheets(Worksheets.Count).Delete
Loop
有一点需要指出......在您的代码中,您似乎正在删除您的起始表myworksheet。正因为如此,我创建的 Do Until... 循环在 i-1 处完成以停止 myworksheet 被删除。如果您不希望发生这种情况,请删除 - 1。如果您确实希望发生这种情况,您需要注意,如果 myworksheet 的索引为 1,则会出错 - 因为所有工作簿必须至少包含 1 个工作表。
【讨论】:
请尝试下一个方法。在您的代码中,删除工作表后,i 的引用没有意义,大于现有的最大值(剩余)一个:
Sub deleteSheets()
Dim sh As Worksheet, ws As Worksheet
Set sh = ActiveSheet
For Each ws In ActiveWorkbook.Sheets
If ws.Index > sh.Index Then
Application.DisplayAlerts = False
ws.Delete
Application.DisplayAlerts = True
End If
Next
End Sub
或者像@SJR 建议的那样向后循环:
Sub deleteSheetsBis()
Dim myworksheet As Worksheet, i As Long
Set myworksheet = ActiveSheet
For i = ActiveWorkbook.Worksheets.count To myworksheet.Index Step -1
Application.DisplayAlerts = False
Sheets(i).Delete
Application.DisplayAlerts = True
Next i
End Sub
【讨论】: