Удалить лист, если он существует, и создать новый

Вопрос:Я хочу просмотреть листы Excel, найти лист с определенным именем и удалить этот лист, если он найден. После этого я хочу создать лист после всех существующих листов с таким именем. Мой код выглядит следующим образом: For Each ws In Worksheets If ws.Name = "asdf" Then Application.DisplayAlerts = False Sheets("asdf").Delete Application.DisplayAlerts = True End End If

Вопрос:

Я хочу просмотреть листы Excel, найти лист с определенным именем и удалить этот лист, если он найден. После этого я хочу создать лист после всех существующих листов с таким именем. Мой код выглядит следующим образом:

For Each ws In Worksheets If ws.Name = «asdf» Then Application.DisplayAlerts = False Sheets(«asdf»).Delete Application.DisplayAlerts = True End End If Next Sheets.Add(After:=Sheets(Sheets.count)).Name = «asdf»

Однако это не делает оба эти действия за один прогон кода. Если лист уже существует, он просто удалит лист и не создаст новый, как я хочу. Мне нужно запустить его снова, чтобы создать новый.

Как мне исправить мой код, чтобы удалить старый лист, если он существует, и создать новый?

Лучший ответ:

Удалите оператор End, ваш код прекращает работу после поиска и удаления листа asdf.

For Each ws In Worksheets If ws.Name = «asdf» Then Application.DisplayAlerts = False Sheets(«asdf»).Delete Application.DisplayAlerts = True End If Next Sheets.Add(After:=Sheets(Sheets.count)).Name = «asdf» Ответ №1

Вместо прохождения Worksheets вы можете проверить наличие элемента в коллекции, попробовав и получив его:

Function GetWorksheet(shtName As String) As Worksheet On Error Resume Next Set GetWorksheet = Worksheets(shtName) End Function If Not GetWorksheet(«asdf») Is Nothing Then Application.DisplayAlerts = False Worksheets(«asdf»).Delete Application.DisplayAlerts = True End If Worksheets.Add(After:=sheets(sheets.Count)).name = «asdf»

Однако самый простой способ – попытаться удалить лист, когда он обернут в “блок” On Error Resume Next – On Error GoTo 0:

Application.DisplayAlerts = False On Error Resume Next Worksheets(«asdf»).Delete On Error GoTo 0 Application.DisplayAlerts = True Worksheets.Add(After:=sheets(sheets.Count)).name = «asdf» Ответ №2

Я не согласен с тем, что “самый простой” подход заключается в намеренном генерировании (и подавлении) ошибки. Лично я бы выбрал метод loop-to-locate, только пытаясь удалить его, если объект существует.

Если вы все равно собираетесь заново создавать рабочий лист, это подойдет практически во всех случаях:

Sheets(«asdf»).Cells.Delete ‘deletes all cells in the specified worksheet Содержание

  1. Безопасное удаление листа
  2. Удалить & Заменить лист
  3. О ThisWorkbook:

Безопасное удаление листа

Если однострочник (выше) не работает для вас (возможно, из-за некоторых упрямых цветов фона/изображений), то здесь подпункт, который вы можете вызвать, чтобы удалить любой указанный лист:

Sub deleteSheet(wsName As String) Dim ws As Worksheet For Each ws In ThisWorkbook.Sheets ‘loop to find sheet (if it exists) Application.DisplayAlerts = False ‘hide confirmation from user If ws.Name = wsName Then ws.Delete ‘found it! — delete it Application.DisplayAlerts = True ‘show future confirmations Next ws End Sub

Назовите это просто как:

deleteSheet «asdf»

… где asdf – это имя листа (вкладки), который нужно удалить.

Удалить & Заменить лист

Кроме того, вызов подпункта ниже приведет к удалению и замене листа, присвоив ему то же имя и поместив его в ту же позицию вкладки, что и оригинал:

Sub resetSheet(wsName As String) Dim ws As Worksheet, ws2 As Worksheet For Each ws In ThisWorkbook.Sheets ‘loop to find sheet (if it exists) If ws.Name = wsName Then ‘found it! Set ws2 = ThisWorkbook.Sheets.Add(ws) ‘add new sheet located before old one Application.DisplayAlerts = False ‘hide confirmation from user ws.Delete ‘delete sheet (new one takes its place) Application.DisplayAlerts = True ‘show future confirmations ws2.Name = wsName ‘rename new sheet to old name Exit Sub ‘finished! (no need to continue looping) End If Next ws End Sub

О ThisWorkbook:

Я использовал ThisWorkbook в обеих подпрограммах, что важно при работе с VBA, которая изменяет другие книги, или когда у вас открыто несколько книг одновременно.

Использование ThisWorkbook гарантирует, что ваш код всегда ссылается на книгу, в которой находится код, который его вызвал.

Без этого, например, если у вас открыты два одинаковых файла, и вы смотрите один, ожидая запуска VBA в другой книге, если в книге, которая “сверху”, есть лист с именем тот VBA, который пытается удалить, удалит лист в текущей (активной) книге вместо намеченной.

(… и вы не можете Ctrl + Z отменить VBA!)

Оцените статью
Добавить комментарий