除了第一个,vba选择/删除所有工作表

时间:2017-04-07 09:14:22

标签: excel vba excel-vba select google-sheets

我在删除不必要的纸张时遇到了问题。我查看了不同的论坛,并将不同的解决方案混为一谈 此宏删除了纸张(第一张纸除外)。

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

此解决方案是否正常或可以改进?我也尝试直接在对象(工作簿,工作表)上执行操作,但每次都失败

3 个答案:

答案 0 :(得分:3)

你的代码会起作用(但你可以自己发现!)

您可以避免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

答案 1 :(得分:3)

您的代码没有任何问题。该代码将删除ActiveWorkbook中除第一张表之外的所有工作表。

您应该将sht声明为Worksheet,因为您知道此变量引用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

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

答案 2 :(得分:1)

另一种方式。这基本上是伪代码,但逻辑很明确。一旦你下到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