Saltar al contenido

Código para teclas de flechas up/down/left/right


Recommended Posts

publicado

Hola.

¿Hay alguna línea de código para indicar el movimiento de las flechas up/down/left/right?

He intentado grabar una macro pero no parece recoger este movimiento.

Gracias.

publicado

Saludos cordiales a todos.

Puedes intentar hacer prácticas con este código pegándolas en un módulo y agregando a unos botones:

Sub MoverArriba()
    ActiveCell.Offset(-1, 0).Select
End Sub

Sub MoverAbajo()
    ActiveCell.Offset(1, 0).Select
End Sub
Sub MoverIzquierda()
    ActiveCell.Offset(0, -1).Select
End Sub
Sub MoverDerecha()
    ActiveCell.Offset(0, 1).Select
End Sub

Yo hice justo esto como una tarea hace algún tiempo ya, tendrías que personalizar para tus necesidades.

Resaltar: El comentario del Maestro Abraham es importante ya que su intención es motivar a intentarlo un poco más en cada una de las participaciones que he leído. Un paso más allá de códigos ó funciones listas para usarse.

home can, si te es posible comparte o detalla un poco más para que es la idea, si has resuelto o cómo lo has usado. Eso es de gran ayuda para todos, participantes y lectores.

Saludines.

publicado

Con el permiso de Israel, mejor así:

Sub MoverArriba()
    If ActiveCell.Row > 1 Then ActiveCell.Offset(-1, 0).Select
End Sub

Sub MoverAbajo()
    If ActiveCell.Row < Rows.Count Then ActiveCell.Offset(1, 0).Select
End Sub
Sub MoverIzquierda()
    If ActiveCell.Column > 1 Then ActiveCell.Offset(0, -1).Select
End Sub
Sub MoverDerecha()
    If ActiveCell.Column < Columns.Count Then ActiveCell.Offset(0, 1).Select
End Sub

 

publicado

¡Ah, Maestro! Qué elegancia la de Francia. ?

hace 17 minutos , Antoni dijo:

Con el permiso de Israel, mejor así:

Al contrario, queda mucho mejor. Me hiciste recordar lo que me dijo el Maestro cuando lo entregué en esa ocasión "minimizar errores, usa la ley de Murphy a tu favor" con el código de Antoni se evita el error que da mi sentencia cuando no hay hacia donde desplazarse, es decir que llega al borde de la hoja.

publicado

Hola amigos,

Abraham, perdón por mi respuesta. No estuve acertado.

Sé que pretendías motivarme a experimentar, pero soy lego en el idioma (no el inglés ?). Solo aprendo con ejemplos que pueda entender y manejar. Lo que intenté fue crear una línea  "SendKeys {DOWN}" (tal cual) pero obviamente no hizo nada.

Antoni, tu sentencia funciona. Pero debo añadir un pero... Si usas el filtrado automático, el cursor sigue su curso (...) por las filas, visibles o no. En cambio el teclado solo va a las filas visibles. 

Y una vez más, gracias Israel.

Adjunto hoja de ejemplo.

MOVER CELDAS.xlsm

publicado
hace 48 minutos , home can dijo:

En cambio el teclado solo va a las filas visibles. 

¡Vaya! ?

De momento no sé, deja lo intento y si puedo te comparto algo. Dame unos minutos y te aviso.

 

publicado

Hice una prueba en el libro con el ejemplo que mande anteriormente. Siento que cambia un poco el planteamiento original pero también es complicado ser preciso con cosas que van saliendo conforme se va avanzando.

¿Te refieres a algo como esto?

recording-2023-05-31-16-41-27.gif

 

 

publicado

Te dejo el código modificado:

Sub MoverArriba()
    On Error Resume Next
    Dim CeldaVisible As Range
    Set CeldaVisible = ActiveCell.Offset(-1, 0)
    
    ' Bucle para encontrar la siguiente celda visible hacia arriba
    While CeldaVisible.EntireRow.Hidden
        Set CeldaVisible = CeldaVisible.Offset(-1, 0)
        
        ' Verificar si se alcanzó el límite superior de la hoja
        If CeldaVisible.Row <= 1 Then
            Exit Sub ' Salir de la macro si se alcanzó el límite superior
        End If
    Wend
    
    ' Seleccionar la celda visible encontrada
    If Not CeldaVisible Is Nothing Then
        CeldaVisible.Select
    End If
End Sub

Sub MoverAbajo()
    On Error Resume Next
    Dim CeldaVisible As Range
    Set CeldaVisible = ActiveCell.Offset(1, 0)
    
    ' Bucle para encontrar la siguiente celda visible hacia abajo
    While CeldaVisible.EntireRow.Hidden
        Set CeldaVisible = CeldaVisible.Offset(1, 0)
        
        ' Verificar si se alcanzó el límite inferior de la hoja
        If CeldaVisible.Row >= ActiveSheet.Rows.Count Then
            Exit Sub ' Salir de la macro si se alcanzó el límite inferior
        End If
    Wend
    
    ' Seleccionar la celda visible encontrada
    If Not CeldaVisible Is Nothing Then
        CeldaVisible.Select
    End If
End Sub

Sub MoverIzquierda()
    On Error Resume Next
    Dim CeldaVisible As Range
    Set CeldaVisible = ActiveCell.Offset(0, -1)
    
    ' Bucle para encontrar la siguiente celda visible hacia la izquierda
    While CeldaVisible.EntireColumn.Hidden
        Set CeldaVisible = CeldaVisible.Offset(0, -1)
        
        ' Verificar si se alcanzó el límite izquierdo de la hoja
        If CeldaVisible.Column <= 1 Then
            Exit Sub ' Salir de la macro si se alcanzó el límite izquierdo
        End If
    Wend
    
    ' Seleccionar la celda visible encontrada
    If Not CeldaVisible Is Nothing Then
        CeldaVisible.Select
    End If
End Sub

Sub MoverDerecha()
    On Error Resume Next
    Dim CeldaVisible As Range
    Set CeldaVisible = ActiveCell.Offset(0, 1)
    
    ' Bucle para encontrar la siguiente celda visible hacia la derecha
    While CeldaVisible.EntireColumn.Hidden
        Set CeldaVisible = CeldaVisible.Offset(0, 1)
        
        ' Verificar si se alcanzó el límite derecho de la hoja
        If CeldaVisible.Column >= ActiveSheet.Columns.Count Then
            Exit Sub ' Salir de la macro si se alcanzó el límite derecho
        End If
    Wend
    
    ' Seleccionar la celda visible encontrada
    If Not CeldaVisible Is Nothing Then
        CeldaVisible.Select
    End If
End Sub

Fue un poco más laborioso de lo que pensaba, así que te anote comentarios para que puedas editar y usar en tu libro personalizando. Deberías poder desplazarte solo sobre celdas visibles igual que con el teclado.

Saludines.

publicado

Uf! Supongo que has visto el libro que adjunté, pero por tu respuesta parece que no me he explicado bien.

Lo que propones obviamente funciona tal como lo planteas. Si. Así se comporta el teclado.

Pero si lo que sugieres (a lo mejor me equivoco) es insertar unos botones que hagan la función del teclado, poco tiene que ver con lo que quiero. 

Gracias de todos modos.

publicado
hace 6 minutos , home can dijo:

Pero si lo que sugieres (a lo mejor me equivoco) es insertar unos botones que hagan la función del teclado

En realidad no.

Cita

¿Como sería la sentencia para que se comporte como el teclado?

Esa parte que mencionas entendí que es solo para ejemplificar el movimiento que buscas que haga el cursor después de insertar y editar los registros, pero como el filtro te oculta unas filas, la primer recomendación quedó incompleta.

De hecho, viendo tu libro se percibe que es el resultado que vas obteniendo al irte complementando de otras consultas que has venido realizando aquí en el foro. Eso me parece ¡Excelente!

Por esa causa no quise editar tu trabajo y lo hice sobre el primer libro (el que trae los botones), la idea es que tomes, edites o complementes de esta consulta la parte de código que mejor resuelva o se amolde a lo que ya tienes realizado. Digamos que el ejemplo hace lo que se pide, el siguiente paso es que intentes adaptarlo.

Como nota adicional: Rara es la ocasión que edito el trabajo de alguien, prefiero recomendar, sugerir u opinar.

Saludines.

publicado
hace 3 horas, home can dijo:

Si usas el filtrado automático, el cursor sigue su curso (...) por las filas, visibles o no. En cambio el teclado solo va a las filas visibles

y si aplicas un "bucle en banda" (tampoco descargue tu muestra, pero...) prueba algo +/- asi:

  Do: ActiveCell.Offset(1).Select: Loop While ActiveCell.RowHeight = 0

 

publicado
hace 9 horas, home can dijo:

Hola amigos,

Abraham, perdón por mi respuesta. No estuve acertado.

Sé que pretendías motivarme a experimentar, pero soy lego en el idioma (no el inglés ?). Solo aprendo con ejemplos que pueda entender y manejar. Lo que intenté fue crear una línea  "SendKeys {DOWN}" (tal cual) pero obviamente no hizo nada.

Antoni, tu sentencia funciona. Pero debo añadir un pero... Si usas el filtrado automático, el cursor sigue su curso (...) por las filas, visibles o no. En cambio el teclado solo va a las filas visibles. 

Y una vez más, gracias Israel.

Adjunto hoja de ejemplo.

MOVER CELDAS.xlsm 27.48 kB · 3 descargas

Mover derecha-izquierda y derecha-izquierda, valen como están, para arriba/abajo y abajo/arriba:

Sub MoverArriba()
Do: If ActiveCell.Row > 1 Then ActiveCell.Offset(-1, 0).Select
Loop Until Rows(ActiveCell.Row).Hidden = False
End Sub

Sub MoverAbajo()
Do: If ActiveCell.Row < Rows.Count Then ActiveCell.Offset(1, 0).Select
Loop Until Rows(ActiveCell.Row).Hidden = False
End Sub

 

publicado

Israel: Tu propuesta funciona, aunque hace la instrucción muy extensa.

Héctor Miguel: Solo puedo decir ¡Fascinante! RowHeight = 0 ?

Antoni: Tu sentencia también es óptima y simple. Para mi nivel excel, muy manejable. 

Gracias a todos por vuestra ayuda y maestría.

Adjunto el resultado final por si interesa a alguien.

Y doy el tema por cerrado.

MOVER CELDAS.xlsm

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.