MyTetra Share
Делитесь знаниями!
Как узнать существует ли лист в книге?
Время создания: 16.03.2019 23:43
Текстовые метки: SheetExist
Раздел: !Закладки - VBA - Excel - Листы
Запись: xintrea/mytetra_db_adgaver_new/master/base/1514991231mwe4fofzjv/text.html на raw.githubusercontent.com

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


' =====================================================================================

' ##### существует ли лист в книге

'

' -------------------------------------------------------------------------------------

Function FnSh_Exist(oWb As Workbook, sName As String) As Boolean

Dim wsSh As Worksheet

On Error Resume Next

Set wsSh = oWb.Sheets(sName)

FnSh_Exist = Not wsSh Is Nothing

End Function

' =====================================================================================


' =====================================================================================

' ##### Добавление(назначение листа)

'

Sub test_FnAdd_New_Sheet()

Set oSh = FnAdd_New_Sheet(ThisWorkbook, "Def")

End Sub

' -------------------------------------------------------------------------------------

Function FnAdd_New_Sheet(ByVal oWb As Workbook, _

ByVal strShName As String) As Worksheet

Dim wsSh As Worksheet

On Error Resume Next

blnShExist = FnSh_Exist(oWb, strShName) 'проверка существования листа

If blnShExist Then

Set FnAdd_New_Sheet = oWb.Sheets(strShName)

Else

oWb.Sheets.Add(, oWb.Sheets(oWb.Sheets.Count)).Name = strShName

Set FnAdd_New_Sheet = oWb.Sheets(strShName)

End If

End Function

' =====================================================================================

Довольно часто при добавлении листов в книгу кодом необходимо удостовериться существует ли уже лист с таким именем или же нет. Т.к. если уже существует, то попытка создать лист с таким же именем неизбежно приведет к ошибке. Можно, конечно, поставить обработчик ошибки On Error.

Sub Add_New_Sheet() On Error Resume Next Sheets.Add(, Sheets(Sheets.Count)).Name = "Новый лист" End Sub


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


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


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


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()

    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


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 использовать, но это уже другая тема

Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования