如果不在数组中,请删除Excel工作表

我有问题来解决错误“时间执行错误#13:不兼容的types”。 如果用户创build了一些未在数组中声明的工作表,它将被删除。 谁能帮忙?

sub DeleteNewSheets() Dim ws, wsP As Worksheet Dim ArrayOne As Variant Application.DisplayAlerts = False ArrayOne = Array("SheetA", "SheetB", "SheetC", "Sheet_n") Set wsP = ThisWorkbook.Worksheets(ArrayOne) ' <--- ERROR #13 For Each ws In ThisWorkbook.Worksheets If ws.Name <> wsP.Name Then ws.Delete Next ws Application.DisplayAlerts = True end sub 

你的代码行说:

 Set wsP = ThisWorkbook.Worksheets(ArrayOne) 

试图将Worksheet对象设置为许多Worksheets的数组。 这就像试图设置一个整数是一个整型数组。

尝试使用下面的代码

 Sub DeleteNewSheets() Dim ws As Worksheet Dim ArrayOne() As Variant Dim wsName As Variant Dim Matched As Boolean ArrayOne = Array("SheetA", "SheetB", "SheetC", "Sheet_n") Application.DisplayAlerts = False For Each ws In ThisWorkbook.Worksheets Matched = False For Each wsName In ArrayOne If wsName = ws.Name Then Matched = True Exit For End If Next If Not Matched Then ws.Delete End If Next ws Application.DisplayAlerts = True End Sub 

如果添加额外的For … NextFor Each … Next语句来遍历ArrayOne每个元素和条件IF语句,那么它应该完成这项工作。 所以你的代码应该是这样的

  Sub DeleteNewSheets() Dim ws As Worksheet Dim ArrayOne As Variant, iSheet As Integer Application.DisplayAlerts = False ArrayOne = Array("SheetA", "SheetB", "SheetC", "Sheet_n") For Each ws In ThisWorkbook.Worksheets For iSheet = LBound(ArrayOne) To UBound(ArrayOne) If ws.Name = ArrayOne(iSheet) Then Exit For If iSheet = UBound(ArrayOne) Then ws.Delete End If Next Next Application.DisplayAlerts = True End Sub 

或者可选地

 Sub DeleteNewSheets() Dim ws As Worksheet Dim ArrayOne As Variant Application.DisplayAlerts = False ArrayOne = Array("SheetA", "SheetB", "SheetC", "Sheet_n") For Each ws In ThisWorkbook.Worksheets For Each Element In ArrayOne If ws.Name = Element Then Exit For If Element = ArrayOne(UBound(ArrayOne)) Then ws.Delete End If Next Next Application.DisplayAlerts = True End Sub 

您可以在一个循环中检查工作表,并按如下方式删除一个循环中的“不良”工作表:

 Option Explicit Sub DeleteNewSheets() Dim ws As Worksheet Dim sheetsToDelete As String Const GOODSHEETS As String = "\SheetA\SheetB\SheetC\Sheet_n\" '<--| list of good sheets names, separated by an invalid character for sheet names For Each ws In ThisWorkbook.Worksheets If InStr(GOODSHEETS, "\" & ws.Name & "\") = 0 Then sheetsToDelete = sheetsToDelete & ws.Name & "\" '<--| update sheets to be deleted list Next ws If sheetsToDelete <> "" Then '<--| if the list is not empty sheetsToDelete = Left(sheetsToDelete, Len(sheetsToDelete) - 1) '<--| remove last delimiter ("\") from it Application.DisplayAlerts = False ThisWorkbook.Worksheets(Split(sheetsToDelete, "\")).Delete '<-- delete sheets Application.DisplayAlerts = True End If End Sub