martes, 15 de abril de 2008

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:

  1. Mil Gracias:

    Son Fantásticos y super generosos con su ayuda.

    Funcionaron de película.

    Gracias

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

    ResponderEliminar
  3. 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?

    ResponderEliminar
  4. 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.

    ResponderEliminar
  5. 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

    ResponderEliminar
  6. 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.

    ResponderEliminar
  7. 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

    ResponderEliminar
  8. 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.

    ResponderEliminar
  9. 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,

    ResponderEliminar
  10. 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 ! ! !

    ResponderEliminar
  11. 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

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

    ResponderEliminar