Vba 如果不在数组中,则删除Excel工作表
我无法解决错误“时间执行错误#13:不兼容类型”。如果用户创建了数组中未声明的工作表,则该工作表将被删除。有人能帮忙吗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 =
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对不起,我太马虎了。我已经修改了代码,所以它可以正常工作。谢谢你指出了我的错误而没有否决我的回答。我很感激。