#excel #vba
Вопрос:
Я планирую добавить кнопку удаления в каждый из моих листов, чтобы пользователи могли удалять по 1 листу за раз. Но перед удалением активного рабочего листа (код ниже) Я хотел бы на другом листе (Статистика объектов) удалить всю строку, содержащую то же имя, что и на удаляемом листе.
Другое имя рабочего листа: Статистика объектов, заголовки столбцов до строки 3
Имя рабочего листа находится в столбце B
Sub DeleteActiveSheet()
Application.DisplayAlerts = False
ActiveSheet.Delete
Application.DisplayAlerts = True
End Sub
Итак, что должно произойти, так это:
- запустите команду удалить активный код рабочего листа
- код находит строку в листе статистики объектов с именем листа, подлежащего удалению, в столбце B
- код удаляет всю строку
- наконец, удаляет активный рабочий лист
Ответ №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. Это отлично работает! Мне нужно было только вставить строку, чтобы снять защиту с рабочего листа, тогда он работал именно так, как мне было нужно. Большое вам спасибо!