Adding array to sheet names

时间:2018-05-28 18:55:46

标签: vba excel-vba excel

I am using the below code to retain sheets that I need and delete the rest.

Sub DeleteSheets1()
    Dim xWs As Worksheet
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    For Each xWs In Application.ActiveWorkbook.Worksheets
        If xWs.Name <> "Sheet1" And xWs.Name <> "Sheet2" Then
            xWs.Delete
        End If
    Next
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub

I have around 6 sheets that I want to retain. I need help modifying the syntax to accommodate multiple sheets. Something like below

if xWs.Name <> ("sheet1", "sheet2"....) then xws.delete

4 个答案:

答案 0 :(得分:2)

此处const std::string&是要保留的工作表数组:

arr

答案 1 :(得分:0)

valueInArray布尔函数可以更轻松地处理代码:

Public Function valueInArray(myValue As Variant, myArray As Variant) As Boolean

    Dim cnt As Long

    For cnt = LBound(myArray) To UBound(myArray)
        If CStr(myValue) = CStr(myArray(cnt)) Then
            valueInArray = True
            Exit Function
        End If
    Next cnt

End Function

Sub DeleteSheets()


    Application.DisplayAlerts = False
    Application.ScreenUpdating = False

    Dim cnt As Long
    cnt = Worksheets.Count

    Dim arrWks As Variant
    arrWks = Array("Sheet1", "Sheet2", "Sheet3")

    For cnt = Worksheets.Count To 1
        If Not valueInArray(Worksheets(cnt).Name, arrWks) Then
            Worksheets(cnt).Delete
        End If
    Next cnt

    Application.DisplayAlerts = True
    Application.ScreenUpdating = True

End Sub

valueInArray函数获取值以搜索myValue和数组搜索此值myArray的位置。它循环遍历数组的所有元素,如果它找到传递值的String,则返回True并退出。如果找不到,则返回False,因为这是默认值。

答案 2 :(得分:0)

另一种方法

Sub Test()
Dim ws          As Worksheet
Dim arr         As Variant

arr = Array("Sheet1", "Sheet2", "Sheet3")

Application.ScreenUpdating = False
Application.DisplayAlerts = False
    For Each ws In ThisWorkbook.Worksheets
        If Not IsNumeric(Application.Match(ws.Name, arr, 0)) Then ws.Delete
    Next ws
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

答案 3 :(得分:0)

好的,这个没有完全满足数组的要求,但它是使用单个循环的另一种方式。

它会在RetainSheets字符串中查找工作表名称的出现位置。每个工作表名称都被|包围,以防工作表名称​​ eet1Sh 中的工作表名称为例。
代码不会尝试删除工作簿中的最后一个工作表。

Sub Test()

    Dim wrkSht As Worksheet
    Dim RetainSheets As String

    RetainSheets = "|Sheet1|Sheet2|"

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    For Each wrkSht In Worksheets
        If InStr(RetainSheets, wrkSht.Name) = 0 And Worksheets.Count > 1 Then
            wrkSht.Delete
        End If
    Next wrkSht

    Application.ScreenUpdating = True
    Application.DisplayAlerts = True

End Sub