2014-07-17 17 views
5

Użyłem trochę kodu VBA, aby przeszukać wszystkie nazwy arkuszy w skoroszycie dla określonego ciągu, nazwijmy go "Tekst". Po znalezieniu arkusza z tym ciągiem powinien usunąć ten arkusz. Ale powiedzmy, że istnieją cztery arkusze z „Tekst” w nazwie (o nazwie tekst 1, tekst 2, tekst 3 i tekst 4), zamiast usuwać wszystkie cztery, usuwa Tekst 1 i Tekst 3. Pozostawia 2 i 4 jako nieusunięte. Następnie, jeśli ponownie zadzwonię do makra, zostanie usunięte Tekst 2, ale pozostawi to Tekst 4. Wreszcie, jeśli kliknę to ponownie, usunie tekst 4. Nie mogę zrozumieć dlaczego tak wygląda, jak powinien działać.Arkusz makr VBA Excel Usuń arkusze z ciągiem

Dim i As Integer, n As Integer 
    n = ThisWorkbook.Worksheets.Count 
    i = 1 
    Application.DisplayAlerts = False 
    Application.ScreenUpdating = False 
    Do 
     On Error Resume Next 
     If InStr(1, Sheets(i).Name, "Text") Then Sheets(i).Delete 
     On Error GoTo 0 
     i = i + 1 
    Loop Until i = n 
    Application.DisplayAlerts = True 

    Application.ScreenUpdating = True 

Odpowiedz

13

Trzeba pętli wstecznej uniknąć arkusze pomijanie:

Dim i As Integer, n As Integer 
n = ThisWorkbook.Worksheets.Count 

Application.DisplayAlerts = False 
Application.ScreenUpdating = False 
For i = n to 1 step -1 
    On Error Resume Next 
    If InStr(1, Sheets(i).Name, "Text") Then Sheets(i).Delete 
    On Error GoTo 0 
Next i 
Application.DisplayAlerts = True 

Application.ScreenUpdating = True 

W przeciwnym razie, jeśli kod usuwa arkusz 1 arkusz 2 staje arkusz 1, ale jest zwiększane do 2, a więc oryginalny arkusz 2 nigdy nie jest przetwarzane.

+4

+ 1 Nicely Done –

2

Można również zmniejszyć N i nie zwiększy I jako Arkusz zostanie usunięty:

Dim i As Integer, n As Integer 
n = ThisWorkbook.Worksheets.Count 
i = 1 
Application.DisplayAlerts = False 
Application.ScreenUpdating = False 
Do 
    On Error Resume Next 
    If InStr(1, Sheets(i).Name, "Text") Then 
     Sheets(i).Delete 
     n = n-1 
    Else 
     On Error GoTo 0 
     i = i + 1 
    End If 
Loop Until i = n 
Application.DisplayAlerts = True 

Application.ScreenUpdating = True 
+0

Znowu, dla innych odniesienia to działa, ale wersja Rory ma dla mnie więcej sensu ze względu na sposób, w jaki jest napisana. – Samiko

3

Nie jestem VBA pro, ale to może działać jak dobrze, jeśli chcesz dać mu szansę;)

Dim WS As Worksheet 
Application.DisplayAlerts = False 
Application.ScreenUpdating = False 
For Each WS In Worksheets 
' Specify the "TEXT" you are looking for in the sheet name in uppercase! 
    If InStr(UCase(WS.Name), "TEXT") Then WS.Delete 
    On Error GoTo 0 
Next WS 
Application.DisplayAlerts = True 
Application.ScreenUpdating = True 
+0

To działa, więc dziękuję, ale zaznaczyłem Rory, ponieważ to miało dla mnie więcej sensu. – Samiko