Как проверить существует ли лист excel

Проверка существования листа в рабочей книге 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
   Sub ttt()
    
    'Создаём переменную, в которую поместим имя листа.
    Dim sName As String
    Dim aName As String
    
    'Создаём переменную, с помощью которой будем обращаться к нужному листу.
    Dim oSheet As Excel.Worksheet
    'Помещаем в переменные имена листов.
    sName = "ДАННЫЕ"
    aName = "РЕЗУЛЬТАТЫ"
    bName = "ИТОГИ
 
    On Error Resume Next
    
        'Присваиваем листу имя oSheet.
Set oSheet = Worksheets(sName)
  
    
        If Worksheets(sName) Is Nothing Then
            MsgBox "Проверь имя листа ДАННЫЕ.", vbCritical
   Else
    
Set oSheet = Worksheets(aName)
    
    If Worksheets(aName) Is Nothing Then
            MsgBox "проверь имя листа РЕЗУЛЬТАТЫ.", vbCritical
    Else
Set oSheet = Worksheets(bName)
    
    If Worksheets(bName) Is Nothing Then
            MsgBox "проверь имя листа ИТОГИ.", vbCritical
               Else
            MsgBox "Работа разрешена.", vbCritical  ' работа макроса
    End If
 End If
 End If
    
End Sub

Макрос работает.

Вопрос: можно ли упростить код для проверки имен листов, если число проверяемых листов на правильность имени будет больше 10 (без ухудшения производительности)?

Было бы конечно лучше, если макрос сам переименовывал неправильные названия без участия пользователя..

Заранее спасибо.

Добавлено через 25 минут

Цитата
Сообщение от dmb2
Посмотреть сообщение

Было бы конечно лучше, если макрос сам переименовывал неправильные названия без участия пользователя..

Visual Basic
1
Лист1.Name="Данные"

Добавлено через 5 минут
Но код проверяет (соответственно и переименовывает неправильные листы) по одному за работу всего цикла. Хотелось бы чтобы сразу все листы проверил, и все исправил.

Добавлено через 5 минут
Возникла мысль, хотелось бы узнать мнение о целесообразности,

Может обойтись без проверки листов и сразу все листы переименовать?

 

seelena

Пользователь

Сообщений: 24
Регистрация: 01.01.1970

У меня макрос должен копировать лист, вставлять, а затем переименовывать в определенное название.  
Подскажите, пожалуйста, как сделать так, что перед этим, была проверка, существует ли уже лист с этим названием?

 

for each ws in sheets.collection  
if newws=ws.name then  
next

 

seelena

Пользователь

Сообщений: 24
Регистрация: 01.01.1970

{quote}{login=}{date=18.03.2010 03:39}{thema=}{post}for each ws in sheets.collection  
if newws=ws.name then  
next{/post}{/quote}  

  А не подскажите, как правильно это добавить? Как не пытаюсь, ошибки выдает(  

  У меня сейчас:  

  On Error Resume Next  
   Sheets(«Прайс лист»).Select  
   Sheets(«Прайс лист»).Copy Before:=Sheets(1)  
   Sheets(«Прайс лист(2)»).Select  
   Sheets(«Прайс лист(2)»).Name = «Бланк заказа»  
   Sheets(«Бланк заказа»).Select

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

Зачем столько селектов?  

  Sub tt()  
Sheets(«Прайс лист»).Copy Before:=Sheets(1)  
Sheets(1).Name = «Бланк заказа»  
Sheets(«Бланк заказа»).Select  
End Sub

 

seelena

Пользователь

Сообщений: 24
Регистрация: 01.01.1970

{quote}{login=Hugo}{date=18.03.2010 04:29}{thema=}{post}Зачем столько селектов?  

  Sub tt()  
Sheets(«Прайс лист»).Copy Before:=Sheets(1)  
Sheets(1).Name = «Бланк заказа»  
Sheets(«Бланк заказа»).Select  
End Sub{/post}{/quote}  

  А как сюда проверку вставить на то, есть ли уже такой лист или нет?

 

Dophin

Пользователь

Сообщений: 2684
Регистрация: 01.01.1970

Sub tt()  
dim sh as worksheet  
for each sh in worksheets  
if sh.name=»Прайс лист» then  
msgbox «есть такой лист»  
else  
Sheets(«Прайс лист»).Copy Before:=Sheets(1)  
Sheets(1).Name = «Бланк заказа»  
Sheets(«Бланк заказа»).Select  
end if  
End Sub

 

Dophin

Пользователь

Сообщений: 2684
Регистрация: 01.01.1970

Sub tt()  
dim sh as worksheet  
for each sh in worksheets  
if sh.name=»Бланк заказа» then  
msgbox «есть такой лист»  
exit sub  
end if  
next sh  

  Sheets(«Прайс лист»).Copy Before:=Sheets(1)  
Sheets(1).Name = «Бланк заказа»  
Sheets(«Бланк заказа»).Select  
End Sub  

  то есть вот так конечно)

 

Юрий М

Модератор

Сообщений: 60585
Регистрация: 14.09.2012

Контакты см. в профиле

Строка Sheets(«Бланк заказа»).Select на мой взгляд лишняя — новый лист (копия) сам активируется.

 

Igor67

Пользователь

Сообщений: 3729
Регистрация: 21.12.2012

#9

18.03.2010 22:26:06

Есть такой замечательный ресурс  

http://msoffice.nm.ru/faq/macros.htm  

А это подборка вариантов определения наличия определенного листа в книге  
Private Function WorksheetIsExist(iName$) As Boolean  
‘***********************************************’  
‘   Дата создания 01/01/2005                    ‘  
‘   Автор Климов Павел Юрьевич                  ‘  
‘  

http://www.msoffice.nm.ru

                  ‘  
‘***********************************************’    
   On Error Resume Next  
   WorksheetIsExist = IsObject(Worksheets(iName$))  
End Function  

  Private Function WorksheetIsExist(iName$) As Boolean  
   On Error Resume Next  
   WorksheetIsExist = (TypeOf Worksheets(iName$) Is Worksheet)  
End Function  

  Private Function WorksheetIsExist(iName$) As Boolean  
   On Error Resume Next  
   WorksheetIsExist = (TypeName(Worksheets(iName$)) = «Worksheet»)  
End Function  

  Private Function WorksheetIsExist(iName$) As Boolean  
   On Error Resume Next  
   WorksheetIsExist = (VarType(Worksheets(iName$)) = vbObject)  
End Function  

  Private Function WorksheetIsExist(iName$) As Boolean  
   On Error Resume Next  
   WorksheetIsExist = Len(Worksheets(iName$).Name) > 0  
End Function  

  Private Function WorksheetIsExist(iName$) As Boolean  
   On Error Resume Next  
   WorksheetIsExist = Worksheets(iName$).Index > 0  
End Function  

  Пример вызова любой из вышеопубликованных авторских функций :  

  Private Sub Test()  
   MsgBox WorksheetIsExist(«Имя_Рабочего_Листа»)  
End Sub

Как проверить, существует ли лист в книге?

Когда у вас есть десятки рабочих листов или даже сотни рабочих листов в рабочей книге, и вы хотите найти или проверить, существует ли лист в этой рабочей книге, в общем, это может быть огромной работой. Теперь я представляю код VBA и удобный инструмент для быстрой проверки наличия листа в рабочей книге.

Проверьте, существует ли лист в книге с помощью VBA

Проверьте, существует ли лист, и переключитесь на него с помощью Kutools for Excel хорошая идея3


Проверьте, существует ли лист в книге

Выполните следующие действия, чтобы скопировать код 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. включите книгу, в которой вы хотите проверить имя листа, если оно существует, а затем щелкните Кутулс > Навигация. Смотрите скриншот
:документ проверьте, существует ли лист 1

2. Затем на всплывающей панели щелкните Рабочая тетрадь и лист кнопку, чтобы развернуть панель, вы можете увидеть весь список имен листов на панели, вы можете прокрутить, чтобы найти имена листов.
doc kutools панель навигации 2

3. Или вы можете проверить Фильтр Нажмите кнопку, затем введите ключевые слова имени листа, который вы хотите проверить, затем указанное имя листа будет списком, щелкните имя листа, затем оно перейдет к листу.
doc kutools панель навигации 3


Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Like this post? Please share to your friends:
  • Как проверить строки на дубли в excel
  • Как проверить столбец на повторяющиеся значения в excel
  • Как проверить столбец на дубли excel
  • Как проверить ссылки в word
  • Как проверить список в excel