2015-11-20 2 views
0

Im, пишу программу для удаления всех листов с именами месяцев. Однако после того, как программа удаления листа он даст мне ошибку автоматизацииудаление листа, вызывающего ошибку автоматизации

Sub DelSheet() 

Dim i As Integer 
Dim months() As String 
months() = Split("January February March April May June July Auguest September October November December") 

Dim ws As Worksheet 

Application.DisplayAlerts = False 


    For Each ws In Worksheets 
     For i = 0 To UBound(months) 

      If ws.Name = months(i) Then 
       ws.Delete 
      End If 

     Next i 
    Next ws 

Application.DisplayAlerts = True 



End Sub 

Может быть, после того, как я удалить лист, когда он начинает следующий цикл элемент в коллекции (листе) изменился.

For Each WS В Таблицах

Я потерял

ответ

1

Да - когда цикл по коллекции, из которого вы можете хотите удалить элементы, то лучше работать в обратном направлении :

Sub DelSheet() 

Dim i As Integer, n As Long, w as Long 
Dim months() As String 
months() = Split("January February March April May June July Auguest September October November December") 

Dim ws As Worksheet 

Application.DisplayAlerts = False 

    n = Worksheets.Count 
    For w = n to 1 Step - 1 
     Set ws = Worksheets(w) 
     For i = 0 To UBound(months) 

      If ws.Name = months(i) Then 
       ws.Delete 
       Exit For 
      End If 

     Next i 
    Next w 

Application.DisplayAlerts = True 



End Sub 
1

Hi Это еще одно решение. В этом случае мы используем только один контур

Sub DelSheet() 

    Const strMONTHS As String = "January February March April May June July Auguest September October November December" 

    Dim sh As Worksheet 
    Dim arrSheetsToDelete() As String 
    Dim i As Long 

    ' Loop through the sheets and create the array 
    For Each sh In ThisWorkbook.Sheets 
     If Not InStr(1, strMONTHS, sh.Name) = 0 Then 
      ReDim Preserve arrSheetsToDelete(i) 
      arrSheetsToDelete(i) = sh.Name 
      i = i + 1 
     End If 
    Next sh 

    'Delete the array of sheets 
    Application.DisplayAlerts = False 
    ThisWorkbook.Sheets(arrSheetsToDelete).Delete 
    Application.DisplayAlerts = True   

End Sub 

Надеются, что это помогает :)

Смежные вопросы