【问题标题】:Excel VBA index out of bounds while using Sheets.delete使用 Sheets.delete 时 Excel VBA 索引超出范围
【发布时间】:2023-03-27 19:32:01
【问题描述】:

在以下代码的几次迭代之后,我总是得到索引超出范围的错误。

    For i = myworksheet.index To Worksheets.count
        Sheets(i).delete
    Next i

【问题讨论】:

  • 您需要向后循环,否则您将尝试删除例如包含 3 张纸的文件的第 4 张。或使用工作表名称。或者使用 FaneDuru 的方法。

标签: excel vba indexing


【解决方案1】:

您不应该以这种方式删除工作表。

考虑你要它做什么。假设您有 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 个工作表。

【讨论】:

  • 基本上,当我第一眼看到您发布的第一张桌子时,我就意识到了自己的愚蠢……感谢您解决了我的心理障碍……
【解决方案2】:

请尝试下一个方法。在您的代码中,删除工作表后,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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多