Hojas de cálculo en Excel - página principal

Desplazarse por hojas, con macros

Como son muchos los internautas que llegan hasta este blog buscando como desplazarse por las hojas, utilizando macros, vamos a aprovechar para darle un repasito al tema.

Si lo que queremos es pasar a la hoja siguiente, entonces deberemos copiar este código en un módulo:


Sub hoja_siguiente()
'Pasamos a la hoja siguiente
'pero controlamos previamente
'que haya una hoja detrás de la
'hoja en la que nos encontramos
'es decir, detrás de la hoja activa.
'Si no estamos en la última hoja...

If ActiveSheet.Name <> Sheets(Sheets.Count).Name Then
'entonces pasamos a la siguiente hoja
ActiveSheet.Next.Select
End If
End Sub

Si lo que deseamos es ir a la hoja inmediatamente anterior a la que estamos:

Sub hoja_anterior()
'Si no estamos en la primera hoja...
If Not Sheets(1).Select Then
'entonces pasamos a la anterior hoja
ActiveSheet.Previous.Select
End If
End Sub

Si queremos desplazarnos a una hoja determinada, accederemos a ella por su nombre:

Sub hoja_de_inversiones_2008()
'Pasamos a una hoja determinada,
'en este caso, a una llamada INVERSIONES 2008
'(no perderemos tiempo, controlando si ya
'estamos o no en esa hoja donde queremos ir)

Sheets("INVERSIONES 2008").Select
End Sub

Pero... ¿qué pasaría en el caso de que alguien le cambiara el nombre a una hoja?. Si estamos utilizando el código anterior en un libro de excel, y alguien le cambia el nombre a la hoja llamada INVERSIONES 2008, y le pone por ejemplo INVER.08, nuestro macro nos marcará un error en la línea donde aparece el nombre de la hoja, puesto que no puede acceder a una hoja inexistente (INVERSIONES 2008). Para solucionar este contratiempo, podemos trabajar con los nombres internos de las hojas, es decir, los nombres de las hojas, tal y como nos aparecen en el módulo VBA. Si os fijáis en la siguiente imagen, veréis que he remarcado el nombre interno de la hoja para trabajar con él, y aunque alguien le cambie el nombre a la hoja INVERSIONES 2008, no pasará nada (a no ser que le cambien en nombre interno desde VBA, pero esto se soluciona protegiendo nuestro código):



Sub ir_a_la_hoja_de_inversiones_2008()
'Si le cambian el nombre a la hoja, no podremos
'acceder a ella, por eso es mejor acceder
'por el nombre interno que es el que aparece
'arriba a la izquierda en esta pantalla VBA
'justo delante del nombre (INVERSIONES 2008)

Hoja2.Select
End Sub

Si lo que deseamos es desplazarnos a la última hoja del libro, entonces nos bastará con utilizar esto:

Sub ultima_hoja()
'Ahora nos desplazamos a la última hoja
Sheets(Sheets.Count).Select
End Sub

Y si por el contrario, lo que deseamos es desplazarnos a la primera hoja del libro, entonces tendremos que utilizar este otro código:

Sub primera_hoja()
'Ahora nos desplazamos a la primera hoja
Sheets(1).Select
End Sub

Creo que con esto, ya no nos quedará ninguna duda de como podemos desplazarnos por las hojas de un libro.



12 comentarios:

Anónimo dijo...

Mil Gracias:

Son Fantásticos y super generosos con su ayuda.

Funcionaron de película.

Gracias

El pilt®afilla - www.3piesalgato.com dijo...

Tampoco te pases... Los fantásticos y generosos son los Reyes Magos y Papa Noel :-)

Victor dijo...

Muchas gracias por tu ayuda.
La primera macro de pasar a la siguiente hoja, lo que me hace es llevarme directamente a la última hoja. Sabes por qué pude ser?

El pilt®afilla - www.3piesalgato.com dijo...

Probablemente te ocurre eso, porque la hoja2 (suponiendo que sea esa la segunda hoja), la has desplazado y la has movido hasta el final. Me refiero a que has arrastrado esa pestaña al final de todo.

Fíjate en el nombre interno de la hoja (ese que en una de las imágenes sale coloreado de azul), y verás como es probable que aunque te aparezca al final de todo (por eso se desplaza hasta el final), su nombre sea Hoja2.

Saludos.

Victor dijo...

Gracias Javier Marco, por tú respuesta no me la esperaba el mismo día que hice la pregunta.

Cerré el excel, abrí uno nuevo, puse el código en un módulo exactamente igual que el que aparece el ejemplo 1º pero añadiendole "End Sub" al final y volvió a generar el mismo problema, se me marchaba a la hoja 3 directamente desde la hoja 1. Ejecuté el programa paso a paso y la condición if la considera siempre falsa, y encima es en esa misma sentencia es cuando me lleva a la hoja3. Gracias

Código:

Sub hoja_siguiente()
If Not Sheets(Sheets.Count).Select Then
ActiveSheet.Next.Select
End If
End Sub

El pilt®afilla - www.3piesalgato.com dijo...

Hola Victor.

Por una parte, agradecerte que te hayas dado cuenta que no había cerrado los procedimientos, con el End Sub, como es preceptivo (ya está corregido), y por otra, decirte que efectivamente tenías toda la razón del mundo en tu exposición/queja/duda/problema :-) pues el código que puse no era el correcto (daba por hecho que al ser tan sencillo tenía que ser así, que ni lo había probado). Lo acabo de corregir, y ahora sí que funciona correctamente.

Muchas gracias por tus observaciones.

Un saludo.

Anónimo dijo...

Hola Javier.
Encontre tu pagina y la verdad que tus ejemplos son muy claros y mas de uno me sirvio.
Ahora te consulto algo.... como puedo ir usando "Desplazarse por hojas con macros" a una determinada hoja si esta oculta, y al irme de esa hoja que la vuelva a ocultar
Muchas gracias, Sebastian

El pilt®afilla - www.3piesalgato.com dijo...

Te recomiendo que te pases por este artículo: Mostrar y ocultar hojas, utilizando macros, para saber como ocultar y mostrar hojas. En lugar de pasar el password para mostrar/ocultar la hoja a través de un inputbox, puedes introducirlo directamente en del código fuente.

Saludos.

Anónimo dijo...

Hola javier

Una consulta por ejemplo tengo este codigo:

Private Sub CommandButton1_Click()
Dim var1 As String, var2 As String, var3 As String
Dim cont As Integer

Range("a2").Select
var1 = ActiveCell.Text

Range("b2").Select
var2 = ActiveCell.Text

Range("c2").Select
var3 = ActiveCell.Text

ActiveSheet.Next.Select

Range("a2").Select

If IsEmpty(ActiveCell) Then
ActiveCell.FormulaR1C1 = var1
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = var2
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = var3

Else:
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Select
Loop
ActiveCell.FormulaR1C1 = var1
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = var2
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = var3

End If


End Sub

Mi problema es cuando selecciono la celda a2 en la siguiente hoja.

Hay alguna manera de seleccionar una celda cuando pasas a otra hoja?

Muchas gracias,

Anónimo dijo...

HOLA A TODOS, SOY MUY NUEVO EN ESTO DE MACROS PARA EXCEL POR LO TANTO ESTOS CODIGOS ME FUERON DE MUCHA UTILIDAD PARA REALIZAR CON EXITO UN PROYECTO EN EXCEL. SOLO HAGO LA OBSERVACION QUE EL CODIGO PARA "ir a la hoja inmediatamente anterior a la que estamos" NO ME FUNCIONO CORRECTAMENTE, PERO LO CORREGI DE LA FORMA SIGUIENTE :

Sub Hoja_Anterior()
If ActiveSheet.Name > Sheets(1).Name Then
ActiveSheet.Previous.Select
End If
End Sub

Y ENTONCES ME FUNCIONO A LA PERFECCION.

LO COMPARTO CON USTEDES POR SI LES SUCEDIO LO MISMO QUE A MI, ESPERO QUE LES SIRVA YA QUE ES LA PRIMERA VEZ QUE EDITO UN CODIGO PARA EXCEL Y ME FUNCIONA. SALUDOS ! ! !

JoaoM dijo...

tengo este codigo que casi todo es de acá pero resulta que de la hoja 3 regresa a la 2 de la 2 a la 1 perfecto pero de la hoja 4 no sale, no regresa a la 3, no se mueve si estoy ubicado en alguna, 4, 5, 6, ect no se mueve de ahí, ¿donde está el error?
Private Sub cmdPrevHoja_Click()
Application.ScreenUpdating = False
ComboDoble.clear
cmdLimpiarTodo_Click
If ActiveSheet.Name > Sheets(1).Name Then
ActiveSheet.Previous.Select
End If
UserForm_Initialize
Application.ScreenUpdating = True
End Sub

JoaoM dijo...

REFERENTE A mi ultimo mensage Tampoco quiero que si por acidente presiono el boton estando en la hoja 1, me acuse error