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

Vba 如果不在数组中,则删除Excel工作表,vba,excel,Vba,Excel,我无法解决错误“时间执行错误#13:不兼容类型”。如果用户创建了数组中未声明的工作表,则该工作表将被删除。有人能帮忙吗 sub DeleteNewSheets() Dim ws, wsP As Worksheet Dim ArrayOne As Variant Application.DisplayAlerts = False ArrayOne = Array("SheetA", "SheetB", "SheetC", "Sheet_n") Set wsP =

我无法解决错误“时间执行错误#13:不兼容类型”。如果用户创建了数组中未声明的工作表,则该工作表将被删除。有人能帮忙吗

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
sub-DeleteNewSheets()
Dim ws,wsP作为工作表
Dim ArrayOne作为变体
Application.DisplayAlerts=False
ArrayOne=数组(“SheetA”、“SheetB”、“SheetC”、“Sheet\n”)

设置wsP=ThisWorkbook.Worksheets(ArrayOne)“你的代码行,上面写着:

Set wsP = ThisWorkbook.Worksheets(ArrayOne)
正在尝试将工作表对象设置为多个工作表的数组。这就像试图将单个整数设置为整数数组

尝试使用以下代码

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

您可以在一个循环中检查图纸,并在一次快照中删除“坏”图纸,如下所示:

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
选项显式
子删除新闻表()
将ws设置为工作表
Dim SHEETS以字符串形式删除

Const GOODSHEETS As String=“\SheetA\SheetB\SheetC\Sheet\u n\”如果为。。。下一步或针对每个。。。下一个语句循环遍历
数组中的每个元素一个
和条件的如果s语句,那么它应该完成这项工作。所以你的代码应该是这样的

    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

工作表([index])
的索引是一个整数(也可以是字符串),但不是数组。您只需在数组中循环以检查名称是否匹配。如果没有匹配项,则删除worksheet@Rosetta-工作表的索引可以是字符串或整数数组。作为测试,创建一个包含3张工作表(Sheet1、Sheet2和Sheet3)的工作簿,然后执行
工作表(数组(“Sheet1”、“Sheet2”)。Visible=False
。Sheet1和Sheet2都将被隐藏。@Rosetta,感谢您的评论和时间。这是一个非常好的解决方案。非常感谢你!可以根据“.”修改每个
循环的第二个
。@pcw谢谢too@YowE3K对不起,我太马虎了。我已经修改了代码,所以它可以正常工作。谢谢你指出了我的错误而没有否决我的回答。我很感激。