VBA:在某些工作表之后删除工作表

时间:2018-11-29 12:12:58

标签: excel vba excel-vba

我需要删除名为“模板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

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

4 个答案:

答案 0 :(得分: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 :(得分:0)

请尝试

<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/4.17.47/js/bootstrap-datetimepicker.min.js"></script>
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/4.17.47/css/bootstrap-datetimepicker.min.css" />
<script>
    $(document).ready(function(){
      $( "#month,#month1" ).datepicker({
        inline: true,
        changeMonth: true,
        changeYear: true,
        minDate: -20,
        maxDate: "+5M +1D"
      });
    });
</script>

代替ThisWorkbook.Sheets(i).Delete

答案 2 :(得分:0)

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

替换:

Sheets(i).Delete

替换为:

ThisWorkbook.Worksheets(i).Delete

答案 3 :(得分:0)

返回工作表的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

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

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

编辑3:抱歉!将Worksheets更改为Sheets,使其包含图表表。