Проверка существования листа в рабочей книге 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 136606 просмотров
Как узнать существует ли лист в книге?
Довольно часто при добавлении листов в книгу кодом необходимо удостовериться существует ли уже лист с таким именем или же нет. Т.к. если уже существует, то попытка создать лист с таким же именем неизбежно приведет к ошибке. Можно, конечно, поставить обработчик ошибки 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 минут
Возникла мысль, хотелось бы узнать мнение о целесообразности,
Может обойтись без проверки листов и сразу все листы переименовать?
От Климова П.Ю.
Вариант 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
If you want to create a sheet, want to delete it, or move or copy it, there’s one thing that you need to know if that sheet exists or not.
To write code to check whether the sheet exists or not you need a loop that loops through each sheet in the workbook and matches the name you have provided. But here’s the thing, you can use two different loops for this (For Next and For Each), and today we will use both.
In this tutorial, we will look at different ways to do that, so, make sure to have the developer tab on your ribbon and open the VBA editor to write this code.
Check IF a Sheet Exists in the Current Workbook
With this loop, you can refer to all the sheets in the workbook and loop through each one by one to match the name of the sheet with the sheet name that you want to search for.
Follow these steps:
- First, declare a variable to use for the sheet while performing the loop and to store the sheet name that you want to search.
- Next, write a line of code for an input box to enter the name of the sheet that you wish to search.
- After that, start your loop with the For Each keyword. And use the variable to refer to each worksheet in the workbook.
- From here, you need to write an IF THEN ELSE statement to match the name of the sheet with the name that you have entered in the input box, and then show a message box if match found and exit the procedure.
- In the end, a message box to inform you if there’s no match found.
Helpful Links: Run a Macro – Macro Recorder – Visual Basic Editor – Personal Macro Workbook
Full Code:
Sub vba_check_sheet()
Dim sht As Worksheet
Dim shtName As String
shtName = InputBox(Prompt:="Enter the sheet name", _
Title:="Search Sheet")
For Each sht In ThisWorkbook.Worksheets
If sht.Name = shtName Then
MsgBox "Yes! " & shtName & " is there in the workbook."
Exit Sub
End If
Next sht
MsgBox "No! " & shtName & "is not there in the workbook."
End Sub
Let me explain how this works: When you run this code, it shows you a message where you need to enter the sheet name that you wish to find.
After that, it loops through each sheet to match the name with the name you have entered, and if the name matches with a sheet, it shows you a message and another message if there’s no match.
Here is another code to check if a sheet exists or not.
Sub vba_check_sheet()
Dim sht As Worksheet
Dim shtName As String
Dim i As Long
i = Sheets.Count
shtName = InputBox(Prompt:="Enter the sheet name", _
Title:="Search Sheet")
For i = 1 To i
If Sheets(i).Name = shtName Then
MsgBox "Yes! " & shtName & " is there in the workbook."
Exit Sub
End If
Next i
MsgBox "No! " & shtName & " is not there in the workbook."
End Sub
This code uses the FOR NEXT loop and uses the total count of sheets in the workbook, and based on that, perform a loop in each sheet that matches the name with the name you have entered.
Check IF Sheet Exists in Closed Workbook
In the following code, you have a loop that searches for the sheet name in a closed workbook. To refer to the file, we used the file address.
Sub vba_check_sheet()
Dim wb As Workbook
Dim sht As Worksheet
Dim shtName As String
shtName = InputBox(Prompt:="Enter the sheet name", _
Title:="Search Sheet")
Application.ScreenUpdating = False
Set wb = Workbooks.Open _
("C:UsersDellDesktopsample-file.xlsx")
For Each sht In wb.Worksheets
If sht.Name = shtName Then
wb.Close SaveChanges:=True
MsgBox "Yes! " & shtName & " is there in the workbook." _
, vbInformation, "Found"
Exit Sub
End If
Next sht
Application.ScreenUpdating = False
MsgBox "No! " & shtName _
& " is not there in the workbook.", _
vbCritical, "Not Found"
End Sub
When you run this macro, it opens the file at the back end as you have turned OFF the screen updating, and once it loops through all the sheets, you have code to turn ON the screen updating.
Note: As you can see, in the file location address, we have the file extension that means you need to have the correct extension of the file to refer to it.
More Tutorials on VBA Worksheets
- Back to VBA Worksheet / VBA Tutorial