Проверьте или проверьте, существует ли лист - PullRequest
97 голосов
/ 14 июля 2011
Dim wkbkdestination As Workbook
Dim destsheet As Worksheet

For Each ThisWorkSheet In wkbkorigin.Worksheets 
    'this throws subscript out of range if there is not a sheet in the destination 
    'workbook that has the same name as the current sheet in the origin workbook.
    Set destsheet = wkbkdestination.Worksheets(ThisWorkSheet.Name) 
Next

В основном я перебираю все листы в исходной рабочей книге, а затем задаю destsheet в целевой книге для листа с тем же именем, что и текущий итерированный в исходной рабочей книге.

Как я могу проверить, существует ли этот лист? Что-то вроде:

If wkbkdestination.Worksheets(ThisWorkSheet.Name) Then 

Ответы [ 21 ]

147 голосов
/ 14 июля 2011

Некоторым людям не нравится этот подход из-за «неуместного» использования обработки ошибок, но я думаю, что он считается приемлемым в VBA ... Альтернативный подход - это циклическое прохождение всех листов, пока не будет найдено совпадение.

Function WorksheetExists(shtName As String, Optional wb As Workbook) As Boolean
    Dim sht As Worksheet

    If wb Is Nothing Then Set wb = ThisWorkbook
    On Error Resume Next
    Set sht = wb.Sheets(shtName)
    On Error GoTo 0
    WorksheetExists = Not sht Is Nothing
End Function
90 голосов
/ 12 февраля 2015

Если вас особенно интересуют только рабочие листы, вы можете использовать простой вызов Evaluate:

Function WorksheetExists(sName As String) As Boolean
    WorksheetExists = Evaluate("ISREF('" & sName & "'!A1)")
End Function
39 голосов
/ 28 марта 2013

Вам не нужна обработка ошибок для этого. Все, что вам нужно сделать, это перебрать все рабочие листы и проверить, существует ли указанное имя:

For i = 1 To Worksheets.Count
    If Worksheets(i).Name = "MySheet" Then
        exists = True
    End If
Next i

If Not exists Then
    Worksheets.Add.Name = "MySheet"
End If
19 голосов
/ 25 января 2013

Поскольку проверка членов коллекции является общей проблемой, вот краткая версия ответа Тима:

Function Contains(objCollection As Object, strName as String) As Boolean
    Dim o as Object
    On Error Resume Next
    set o = objCollection(strName)
    Contains = (Err.Number = 0)
    Err.Clear
 End Function

Эта функция может использоваться с любой коллекцией, подобной объекту (Shapes, Range, Names, Workbooks и т. Д.).

Чтобы проверить наличие листа, используйте If Contains(Sheets, "SheetName") ...

15 голосов
/ 17 февраля 2015

Исправлено: Без обработки ошибок:

Function CheckIfSheetExists(SheetName As String) As Boolean
      CheckIfSheetExists = False
      For Each WS In Worksheets
        If SheetName = WS.name Then
          CheckIfSheetExists = True
          Exit Function
        End If
      Next WS
End Function
12 голосов
/ 07 января 2016

В случае, если кто-то хочет избежать VBA и проверить, существует ли рабочий лист исключительно в формуле ячейки, это возможно с помощью функций ISREF и INDIRECT:

=ISREF(INDIRECT("SheetName!A1"))

Это вернет TRUE, если рабочая книга содержит листы с именами SheetName и FALSE в противном случае.

6 голосов
/ 16 апреля 2018

Я написал это:

Function sheetExist(sSheet As String) As Boolean
On Error Resume Next
sheetExist = (ActiveWorkbook.Sheets(sSheet).Index > 0)
End Function
5 голосов
/ 03 августа 2014

Мое решение очень похоже на Tims, но работает и в случае листов вне листа - диаграммы

Public Function SheetExists(strSheetName As String, Optional wbWorkbook As Workbook) As Boolean
    If wbWorkbook Is Nothing Then Set wbWorkbook = ActiveWorkbook 'or ThisWorkbook - whichever appropriate
    Dim obj As Object
    On Error GoTo HandleError
    Set obj = wbWorkbook.Sheets(strSheetName)
    SheetExists = True
    Exit Function
HandleError:
    SheetExists = False
End Function

.

2 голосов
/ 23 мая 2017

Если вы фанат WorksheetFunction. или работаете не из английской страны с неанглийским Excel, это хорошее решение, которое работает:

WorksheetFunction.IsErr(Evaluate("'" & wsName & "'!A1"))

Или в такой функции:

Function WorksheetExists(sName As String) As Boolean
    WorksheetExists = Not WorksheetFunction.IsErr(Evaluate("'" & sName & "'!A1"))
End Function
2 голосов
/ 01 августа 2016

Много лет спустя, но мне просто нужно было сделать это, и мне не понравилось ни одно из опубликованных решений ... Так что я придумал одно, все благодаря магии (Радужный жест Губки Боба) "Оценить ()" !

Evaluate("IsError(" & vSheetName & "!1:1)")

Возвращает TRUE, если Sheet не существует; ЛОЖЬ, если лист существует. Вы можете заменить любой диапазон на «1: 1», но я советую не использовать одну ячейку, потому что, если она содержит ошибку (например, # N / A), она вернет True.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...