Проверьте или проверьте, существует ли лист - 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 ]

2 голосов
/ 16 января 2015

Почему бы просто не использовать небольшой цикл, чтобы определить, существует ли именованный лист?Скажем, если вы искали рабочую таблицу с именем «Лист1» в текущей открытой книге.

Dim wb as Workbook
Dim ws as Worksheet

Set wb = ActiveWorkbook

For Each ws in wb.Worksheets

    if ws.Name = "Sheet1" then
        'Do something here
    End if

Next
2 голосов
/ 11 мая 2018

Компакт wsExists функция ( без опора на обработку ошибок!)

Вот короткая и простая функция, которая не полагается на обработку ошибок, чтобы определить, существует ли рабочий лист ( и должным образом объявлены для работы в любой ситуации!)

Function wsExists(wsName As String) As Boolean
    Dim ws: For Each ws In Sheets
    wsExists = (wsName = ws.Name): If wsExists Then Exit Function
    Next ws
End Function

Пример использования:

В следующем примере добавляется новый рабочий лист с именем myNewSheet, если он еще не существует:

If Not wsExists("myNewSheet") Then Sheets.Add.Name = "myNewSheet"

Дополнительная информация:

2 голосов
/ 09 января 2014

Поместите тест в функцию, и вы сможете повторно использовать его, и у вас будет более удобочитаемость кода.

НЕ используйте «On Error Resume Next», так как это может конфликтовать с другой частью вашего кода.

Sub DoesTheSheetExists()
    If SheetExist("SheetName") Then
        Debug.Print "The Sheet Exists"
    Else
        Debug.Print "The Sheet Does NOT Exists"
    End If
End Sub

Function SheetExist(strSheetName As String) As Boolean
    Dim i As Integer

    For i = 1 To Worksheets.Count
        If Worksheets(i).Name = strSheetName Then
            SheetExist = True
            Exit Function
        End If
    Next i
End Function
1 голос
/ 10 июля 2017

Измените «Данные» на любое имя листа, для которого вы проверяете ...

On Error Resume Next 

Set DataSheet = Sheets("Data")

If DataSheet Is Nothing Then

     Sheets.Add(after:=ActiveSheet).Name = "Data"
     ''or whatever alternate code you want to execute''
End If

On Error GoTo 0
1 голос
/ 28 марта 2017
    For Each Sheet In Worksheets
    If UCase(Sheet.Name) = "TEMP" Then
    'Your Code when the match is True
        Application.DisplayAlerts = False
        Sheet.Delete
        Application.DisplayAlerts = True
    '-----------------------------------
    End If
Next Sheet
1 голос
/ 28 июня 2016

Без сомнения, что вышеуказанная функция может работать, я только что получил следующий код, который работает довольно хорошо:

Sub Sheet_exist ()
On Error Resume Next
If Sheets("" & Range("Sheet_Name") & "") Is Nothing Then
    MsgBox "doesnt exist"
Else
    MsgBox "exist"
End if
End sub

Примечание: Sheets_Name - это место, где я прошу пользователя ввести имя, так что оно может не совпадать с вами.

1 голос
/ 05 августа 2013
Public Function WorkSheetExists(ByVal strName As String) As Boolean
   On Error Resume Next
   WorkSheetExists = Not Worksheets(strName) Is Nothing
End Function

sub test_sheet()

 If Not WorkSheetExists("SheetName") Then
 MsgBox "Not available"
Else MsgBox "Available"
End If

End Sub
1 голос
/ 17 февраля 2015

Я сделал еще одну вещь: удалите лист, только если он существует, чтобы не получить ошибку, если он не существует:

Excel.DisplayAlerts = False 
Dim WS
For Each WS In Excel.Worksheets
    If WS.name = "Sheet2" Then
        Excel.sheets("Sheet2").Delete
        Exit For
    End If
Next
Excel.DisplayAlerts = True
0 голосов
/ 14 июня 2018

Я придумал простой способ сделать это, но я не создал новый саб для него.Вместо этого я просто "проверил проверку" в сабвуфере, над которым я работал.Предполагая, что имя листа, которое мы ищем, это «Sheet_Exist», и мы просто хотим активировать его, если оно найдено:

Dim SheetCounter As Integer

SheetCounter = 1

Do Until Sheets(SheetCounter).Name = "Sheet_Exist" Or SheetCounter = Sheets.Count + 1
 SheetCounter = SheetCounter +1
Loop
If SheetCounter < Sheets.Count + 1 Then
 Sheets("Sheet_Exist").Activate
Else
 MsgBox("Worksheet ""Sheet_Exist"" was NOT found")
End If

Я также добавил всплывающее окно, когда лист не существует.

0 голосов
/ 04 апреля 2019

Я знаю, что это старый пост, но вот еще одно простое и быстрое решение.

Public Function worksheetExists(ByVal wb As Workbook, ByVal sheetNameStr As String) As Boolean

On Error Resume Next
worksheetExists = (wb.Worksheets(sheetNameStr).Name <> "")
Err.Clear: On Error GoTo 0

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