Удалить строку, равную имени рабочего листа

#excel #vba

Вопрос:

Я планирую добавить кнопку удаления в каждый из моих листов, чтобы пользователи могли удалять по 1 листу за раз. Но перед удалением активного рабочего листа (код ниже) Я хотел бы на другом листе (Статистика объектов) удалить всю строку, содержащую то же имя, что и на удаляемом листе.

Другое имя рабочего листа: Статистика объектов, заголовки столбцов до строки 3

Имя рабочего листа находится в столбце B

 Sub DeleteActiveSheet()

Application.DisplayAlerts = False
ActiveSheet.Delete
Application.DisplayAlerts = True

End Sub
 

Итак, что должно произойти, так это:

  1. запустите команду удалить активный код рабочего листа
  2. код находит строку в листе статистики объектов с именем листа, подлежащего удалению, в столбце B
  3. код удаляет всю строку
  4. наконец, удаляет активный рабочий лист

Ответ №1:

Попробуйте этот код:

 Option Explicit

Sub DeleteActiveSheet()
    Const OBJ_STATS_NAME = "Object Stats", HEADER_ROW = 3
    Dim wsToDelete As Worksheet, OSWorksheet As Worksheet, row As Variant
    
    Set wsToDelete = ActiveSheet
    'check if ActiveSheet not the "Object Stats" and is in ThisWorkbook
    If wsToDelete.Name <> OBJ_STATS_NAME And wsToDelete.Parent Is ThisWorkbook Then
        Set OSWorksheet = ThisWorkbook.Worksheets(OBJ_STATS_NAME)
        row = Application.Match(wsToDelete.Name, OSWorksheet.Columns("B"), 0)
        If IsNumeric(row) Then
            If row > HEADER_ROW Then
                If MsgBox("You want to delete '" amp; wsToDelete.Name amp; "' from '" amp; ThisWorkbook.Name amp; "'?", _
                    vbExclamation   vbYesNo   vbDefaultButton2) = vbYes Then
                    OSWorksheet.Rows(row).Delete
                    Debug.Print "Deleted row # " amp; row amp; " from '" amp; OBJ_STATS_NAME amp; "' with value '" amp; wsToDelete.Name amp; "'"
                    Application.DisplayAlerts = False
                    wsToDelete.Delete
                    Application.DisplayAlerts = True
                End If
            End If
        Else
            MsgBox "You can't delete this Worksheet because it name not in '" amp; OBJ_STATS_NAME amp; "' list", vbCritical   vbOKOnly
        End If
    Else
        MsgBox "You can't delete this Worksheet by 'Sub DeleteActiveSheet()':" amp; vbLf amp; _
            "ActiveSheet is the 'Object Stats' or is not in ThisWorkbook", vbCritical   vbOKOnly
    End If
End Sub
 

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

Комментарии:

1. Это отлично работает! Мне нужно было только вставить строку, чтобы снять защиту с рабочего листа, тогда он работал именно так, как мне было нужно. Большое вам спасибо!