Searching...
jueves, 11 de julio de 2013

ELIMINAR HOJAS CON VBA

En ocasión puede surgir el caso de que creemos un programa que gestione un gran número de pestañas u hojas de Excel y necesitemos borrar alguna de forma rápida sin necesidad de tener que estar buscándola. El otro artículo vimos como crear o añadir nuevas pestañas de Excel, a continuación veremos cómo poder borrarlas.



Si por ejemplo quisiéramos eliminar las 3 hojas que, de forma predefinida, nos ofrece Excel bastará con una simple macro como la siguiente:

Nota: Podemos sustituirlas por cualquiera: CLIENTE1, CLIENTE2, CLIENTE3  sin embargo si alguna de las 3 hojas no existe, VBA se volverá ¡¡loco!!. Hay que añadir que en el ejemplo se han escrito 3, pero se pueden poner muchas más.

Sub ELIMINAR_HOJA123
Sheets(Array("Hoja1", "Hoja2", "Hoja3")).Delete
End Sub


Ahora vamos a imaginar que hemos creado pestañas cuyos nombres van desde hoja1 hasta hoja35. Con la siguiente macro vamos a desarrollar un FOR que nos elimine todas las hojas desde la 2 hasta la 25.

Sub ELIMINAR_HOJAS_DESDE_X_HASTA_Y()
Dim i as long
For i = 2 To 25
    Sheets("Hoja" & i).Delete
Next
End Sub

Nota: Seguimos con el problema de que si no existe una de las hojas nuestro programa va tener problemas. Vamos a añadir dos elementos nuevos:

·        Podemos darle una solución/parche  con On Error Resume Next”. Esto va hacer que en caso de que una de las hojas no exista la macro se reinicie comenzando en la siguiente comprobación, algo así como saltarse el error.

·        Añadimos al principio y al final unas líneas, “Application.DisplayAlerts = False/true”, que hagan que Excel no nos realice pregunta de comprobación, que vemos en la imagen.

Sub ELIMINAR_HOJAS_DESDE_X_HASTA_Y()
Dim I As Long
Application.DisplayAlerts = False
For I = 2 To 25
    On Error Resume Next
    Sheets("Hoja" & I).Delete
Next
Application.DisplayAlerts = True
End Sub




Algunos de los siguientes ejemplos han sido tomados de la red, optimizándolos cuando era necesario y otros son nuevos.

Sub ELIMINARHOJA()

Dim Hoja As Worksheet
‘ debemos definir (hoja) como una variable del mismo tipo por eso ponemos Worksheet
Application.DisplayAlerts = False
  ‘A través de esta línea y junto con la ultima, evitamos que la macro nos haga preguntas: como,¿ está seguro que desea bórrala?
For Each Hoja In Worksheets
‘la siguiente estructura va leer todas las hojas: la traducción sería algo así como: para cada hoja del conjunto de ellas:
    If Hoja.Name = "CLIENTE1" Then
‘.Name es la coletilla que va hacer que el programa lea el nombre de la variable, en este caso de cada hoja.
    Hoja.Delete
‘si existe una hoja que se llame CLIENTE1 será borrada.
    MsgBox "Hoja borrada"

Application.DisplayAlerts = True

    Exit Sub
‘si encuentra y borra la hoja, la macro termina.
End If

Next Hoja
‘cierre de estructura que hace que vuelva a comenzar en el for Each hasta que encuentre la solución
MsgBox "La hoja no existe"

Application.DisplayAlerts = True

End Sub



En este otro ejemplo vamos  a ver cómo eliminar todas las hojas menos una. En este caso eliminar todas menos la Hoja1a través de una estructura de For Each- Next muy parecida a la anterior. Existe una diferencia principal y es que en este caso hemos sustituido el conjunto de hojas que en el primero llamábamos “Worksheets” por “ActiveWorkbook.Sheets” con igual resultado.

Sub ELIMINA_TODAS_MENOS_UNA()
    Application.DisplayAlerts = False
Dim hoja As Worksheet
For Each hoja In ActiveWorkbook.Sheets
If hoja.Name <> "Hoja1" Then
hoja.Delete
End If
Next hoja
    Application.DisplayAlerts = True
End Sub

Si quisiéramos que en vez de una se “salvasen” dos hojas sustituimos la siguiente línea. En este caso se borrarían todas menos la hoja “HOJA_DE_CLIENTES” y “PEDIDOS”.

hoja.Name <> "Hoja1" por hoja.Name <> "HOJA_DE_CLIENTES" And hoja.Name <> "PEDIDOS"


El siguiente ejemplo es muy similar al anterior, solo que en este se eliminaran todas las hojas salvo la activa.

Sub BORRAR_TODAS_MENOS_LA_ACTIVA()
Dim i As Long
    Application.DisplayAlerts = False
    For i = Worksheets.Count To 1 Step -1
        If i <> ActiveSheet.Index Then Sheets(i).Delete
    Next i
    Application.DisplayAlerts = True
End Sub

Este otro tiene un gran parecido al titulado: “ELIMINA_TODAS_MENOS_UNA”, la única diferencia es que se sustituye Hoja1 por ActiveSheet.Name.

Sub BORRAR_TODAS_MENOS_LA_ACTIVA 2()
    Dim hoja As Worksheet
    Application.DisplayAlerts = False
    For Each hoja In Worksheets
        If hoja.Name <> ActiveSheet.Name Then
            hoja.Delete
        End If
    Next
    Application.DisplayAlerts = True
End Sub


3 comentarios:

  1. Una consulta, tengo un archivo de excel de 2000 pestañas hasta un poco mas y lo q quiero hacer es q muestre 500 hojas y aparezca las pestañas q yo quiero q esten y las otras las elimine

    Ayudame por favor

    ResponderEliminar
  2. Una consulta, tengo un archivo de excel de 2000 pestañas hasta un poco mas y lo q quiero hacer es q muestre 500 hojas y aparezca las pestañas q yo quiero q esten y las otras las elimine

    Ayudame por favor

    ResponderEliminar

 
Back to top!