我需要删除名为“模板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
但是,我收到错误消息“工作表类的删除方法失败”。有人对此有解决方案吗?
我唯一想到的会引发此错误的是,您的工作簿中有一个“非常隐藏”的工作表。 “非常隐藏”的工作表不会使用您的功能删除。试试这个:
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
返回工作表的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
,因此它包括图表表。
请尝试
ThisWorkbook.Sheets(i).Delete
而不是Sheets(i).Delete
请确保您已保存带有启用宏的文件,然后尝试:
替换:
Sheets(i).Delete
替换为:
ThisWorkbook.Worksheets(i).Delete