2011-05-18 14 views
26

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?Excel VBA Si WorkSheet ("wsName") Existe

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

La única cosa que he encontrado no funciona muy bien:

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 
+0

Véase también http://stackoverflow.com/q/6838437/2707864 y http: // stackoverflow.com/q/6688131/2707864 –

+3

@ chris-neilsen esta pregunta está marcada como duplicada, pero se preguntó primero? –

Respuesta

54

Una versión sin control 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 
+1

¡Gracias amigo, funcionó bien! –

+3

+1 No 'On Resume error Next', esto es lo que busco. –

+3

@Dante no es griego. ¿No es mejor si atenuamos 'ws'? –

24

No hay ninguna función integrada 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 
+2

Gracias, se ve bien. Usé este primero y funcionó un encanto también. –

+2

+1 Hecho de manera eficiente – brettdj

+2

Probablemente debería usar 'ActiveWorkbook' en lugar de' ThisWorkbook'. Este último se refiere al libro de trabajo que contiene el código de macro, que podría ser diferente del libro de trabajo que uno quiere probar. Supongo que 'ActiveWorkbook' sería útil para la mayoría de los casos (sin embargo, las situaciones artificiales siempre están disponibles). –

5

Otra version de la función sin control 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 
+0

Probablemente debería usar 'ActiveWorkbook' en lugar de' ThisWorkbook'. Este último se refiere al libro de trabajo que contiene el código de macro, que podría ser diferente del libro de trabajo que uno quiere probar. Supongo que 'ActiveWorkbook' sería útil para la mayoría de los casos (sin embargo, las situaciones artificiales siempre están disponibles). –

+0

no es necesario establecer el valor booleano en falso, es falso de forma predeterminada. – MattE

+0

eliminó la declaración. Gracias –

6

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 cambio de nombre en aswell

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 
+0

¡Salud! Esto también parece útil :) –

3

cambiado ligeramente 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 
+0

Probablemente debería usar 'ActiveWorkbook' en lugar de' ThisWorkbook'. Este último se refiere al libro de trabajo que contiene el código de macro, que podría ser diferente del libro de trabajo que uno quiere probar. Supongo que 'ActiveWorkbook' sería útil para la mayoría de los casos (sin embargo, las situaciones artificiales siempre están disponibles). –