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.

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      188
    • Comentarios
      98
    • Revisiones
      29

    Más información sobre "Cambios en el Control Horario"
    Última descarga
    Por pegones1

    4    1

  • Crear macros Excel

  • Mensajes

    • Buenos días  @LeandroA espero estes bien Tengo un caso idéntico al planteado en la siguiente pregunta: Sin embargo, a diferencia de quien planteo originalmente la pregunta al correr el código no obtengo ningún resultado podrían ayudarme a resolver este inconveniente y que al hacer click en el Botón Guardar (CommandButton3) del Formulario RCS (frmrcs) el archivo pdf quede configurado con orientación vertical, márgenes superior, inferior, derecho e izquierdo = 1 y en página tamaño carta. Si acaso influye uso Microsoft Excel LTSC MSO (versión 2209 Compilación16.0.1.15629.20200) de 64 bits Mucho le sabre agradecer la ayuda que me pueda dar  RCS PRUEBA - copia.xlsm
    • @JSDJSDCon gusto mi estimado Para la opción 1: Sub Surtirhastadondealcanse() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 4 Dim filaFin As Integer: filaFin = 7 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Else solicitudes(i) = 0 End If surtido(i) = "POR FALTA STOCK" Next i ' Surtir de acuerdo al inventario disponible For i = 1 To numClientes If solicitudes(i) > 0 Then If inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) ElseIf inventario > 0 Then surtido(i) = inventario totalSurtido = totalSurtido + inventario inventario = 0 Else surtido(i) = "POR FALTA STOCK" End If End If Next i ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = "POR FALTA STOCK" Then .Value = surtido(i) .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Para la opción 2:   Sub surtirenpartesiguales() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 13 Dim filaFin As Integer: filaFin = 16 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 Dim totalPedido As Double: totalPedido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) totalPedido = totalPedido + solicitudes(i) Else solicitudes(i) = 0 End If surtido(i) = 0 Next i ' Si hay suficiente inventario, surtir lo que el cliente pide If inventario >= totalPedido Then For i = 1 To numClientes If solicitudes(i) > 0 And inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) End If Next i Else ' Reparto base igualitario Dim baseSurtido As Long baseSurtido = Int(inventario / numClientes) For i = 1 To numClientes If solicitudes(i) > 0 Then If solicitudes(i) <= baseSurtido Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) Else surtido(i) = baseSurtido inventario = inventario - baseSurtido totalSurtido = totalSurtido + baseSurtido End If End If Next i ' Repartir sobrante restante uno por uno, respetando lo pedido Do While inventario > 0 For i = 1 To numClientes If surtido(i) < solicitudes(i) Then surtido(i) = surtido(i) + 1 totalSurtido = totalSurtido + 1 inventario = inventario - 1 If inventario = 0 Then Exit For End If Next i Loop End If ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = 0 Then .Value = "POR FALTA STOCK" .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Saludos, Diego
    • Buenos dias.  Estoy trabajando en una hoja para poder llevar un control de un pequeño almacén.  Tengo un pedido con varias líneas y "lotes" y necesito sacar las ubicaciones que coincidan con la referencia y lote que pone en el pedido. El problema viene cuando tengo la misma referencia y mismo lote en ubicaciones diferentes y necesito sacar la información en columnas diferentes. No se si  me he explicado bien, pero creo que con el ejemplo adjunto se entiende mejor. Agradecería mucho si me pudieran ayudar  Libro1.xlsx
    • Exelente solución mil gracias 
    • Podrías compartir tu solucion
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • 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.