Проверка существования листа в рабочей книге Excel из кода VBA с помощью присвоения его объектной переменной или перебора существующих листов циклом.
Присвоение листа объектной переменной
Пользовательская функция VBA Excel для проверки существования листа в рабочей книге путем определения результата присвоения ссылки на него объектной переменной. Присвоение состоялось (SheetExist = True) – искомый лист существует, произошла ошибка и присвоение не состоялось (SheetExist = False) – лист не существует.
Function SheetExist(WbName As String, ShName As String) As Boolean Dim mySheet As Worksheet On Error Resume Next Set mySheet = Workbooks(WbName).Sheets(ShName) SheetExist = Not mySheet Is Nothing End Function |
Аргументы функции SheetExist:
- WbName – имя открытой рабочей книги, в которой ищется лист.
- ShName – имя искомого рабочего листа.
Перебор существующих листов циклом
Проверка существования рабочего листа в книге Excel с помощью перебора существующих листов циклом VBA и сравнения их имен с именем искомого листа. Совпадение найдено (SheetExist = True) – искомый лист существует, совпадение не найдено (SheetExist = False) – лист не существует.
Function SheetExist(WbName As String, ShName As String) As Boolean Dim mySheet As Worksheet For Each mySheet In Workbooks(WbName).Sheets If mySheet.Name = ShName Then SheetExist = True Exit Function End If Next End Function |
Пример проверки существования листа
Пример проверки существования искомого листа в рабочей книге Excel с помощью пользовательской функции VBA SheetExist:
Sub Primer() If SheetExist(ThisWorkbook.Name, «Лист1») Then MsgBox «Лист существует» Else MsgBox «Лист не существует» End If End Sub |
Имя сторонней открытой книги должно быть указано вместе с расширением:
... If SheetExist(«Книга2.xlsm», «Лист2») Then ... |
Обратите внимание, если книга, имя которой указано в параметре WbName закрыта или не существует, будет сгенерирована ошибка.
Чтобы функция проверки существования рабочего листа SheetExist была доступна из модуля любой книги Excel на вашем компьютере, разместите ее в Личной книге макросов.
Хитрости »
1 Май 2011 136643 просмотров
Как узнать существует ли лист в книге?
Довольно часто при добавлении листов в книгу кодом необходимо удостовериться существует ли уже лист с таким именем или же нет. Т.к. если уже существует, то попытка создать лист с таким же именем неизбежно приведет к ошибке. Можно, конечно, поставить обработчик ошибки On Error.
Sub Add_New_Sheet() On Error Resume Next Sheets.Add(, Sheets(Sheets.Count)).Name = "Новый лист" End Sub
Но тогда, если лист с таким именем уже существует, будет создан лист со следующим порядковым номером(типа Лист4). А этого в большинстве случаев не надо, т.к. обычно планируется все же либо создать лист с нужным именем, либо не создавать вовсе.
Я обычно проверяю так:
Sub Add_New_Sheet() Dim wsSh As Worksheet On Error Resume Next Set wsSh = Sheets("Новый лист") If wsSh Is Nothing Then Sheets.Add(, Sheets(Sheets.Count)).Name = "Новый лист" 'здесь можно либо активировать лист, либо производить еще какие действия 'wsSh.Activate End Sub
Если предполагается использовать такую проверку более одного раза в коде, то имеет смысл вынести проверку в отдельную функцию
Function Sh_Exist(wb As Workbook, sName As String) As Boolean Dim wsSh As Worksheet On Error Resume Next Set wsSh = wb.Sheets(sName) Sh_Exist = Not wsSh Is Nothing End Function
Функция проверяет наличие листа в указанной книге и возвращает True, если лист есть в книге и False, если листа нет.
wb — объект Workbook, наличие листа в которой надо проверить.
sName — имя листа, наличие которого необходимо проверить.
Код функции Sh_Exist необходимо поместить в стандартный модуль и тогда для проверки наличия листа достаточно будет одной строки кода:
Sub Add_New_Sheet() If Not Sh_Exist(ActiveWorkbook, "Новый лист") Then ActiveWorkbook.Sheets.Add(, ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)).Name = "Новый лист" End If End Sub
«Новый лист» — вместо этого текста указывается имя листа, наличие которого необходимо проверить.
Если проверять надо не в активной книге, а в какой-либо другой, то вместо ActiveWorkbook необходимо указать эту книгу. Например, если книга называется «Отчет.xlsx», то код будет таким:
Sub Add_New_Sheet() If Not Sh_Exist(Workbooks("Отчет.xlsx"), "Новый лист") Then Workbooks("Отчет.xlsx").Sheets.Add(, Workbooks("Отчет.xlsx").Sheets(Workbooks("Отчет.xlsx").Sheets.Count)).Name = "Новый лист" End If End Sub
Хотя в данном случае практичнее выделить отдельную переменную:
Sub Add_New_Sheet() Dim wbCheck As Workbook Set wbCheck = Workbooks("Отчет.xlsx") If Not Sh_Exist(wbCheck, "Новый лист") Then wbCheck.Sheets.Add(, wbCheck.Sheets(wbCheck.Sheets.Count)).Name = "Новый лист" End If End Sub
Можно еще упростить и конструкцию With использовать, но это уже другая тема
Также см.:
Как проверить открыта ли книга?
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
Дабы не создавать новую тему,
В моей книге есть макросы, имеющие в своем составе формулы со ссылками на другие листы этой книги. При запуске макросов необходимо проверить книгу на соответствие имен листов (не изменил ли кто случайно). если все ОК, то запускаем другой макрос, если нет, то сообщение, какой лист нужно проверить.
воспользовался примером Busine2012, и Казанский, написал код:
Visual Basic | ||
|
Макрос работает.
Вопрос: можно ли упростить код для проверки имен листов, если число проверяемых листов на правильность имени будет больше 10 (без ухудшения производительности)?
Было бы конечно лучше, если макрос сам переименовывал неправильные названия без участия пользователя..
Заранее спасибо.
Добавлено через 25 минут
Сообщение от dmb2
Было бы конечно лучше, если макрос сам переименовывал неправильные названия без участия пользователя..
Visual Basic | ||
|
Добавлено через 5 минут
Но код проверяет (соответственно и переименовывает неправильные листы) по одному за работу всего цикла. Хотелось бы чтобы сразу все листы проверил, и все исправил.
Добавлено через 5 минут
Возникла мысль, хотелось бы узнать мнение о целесообразности,
Может обойтись без проверки листов и сразу все листы переименовать?
seelena Пользователь Сообщений: 24 |
У меня макрос должен копировать лист, вставлять, а затем переименовывать в определенное название. |
for each ws in sheets.collection |
|
seelena Пользователь Сообщений: 24 |
{quote}{login=}{date=18.03.2010 03:39}{thema=}{post}for each ws in sheets.collection А не подскажите, как правильно это добавить? Как не пытаюсь, ошибки выдает( У меня сейчас: On Error Resume Next |
Hugo Пользователь Сообщений: 23253 |
Зачем столько селектов? Sub tt() |
seelena Пользователь Сообщений: 24 |
{quote}{login=Hugo}{date=18.03.2010 04:29}{thema=}{post}Зачем столько селектов? Sub tt() А как сюда проверку вставить на то, есть ли уже такой лист или нет? |
Dophin Пользователь Сообщений: 2684 |
Sub tt() |
Dophin Пользователь Сообщений: 2684 |
Sub tt() Sheets(«Прайс лист»).Copy Before:=Sheets(1) то есть вот так конечно) |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
Строка Sheets(«Бланк заказа»).Select на мой взгляд лишняя — новый лист (копия) сам активируется. |
Igor67 Пользователь Сообщений: 3729 |
#9 18.03.2010 22:26:06 Есть такой замечательный ресурс http://msoffice.nm.ru/faq/macros.htm А это подборка вариантов определения наличия определенного листа в книге http://www.msoffice.nm.ru ‘ Private Function WorksheetIsExist(iName$) As Boolean Private Function WorksheetIsExist(iName$) As Boolean Private Function WorksheetIsExist(iName$) As Boolean Private Function WorksheetIsExist(iName$) As Boolean Private Function WorksheetIsExist(iName$) As Boolean Пример вызова любой из вышеопубликованных авторских функций : Private Sub Test() |
Как проверить, существует ли лист в книге?
Когда у вас есть десятки рабочих листов или даже сотни рабочих листов в рабочей книге, и вы хотите найти или проверить, существует ли лист в этой рабочей книге, в общем, это может быть огромной работой. Теперь я представляю код VBA и удобный инструмент для быстрой проверки наличия листа в рабочей книге.
Проверьте, существует ли лист в книге с помощью VBA
Проверьте, существует ли лист, и переключитесь на него с помощью Kutools for Excel
Проверьте, существует ли лист в книге
Выполните следующие действия, чтобы скопировать код VBA и запустить его, чтобы проверить, существует ли лист в текущей книге.
1. Нажмите Alt + F11 для отображения Microsoft Visual Basic для приложений окно.
2. В окне нажмите Вставить > Модули чтобы отобразить новое окно модуля, затем скопируйте следующий код VBA в окно модуля.
VBA: проверьте, существует ли лист в книге.
Function CheckSheet(pName As String) As Boolean
'Updateby20140617
Dim IsExist As Boolean
IsExist = False
For i = 1 To Application.ActiveWorkbook.Sheets.Count
If Application.ActiveWorkbook.Sheets(i).Name = pName Then
IsExist = True
Exit For
End If
Next
CheckSheet = IsExist
End Function
3. Сохраните этот код, вернитесь на лист и выберите пустую ячейку, чтобы ввести эту формулу. = CheckSheet («Shee1») (Sheet1 указывает имя листа, которое вы хотите проверить, существует ли он) в него, нажмите Enter кнопка, НЕПРАВДА указывает, что этот лист не существует, и TURE указывает, что он существует в текущей книге.
Проверьте, существует ли лист, и переключитесь на него с помощью Kutools for Excel с VBA
С помощью указанной выше функции вы просто можете проверить, существует ли лист, что также немного сложно. Однако с Kutools for Excel, в области навигации перечислены все имена листов, которые поддерживают прокрутку, чтобы найти лист, или фильтровать имя листа, чтобы найти лист, и при необходимости вы можете щелкнуть имя листа, чтобы быстро переключиться на лист после поиска.
После бесплатная установка Kutools for Excel, пожалуйста, сделайте следующее:
1. включите книгу, в которой вы хотите проверить имя листа, если оно существует, а затем щелкните Кутулс > Навигация. Смотрите скриншот
:
2. Затем на всплывающей панели щелкните Рабочая тетрадь и лист кнопку, чтобы развернуть панель, вы можете увидеть весь список имен листов на панели, вы можете прокрутить, чтобы найти имена листов.
3. Или вы можете проверить Фильтр Нажмите кнопку, затем введите ключевые слова имени листа, который вы хотите проверить, затем указанное имя листа будет списком, щелкните имя листа, затем оно перейдет к листу.
Лучшие инструменты для работы в офисе
Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%
- Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
- Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон…
- Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны…
- Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
- Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
- Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии…
- Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
- Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF…
- Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.
Вкладка Office: интерфейс с вкладками в Office и упрощение работы
- Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
- Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
- Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!