martes, 11 de marzo de 2014

VBA: Método SendKeys

En una entrada anterior vimos qué formas teníamos a nuestro alcance para ver el resultado de la celda en lugar de la fórmula o incluso en algunos casos un error de #¿NOMBRE? por que la versión no detecte nuestra función correctamente (ver entrada).
Al hilo de esta entrada anterior, un lector planteaba la posibilidad de automatizar el proceso manual, celda por celda, de ir presionando la tecla de función F2 (edita celda) más ENTER a continuación:

...Tengo seleccionado un rango de celdas, y necesito una macro que para cada celda seleccionada me haga las funciones de "F2+ENTER"...


Para tal fin necesitaremos emplear en una macro que crearemos el método .SendKeys que envía pulsaciones de la tecla que indiquemos.
La sintaxis es
expresión.SendKeys(Keys, Wait)
y el argumento Keys, esto es, la tecla sobre la que podemos forzar pulsaciones puede ser entre otras:
Tecla y Código
BORRAR := {CLEAR}
SUPRIMIR o SUPR := {DELETE} o {DEL}
FLECHA ABAJO := {DOWN}
FLECHA ARRIBA := {UP}
FLECHA IZQUIERDA := {LEFT}
FLECHA DERECHA := {RIGHT}
FIN := {END}
INTRO (teclado numérico) := {ENTER}
ENTRAR := ~ (tilde)
AV PÁG {PGDN}
RE PÁG {PGUP}
F1 a F15 := {F1} a {F15}

Admitiendo además las combinaciones provistas por Excel con MAYÚS o CTRL o ALT.
Para especificar una tecla combinada con otra u otras teclas:
MAYÚSCULAS := + (signo más)
CONTROL := ^ (signo exponencial)
ALT := % (signo de porcentaje)


Una solución al problema, además de alguna alternativa más, era manualmente ir editando la celda y validándola, esto es, presionando celda a celda F2 + ENTER... lo que para cientos de datos podría ser un engorro.
La siguiente macro realiza la misma acción empleando .SendKeys.

Accederemos a la ventana de código del explorador del editor de VBA, donde insertaremos el siguiente código VBA:

Sub Macro2()
Dim celda As Range
For Each celda In Range("B2:B12")
    celda.Select
    SendKeys "{F2}+{ENTER}", True
Next celda
End Sub


Ojo por que la condición inicial de formato de celda a Número o General se mantiene.
Fijémonos en la combinación de teclas ordenada
{F2}+{ENTER}
tecla función F2 y Mayúscula y ENTER, lo que recorrerá en sentido inverso (mayúscula y Enter cambia celda hacía arriba, y no hacía abajo como es normal).

Podemos ver el efecto en el vídeo siguiente:

VBA: Método SendKeys

10 comentarios:

  1. Hola Ismael, excelente ayuda como siempre; pero, si el rango es variable tanto en posición así como en longitud, ¿cómo debo cambiarlo?

    Saludos y muchas gracias!

    ResponderEliminar
    Respuestas
    1. Hola Alberto, muchas gracias ;-)
      la forma de trabajar con un rango variable (en sentido de celdas y posición) no sería problema, se podría solucionar de muchas formas, pero parece que en este caso lo más sencillo sería sacar un inputbox par que el usuario defina el rango.
      Sería algo así:
      Sub Macro2()
      Dim celda As Range, rng As Range
      Set rng = Application.InputBox("indique rango", Type:=8)

      For Each celda In Range(rng.Address)
      celda.Seletc
      SendKeys "{F2}+{ENTER}", True
      Next celda
      End Sub

      Saludos

      Eliminar
  2. entonces como quedaria

    f2+control+shift+enter

    ya que es una matricial

    ResponderEliminar
    Respuestas
    1. Hola Eduardo,
      que tal estás?, un placer saludarte igualmente.

      Fíjate que la explicación se indican cuáles son las descripciones para cada tecla, por tanto la combinación para
      f2+control+shift+enter
      sería:

      SendKeys "{F2}^+{ENTER}", True

      Prueba y comentas.
      Un saludo

      Eliminar
  3. Que tal, como estas??
    En primer lugar les agradezco por el gran aporte, y me gustaría preguntar una cosa; ¿Como puedo programar la tecla inicio del teclado en un botón?, ya que he estado trabajando con un teclado virtual y la programación de esa tecla me ha dado varios problemas, le agradecería que me apoyaran.

    ResponderEliminar
    Respuestas
    1. Hola Emmanuel,
      la tecla de inicio, creo recordar que es {HOME},
      con las mismas condiciones que el resto de teclas para combinarlas con Ctrl, Mayusc o Alt.

      Saludos

      Eliminar
  4. como puedo programar la tecla de tabulador

    ResponderEliminar
    Respuestas
    1. Hola Ricardo,
      cómo estás?, un placer saludarte igualmente.

      tabulador sería {TAB}

      Un cordial saludo

      Eliminar
  5. Hola

    Yo tengo un rango
    Range("C7:L7").Select

    De este rango necesuto mover se puede decir el puntero de Excel o donde se escribe hacia la siguiente celda con el siguiente comando
    SendKeys "{TAB}", True

    Pero en excel no se mueve, se mueve mi proyecto de VB ja ja ja ¿que me falta para que se mueva el puntero? y despues seleccione hasta abajo con el siguiente comando
    Range(Selection, Selection.End(xlDown)).Select

    ResponderEliminar
    Respuestas
    1. Hola,
      para que te funcione 'normalmente', debes ejecutar tu macro desde la hoja de cálculo y no desde la ventana del Editor de VB.
      el método SendKeys actúa sobre el cursor allá donde esté activo

      Saludos

      Eliminar