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
|
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
ResponderEliminarAyudame por favor
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
ResponderEliminarAyudame por favor
Muchas gracias por tu aporte
ResponderEliminar