VBA: удалить листы после определенного листа - PullRequest
0 голосов
/ 29 ноября 2018

Мне нужно удалить все листы после листа с именем «шаблон 1».

Пока я пробовал

Sub SheetKiller()
    Dim i As Long
    Dim j As Long
    j = 0
    For i = 1 To Sheets.Count
        If Sheets(i).Name = "template 1" Then
            j = i
        End If
    Next i

    If j = 0 Or j = Sheets.Count Then Exit Sub

    Application.DisplayAlerts = False
        For i = Sheets.Count To j + 1 Step -1
            Sheets(i).Delete
        Next i
    Application.DisplayAlerts = True 
End Sub

Однако я получаю сообщение об ошибке «Метод удаления листа»класс провалился ".У кого-нибудь есть решение этой проблемы?

Ответы [ 4 ]

0 голосов
/ 29 ноября 2018

Возвращает номер Index листа и затем удаляет все листы с индексом выше этого.

Необходимо проверить, что «шаблон 1» - не единственный лист в книге или что он не последний лист в книге.Вам также необходимо удалить с последнего листа назад на первый - что, как я вижу, вы сделали в исходном коде.

Sub Test()

    Dim Indx As Long
    Dim x As Long

    With ThisWorkbook
        On Error Resume Next
            Indx = .Sheets("template 1").Index
        On Error GoTo 0

        If Indx <> 0 Then
            If .Sheets.Count > 1 And Indx < .Sheets.Count Then
                Application.DisplayAlerts = False
                For x = .Sheets.Count To Indx + 1 Step -1
                    .Sheets(x).Delete
                Next x
                Application.DisplayAlerts = True
            End If
        End If
    End With

End Sub

Редактировать: Только что понял - нужно также проверить, виден ли хотя бы один лист, но угадать, что "шаблон 1" будет виден, так что немного обманывая и не проверяядля этого.:)

Редактировать 2: Я добавил проверку, чтобы убедиться, что шаблон 1 существует.Обычно я передаю это отдельной функции, которая возвращает TRUE / FALSE.

Редактировать 3: Извините!Изменено Worksheets на Sheets, поэтому оно включает листы диаграммы.

0 голосов
/ 29 ноября 2018

Убедитесь, что вы сохранили файл с включенными макросами, а затем попробуйте:

Заменить:

Sheets(i).Delete

Заменить на:

ThisWorkbook.Worksheets(i).Delete
0 голосов
/ 29 ноября 2018

Единственное, что я могу придумать, чтобы выкинуть эту ошибку, это иметь «Очень скрытый» лист в вашей книге.«Очень скрытые» листы не будут удалены с помощью вашей функции.Попробуйте это:

Sub SheetKiller()
    Dim i As Long
    Dim j As Long
    Dim bFound As Boolean

    j = 0
    bFound = False

    For i = 1 To Sheets.Count
        If bFound Then Sheets(i).Visible = 0
        If Sheets(i).Name = "template 1" Then
            j = i
            bFound = True
        End If
    Next i

    If j = 0 Or j = Sheets.Count Then Exit Sub

    Application.DisplayAlerts = False
        For i = Sheets.Count To j + 1 Step -1
            Sheets(i).Delete
        Next i
    Application.DisplayAlerts = True
End Sub

Это сделает все листы, которые будут удалены, «Скрытыми», что позволяет удалять их, даже не отображая.Если лист «Очень скрытый» должен остаться, используйте это:

Sub SheetKiller()
    Dim i As Long
    Dim j As Long

    j = 0
    For i = 1 To Sheets.Count
        If Sheets(i).Name = "template 1" Then
            j = i
        End If
    Next i

    If j = 0 Or j = Sheets.Count Then Exit Sub

    Application.DisplayAlerts = False
        For i = Sheets.Count To j + 1 Step -1
            If Sheets(i).Visible < 2 Then Sheets(i).Delete
        Next i
    Application.DisplayAlerts = True
End Sub
0 голосов
/ 29 ноября 2018

Пожалуйста, попробуйте

ThisWorkbook.Sheets(i).Delete

вместо Sheets(i).Delete

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...