删除某些工作表之后的工作表

问题描述 投票:1回答:4

我需要删除名为“模板1”的工作表之后的所有工作表。

到目前为止,我已经尝试过

Sub SheetKiller()
    Dim i As Long
    Dim j As Long
    j = 0
    For i = 1 To Sheets.Count
        If Sheets(i).Name = "template 1" Then
            j = i
        End If
    Next i

    If j = 0 Or j = Sheets.Count Then Exit Sub

    Application.DisplayAlerts = False
        For i = Sheets.Count To j + 1 Step -1
            Sheets(i).Delete
        Next i
    Application.DisplayAlerts = True 
End Sub

但是,我收到错误消息“工作表类的删除方法失败”。有人对此有解决方案吗?

excel vba
4个回答
1
投票

我唯一想到的会引发此错误的是,您的工作簿中有一个“非常隐藏”的工作表。 “非常隐藏”的工作表不会使用您的功能删除。试试这个:

Sub SheetKiller()
    Dim i As Long
    Dim j As Long
    Dim bFound As Boolean

    j = 0
    bFound = False

    For i = 1 To Sheets.Count
        If bFound Then Sheets(i).Visible = 0
        If Sheets(i).Name = "template 1" Then
            j = i
            bFound = True
        End If
    Next i

    If j = 0 Or j = Sheets.Count Then Exit Sub

    Application.DisplayAlerts = False
        For i = Sheets.Count To j + 1 Step -1
            Sheets(i).Delete
        Next i
    Application.DisplayAlerts = True
End Sub

这会将所有要删除的工作表设置为“隐藏”,从而允许在不显示它们的情况下将其删除。如果需要保留“非常隐藏”工作表,请使用此方法:

Sub SheetKiller()
    Dim i As Long
    Dim j As Long

    j = 0
    For i = 1 To Sheets.Count
        If Sheets(i).Name = "template 1" Then
            j = i
        End If
    Next i

    If j = 0 Or j = Sheets.Count Then Exit Sub

    Application.DisplayAlerts = False
        For i = Sheets.Count To j + 1 Step -1
            If Sheets(i).Visible < 2 Then Sheets(i).Delete
        Next i
    Application.DisplayAlerts = True
End Sub

1
投票

返回工作表的Index号,然后删除索引大于该值的所有工作表。

您需要检查“模板1”不是工作簿中的唯一工作表,还是不是工作簿中的最后一个工作表。您还需要从最后一个工作表中删除到第一个工作表-我可以看到您已经在原始代码中完成了工作。

Sub Test()

    Dim Indx As Long
    Dim x As Long

    With ThisWorkbook
        On Error Resume Next
            Indx = .Sheets("template 1").Index
        On Error GoTo 0

        If Indx <> 0 Then
            If .Sheets.Count > 1 And Indx < .Sheets.Count Then
                Application.DisplayAlerts = False
                For x = .Sheets.Count To Indx + 1 Step -1
                    .Sheets(x).Delete
                Next x
                Application.DisplayAlerts = True
            End If
        End If
    End With

End Sub

Edit:刚刚意识到-它还需要检查至少一张纸可见,但是猜测“模板1”将可见,因此作弊了一点,而不是对此进行检查。 :)

编辑2:我添加了一个检查以确保模板1存在。通常,我会将其传递给一个单独的函数,该函数将返回TRUE / FALSE。

Edit 3:抱歉!将Worksheets更改为Sheets,因此它包括图表表。


0
投票

请尝试

ThisWorkbook.Sheets(i).Delete

而不是Sheets(i).Delete


0
投票

请确保您已保存带有启用宏的文件,然后尝试:

替换:

Sheets(i).Delete

替换为:

ThisWorkbook.Worksheets(i).Delete
© www.soinside.com 2019 - 2024. All rights reserved.