vbaselect/删除除第一个以外的所有表单

我在清除不必要的纸张时遇到了问题。 我看了不同的论坛,并将不同的解决scheme混合在一起。
这个macros删除表单(第一个表单除外)。

Sub wrong() Dim sht As Object Application.DisplayAlerts = False For Each sht In ActiveWorkbook.Sheets If sht.Index <> 1 Then sht.Delete End If Next End Sub 

这个解决scheme好吗,还是可以改进? 我也尝试直接对象(工作簿,工作表)的行动,但我每次都失败了

你的代码可以工作(但你可以自己发现!)

你可以避免If-Then-End如果通过直接从最后一个循环到第二个索引,如下所示

 Option Explicit Sub wrong() Dim i As Long Application.DisplayAlerts = False With Sheets '<--| reference active workbook 'Sheets' collection For i = .Count To 2 Step -1 '<--| loop through referenced sheets index from last to the 2nd .Item(i).Delete '<--| delete current index sheet Next End With Application.DisplayAlerts = True End Sub 

你的代码没有错。 代码将删除ActiveWorkbook中除第一个表以外的所有表单。

您应该将sht声明为Worksheet,因为您知道该variables引用了Worksheet对象。

还有一点就是循环遍历所有的ActiveWorkbook.Sheets,这意味着如果代码运行,它将从当前活动的工作簿中删除工作表。

如果通过ThisWorkbook.Sheets循环,它将从仅包含此代码的工作簿中删除工作表。

 Sub DeleteAllSheetsButFirst() Dim sht As Worksheet Application.ScreenUpdating = False Application.DisplayAlerts = False For Each sht In ActiveWorkbook.Sheets If sht.Index <> 1 Then sht.Delete End If Next Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub 

上面的代码将根据它们的索引号(即它们在工作簿中的位置)删除工作表,而不是基于工作表名称。

其他方式。 这基本上是伪代码,但逻辑清晰。 一旦你到达sheet1,它会自动停止。

 sub right() dim wkb as excel.workbook set wkb = workbooks.add ' or open or whatever application.displayalerts = false do while wkb.sheets.count > 1 wkb.sheets(wkb.sheets.count).delete loop application.displayalerts = true end sub