Excel VBA Si WorkSheet (“wsName”) existe

Me pregunto si hay una funcionalidad de corte limpio que devuelva True o False si existe una hoja de trabajo dentro de un libro de trabajo.

Sería bueno, pero no esencial, si es posible hacerlo sin omitir el manejo de errores.

Lo único que he encontrado realmente no funciona:

On Error Resume Next If (Worksheets("wsName").Name  "") Then Debug.Print "Worksheet exists!" Else Debug.Print "Worksheet doesn't exist!" End If On Error GoTo ErrHandler 

Una versión sin manejo de errores:

 Function sheetExists(sheetToFind As String) As Boolean sheetExists = False For Each sheet In Worksheets If sheetToFind = sheet.name Then sheetExists = True Exit Function End If Next sheet End Function 

No hay una función incorporada para esto.

 Function SheetExists(SheetName As String, Optional wb As Excel.Workbook) Dim s As Excel.Worksheet If wb Is Nothing Then Set wb = ThisWorkbook On Error Resume Next Set s = wb.Sheets(SheetName) On Error GoTo 0 SheetExists = Not s Is Nothing End Function 

también una versión ligeramente diferente. Acabo de hacer un appllication.sheets.count para saber cuántas hojas de trabajo tengo también. bien y poner un poco de renombre también

 Sub insertworksheet() Dim worksh As Integer Dim worksheetexists As Boolean worksh = Application.Sheets.Count worksheetexists = False For x = 1 To worksh If Worksheets(x).Name = "ENTERWROKSHEETNAME" Then worksheetexists = True 'Debug.Print worksheetexists Exit For End If Next x If worksheetexists = False Then Debug.Print "transformed exists" Worksheets.Add after:=Worksheets(Worksheets.Count) ActiveSheet.Name = "ENTERNAMEUWANTTHENEWONE" End If End Sub 

Otra versión de la función sin manejo de errores. Esta vez no distingue entre mayúsculas y minúsculas y es un poco más eficiente.

 Function WorksheetExists(wsName As String) As Boolean Dim ws As Worksheet Dim ret As Boolean wsName = UCase(wsName) For Each ws In ThisWorkbook.Sheets If UCase(ws.Name) = wsName Then ret = True Exit For End If Next WorksheetExists = ret End Function 

Un poco cambiado al código de David Murdoch para la biblioteca genérica

 Function HasByName(cSheetName As String, _ Optional oWorkBook As Excel.Workbook) As Boolean HasByName = False Dim wb If oWorkBook Is Nothing Then Set oWorkBook = ThisWorkbook End If For Each wb In oWorkBook.Worksheets If wb.Name = cSheetName Then HasByName = True Exit Function End If Next wb End Function