¿Como comprobar la existencia de una Hoja en un libro de calculo mediante macros?

Estoy trabajando en una macro que compruebe la existencia de una hoja en un libro de excel, si esta hoja existe la debe eliminar y luego ir al proceso (etiqueta) que llame "crear". Si la hoja no existe igualmente se deberá dirigir a "crear". Ya tengo un código hecho y este me funciona solo cuando la hoja existe, pero cuando la hoja NO existe me genera un error

ref = ActiveSheet.Range("B8896").Value
tope = ref + 1
cont = 1
Dim evn As String
evn = "Datos_Resumen"
'
Ext = (Worksheets("Datos_Resumen").Name <> "")
'
'If Not evn Then
If Ext = True Then
    Sheets("Datos_Resumen").Delete
    GoTo Crear
'
Else
'
    GoTo Crear
'
End If
'
'
Crear:

La razón del error es bastante clara, cuando la hoja NO existe se le estaría asignando a una variable el nombre de una hoja pues eso que no existe, pero no se como modificar o corregir el código para que exista o no exista la hoja buscada el código haga lo que debe.

3 Respuestas

Respuesta
1

Si no existe te marcara un error, yo tengo un código similar a lo que quieres hacer, si la hoja no existe el mismo error mandara llamar a un programa de creación de hojas.

On Error Resume Next
Ext = (Worksheets("Datos_Resumen").Name <> "")
If Err.Number > 0 Then GoTo Crear
On Error GoTo 0

Gracias por la respuesta, he integrado tu código con el mio, pero igualmente cuando la hoja no existe me sale este error

Y cuando existe la hoja me sale otro error en otra línea (Adjunto el código completo integrado con el tuyo para señalarte donde sale el error)

'Crear hoja Datos_Resumen
ref = ActiveSheet.Range("B8896").Value
tope = ref + 1
cont = 1
'
    Ext = (Worksheets("Datos_Resumen").Name <> "")
    If Err.Number > 0 Then GoTo Crear
    On Error GoTo 0
''Ext = (Worksheets("Datos_Resumen").Name <> "")
'
If Ext = True Then
    Sheets("Datos_Resumen").Delete
    GoTo Crear
'
Else
'
    GoTo Crear
'
End If
'
'
Crear:
Worksheets.Add(After:=ActiveSheet).Name = "Datos_Resumen"
Sheets("Datos_Resumen").Select
ActiveSheet.Range("A2").Select
For i = 2 To tope
    If ActiveCell = tope Then
        Range("A2").Select
        rng = WorksheetFunction.CountA(Range("A:A"))
    Else
        ActiveCell.Value = cont
        cont = ActiveCell.Value + 1
        ActiveCell.Offset(1, 0).Select
    End If
Next i
Set datos = Sheets("Datos_Resumen").Range("A2").Resize(tope, 2)
With datos
    On Error Resume Next
        .Columns(2).Formula = "=iferror(vlookup(A2;ITEMS!$B$6:$C$8885;2;0);"""")" ''****ACÁ SALE EL ERROR CUANDO LA HOJA EXISTE****
    If Err.Number > 0 Then
        .Columns(2).Formula = "=iferror(vlookup(A2,ITEMS!$B$6:$C$8885,2,0),"""")"
    End If
    On Error GoTo 0
End With
Set datos = Nothing
Sheets("Datos_Resumen").Range("A1") = "ID"
Sheets("Datos_Resumen").Range("B1") = "Codigo"
Sheets("Datos_Resumen").Visible = False
Sheets("ITEMS").Select
Application.DisplayAlerts = True
Application.ScreenUpdating = True

El error 9 en tiempo de ejecución te sale porque omitiste la línea on error resume next, el segundo error que pones a mi no me sale supongo que es por lo mismo que faltaba de poner la instrucción que señale antes, esta es la parte de tu código ya con el con error resume next, la línea on error goto 0 es para cancelar on error goto next.

ref = ActiveSheet.Range("B8896").Value
tope = ref + 1
cont = 1
On Error Resume Next
    Ext = (Worksheets("Datos_Resumen").Name <> "")
    If Err.Number > 0 Then GoTo Crear
    On Error GoTo 0
''Ext = (Worksheets("Datos_Resumen").Name <> "")
'
If Ext = True Then
    Sheets("Datos_Resumen").Delete
    GoTo Crear
'
Else
'
    GoTo Crear
'
End If

Te agradezco mucho la respuesta y la aclaración acerca de como integrarlo al mio, ahora si funciona correctamente tanto cuando la hoja existe como cuando no existe. Nuevamente muchas gracias.

Respuesta
1

Gracias de hecho cuando arme mi código vi esta página y use algunas cosas como guía, pero por diferentes razones no quisiera usar el código acá planteado

Entiendo, por lo regular yo programo con funciones (Modulos), ejemplo:

La funcion TestBuscarHoja, llama a la Funcion FnBuscarHoja (como argumento mando el nombre de la hoja "Resultados"), al regresar el valor True o False pregunto que si la hoja existe llama a la Funcion FnEliminarHoja (como argumento mando el nombre de la hoja "Resultados"), esta funcion elimina la hoja y queda el camino libre para poner llamar a otra Funcion FnCrea() o poner codigo.

Saludos!

Function TestBuscarHoja()
     'Variables
          Dim boL_Resp As Boolean
     'Valida si la Hoja Existe
          boL_Resp = FnBuscarHoja("Resultados") 
     'Elimina Hoja si Exsite
          If boL_Resp = True Then
               FnEliminarHoja ("Resultados")
          End If
     'Crear
          'Codigo o Funcion de Crear
End Function

Function FnBuscarHoja(srA_NombreHoja As String) As Boolean

     With ActiveWorkbook
          For h = 1 To .Sheets.Count
               If .Sheets(h).Name = srA_NombreHoja Then
                    FnBuscarHoja = True
                    Exit For
               Else
                    FnBuscarHoja = False
               End If
          Next
     End With

End Function

Function FnEliminarHoja(srA_NombreHoja As String)
          With ActiveWorkbook
          For h = 1 To .Sheets.Count
               If .Sheets(h).Name = srA_NombreHoja Then
                    Application.DisplayAlerts = False
                    .Sheets(h).Delete
                    Application.DisplayAlerts = True
                    Exit For

               End If
          Next
     End With

End Function

Puedes llamar la funcion TestBuscarHoja desde un boton (para hacer pruebas):

Sub Button1_Click()
     TestBuscarHoja
End Sub

¡Gracias! Estudiare el código que me das y contemplare la idea de hacer un próximo proyecto con módulos

A tus ordenes.

Respuesta
1

Esto te puede servir

Hola mira este ejemplo

https://www.programarexcel.com/2015/11/como-insertar-y-borrar-hojas-en-excel.html

Visita https://programarexcel.com  

https://www.youtube.com/c/programarexcel?sub_confirmation=1  

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas