Excel vba есть ли такой лист

Проверка существования листа в рабочей книге 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              136604 просмотров


Как узнать существует ли лист в книге?

Довольно часто при добавлении листов в книгу кодом необходимо удостовериться существует ли уже лист с таким именем или же нет. Т.к. если уже существует, то попытка создать лист с таким же именем неизбежно приведет к ошибке. Можно, конечно, поставить обработчик ошибки 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
ссылки
статистика

От Климова П.Ю.  
Вариант I. (без ‘генерации’ ошибки)    
Option Compare Text  ‘Если Вы не  
понимаете, зачем используется эта инструкция, то оставьте её в покое  

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

http://www.msoffice.nm.ru

                  ‘  
‘***********************************************’    
   Dim iList As Worksheet    
   For Each iList In Worksheets    
       If iList.Name = iName$ Then    
          WorksheetIsExist = True    
          Exit Function    
       End If    
   Next    
   WorksheetIsExist = False    
End Function  

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

http://www.msoffice.nm.ru

                  ‘  
‘***********************************************’    
   Dim iList As Worksheet    
   For Each iList In Worksheets    
       If StrComp(iList.Name, iName$, vbTextCompare) = 0 Then  
          WorksheetIsExist = True  
          Exit Function  
       End If  
   Next  
   WorksheetIsExist = False  
End Function  

  Вариант II.    
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

Дабы не создавать новую тему,

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

воспользовался примером 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 минут
Возникла мысль, хотелось бы узнать мнение о целесообразности,

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

Понравилась статья? Поделить с друзьями:
  • Excel vba длина string
  • Excel vba диспетчер имени
  • Excel vba динамический массив массивов
  • Excel vba диапазон ячеек в переменную
  • Excel vba диапазон непустых ячеек