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

55 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
  6. Hola Ismael

    Como le puedo quitar ese parpadeo, use el Application.ScreenUpdating= false pero no lo quita
    Sub Actualizar()
    Application.ScreenUpdating = False
    Dim celda As Range
    For Each celda In Range("AD2:AD200")
    celda.Select
    SendKeys "{F2}+{ENTER}", True
    Next celda
    End Sub

    ResponderEliminar
    Respuestas
    1. Hola José,
      por desgracias no hay otra manera...
      A veces hay acciones que se ven reflejadas en pantalla, a pesar del uso de .ScreenUpdating

      Saludos

      Eliminar
  7. Hola buenas Noches,

    Cada vez que ejecuton SendKeys "{F}" se apaga luces de teclado Bloq Lock y Block Mayus.

    He buscado mucho y no encuento una solucion.

    Sub prueba()
    SendKeys "{F}"
    End Sub

    ResponderEliminar
    Respuestas
    1. Hola Rene,
      ¿y que´quieres conseguir presionando:
      SendKeys "{F}"
      ??
      Normalmente se presiona una techa de función, por ejemplo:
      SendKeys "{F2}"

      Quedo atento

      Eliminar
    2. Hola
      Ismael
      Necesito detener todas las macros por lo que he generado un error y al presionar la tecla F esta cierra el cuadro de error.

      Igual lo he probado con otra macro escribiendo en una celda y es el mismo resultado.

      Eliminar
    3. Ismael,
      he realizado un prueba con F1 y F2, me pasa lo mismo
      tengo Office 2007, instale Office 2016 y me pasa lo mismo

      Eliminar
    4. ??
      lo siento, pero no sé darte una respuesta...

      Eliminar
  8. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  9. NECESITO EJECUTARLA DESDE EXCEL SOBRE UNA WEB, Y ME OBLIGA A USAR SIEMPRE EL METODO DOUBLE CLICK, PERO QUIERO QUE APENAS ABRA LA WEB SENCILLAMENTE EJECUTE UNA LISTA DE PASOS QUE YA ESTA CONTABILIZADA PARA PODER ENTRAR A ESA PAGINA, Y NO VEO UN MODELO QUE ME AYUDEN PODRIAS HECHARME UNA MANO

    ResponderEliminar
  10. Cómo podría, después de activar la celda con F2, pegar un texto que tengo en el portapapeles?

    Básicamente que con la macro se ejecuta lo que yo haría manualmente F2 y Ctrl V

    ResponderEliminar
    Respuestas
    1. Hola David,
      un placer saludarte igualmente.

      Quizá lo más simple, si quieres anexar al contenido de una celda otro texto adicional, sería:
      range(celda).value=range(celda).value & "texto copiado(quizá otra celda range(celda).value"
      Espero te sirva la idea
      Saludos cordiales

      Eliminar
  11. Presionando las teclas Window + d minimiza todas las aplicaciones abiertas. ¿cómo lo haría con vba?

    ResponderEliminar
    Respuestas
    1. Hola Willian
      qué tal estás?, un placer saludarte y poder colaborar con tu duda.

      hace tiempo usando una API de windows funcionaba (no sé si aú siga funcionando para Windows 10):
      Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

      Sub Minimizar()
      Call keybd_event(&H5B, 0, 0, 0)
      Call keybd_event(&H4D, 0, 0, 0)
      Call keybd_event(&H5B, 0, &H2, 0)
      End Sub

      Saludos

      Eliminar
  12. Hola, estoy usando SendKeys "text" para rellenar con texto donde este posicionado el cursor. Hay manera de darle formato a ese texto? es decir si quiero que hay en el texto salto de linea, por ejemplo y no que salga todo seguido, todo junto. Gracias

    ResponderEliminar
    Respuestas
    1. Hola Gabriel,
      podrías hacer algo así

      Application.SendKeys "texto 1" & vbCrLf & "texto 2"

      Saludos

      Eliminar
  13. Muy bueno, gracias. Pero como podría agregarle 1 Tabulador a un texto que genero para colocarlo en un correo electrónico?

    ResponderEliminar
    Respuestas
    1. Hola,
      la tabulación podría ser con la contante: vbTab
      "texto 1" & vbTab & "texto 2"

      Saludos

      Eliminar
    2. Este comentario ha sido eliminado por el autor.

      Eliminar
  14. Hola Ismael, cómo podría utilizar esta función para meter una contraseña y usuario a una página web? muchas gracias por la atención.

    ResponderEliminar
    Respuestas
    1. Muchas gracias Ismael, si había encontrado ese método, el problema es que tenía que abrir Google Chrome, pero ya encontré la manera.

      Eliminar
    2. ;-)

      quizá puedas compartir tu solución con el resto de lectores

      Saludos...

      Eliminar
  15. Hola, feliz noche!!
    Por favor colabóreme con lo siguiente: necesito copiar seleccionar una tabla de un sitio web y cuando pase al formulario darle clik a un botón y que me pase esta tabla a una hoja de excel...¿quizás con onkey ó sendkey?...de antemano muchas gracias.

    ResponderEliminar
  16. Una pregunta amigo Como podria ejecutar ejemplo Ctrl+V en un caso que desee realizar funcion tipo paste en una hoja externa al excel

    ResponderEliminar
    Respuestas
    1. Hola
      como se indica en el post la tecla control se replica con ^, así pues ctrl + v sería:= ^v

      Saludos

      Eliminar
    2. Hola Ismael tengo el mismo problema con el Sendkey control v y necesito ingresar los datos en Oracle, pero no pega la información de la hoja de excel y sabía que sendkey no se permite en algunos programas es cierto esto??

      Eliminar
    3. Hola Jonathan
      es posible, ya que no todos los sistema trabajan bajo el mismo entorno....
      En este caso desconozco si Oracle es uno de ellos... pero si has probado y no lo hace, ahí tienes tu respuesta
      :'(

      Saludos cordiales

      Eliminar
  17. Hola
    Soy nuevo en el mundo de excel
    Ando buscando un teclado virtual numérico para una pantalla táctil y que me introduca los datos en la celda que en ese momento este activa
    De antemano les agradezco su ayuda

    ResponderEliminar
  18. Buen día a todos.

    En mi oficina de contabilidad realizo una tarea bastante repetitiva: Tengo libros de excel con muchísimas hojas (aprox. 450)

    Existen hojas en las cuales tengo informaciones (numéricas) que copio y pego en un programa de contabilidad, guardo el asiento, luego paso a la siguiente hoja y repito el proceso miles de veces.

    ¿Existe alguna forma de programar en VBA que excel haga eso por mi?

    He intentado utilizar Sendkeys pero tengo dudas si realmente es el método correcto o se puede hacer de otra manera.

    El comando que utilizo tan repetitivamente (como un robot) es más o menos el siguiente:

    1º Ubico la celda que quiero copiar: luego Ctrl+c, Atl+Tab (para ir al software contable), Ctr+v, Enter, Alt+Tab, flecha abajo, ctrl+c, Alt+Tab, Ctrl+V, Enter, Alt+Tab, flecha abajo, Ctrl+C, Alt+Tab, Ctrl+V, Enter.... etc -------> F4 (guardar asiento)

    2º Paso a la siguiente hoja y repito el proceso. Sería estupendo automatizar esta tarea, ya que mi sistema no me permite importar los datos de excel y como se imaginarán, me duele toda la mano de tanto CTRL+C, ALT+TAB, CTRL+V.

    Muchísimas gracias de antemano.

    ResponderEliminar
    Respuestas
    1. Hola Francisco,
      creo que algún tipo de conexión OLE (o similar), para llevar los datos del Excel a tu Sw, te facilitaría el trabajo mejor que replicar esos movimientos...
      Ya que además en tu caso hay que interactuar no solo en Excel, si no fuera del entorno de nuestro libro de trabajo.

      Saludos

      Eliminar
    2. Hola Ismael,
      gracias por responder...

      Me parece que no tendré forma de hacer esa conexión, imagino que necesitaré algún tipo de permiso del software (cosa que no tengo), por otro lado, no tengo idea cómo se hace esa conexión.

      En verdad soy un neófito en VBA y aún así he logrado automatizar muchísimas tareas, lograr automatizar esta parte sería el punto culminante para mi labor.
      ¿Entonces crees que es inviable lo que quiero hacer?

      Saludos

      Eliminar
    3. Imposible no hay nada... pero desde mi punto de vista, lo veo difícil
      Quizá alguien más puede ofrecer alguna alternativa
      :'(
      Slds

      Eliminar
    4. Entiendo!!
      Seguiré intentándolo más adelante, con calma.

      Gracias!

      Eliminar
    5. Hola. Existen programas que automatizan estos procesos, tomando el control del teclado y del ratón y repitiendo las mismas tareas las veces que necesites. Algunos son muy completos e incluyen bucles y condiciones lógicas, que los hacen efectivos... Suerte!

      Eliminar
  19. Hola. Necesito ayuda con la Macro SendKeys en Excel.

    Tengo una lista en Excel que quiero que me llene un formato PDF (que ya tengo) por cada una de las filas.

    Osea, quisiera saber que escribo en la macro para que agarre los datos de la primera fila, los copie al formulario PDF, guarde el archivo con un número secuencia, luego copie los datos de la segunda fila, llene el formulario y guarde con el siguiente número secuencia, y así hasta todas las filas.

    Muchas gracias.

    ResponderEliminar
    Respuestas
    1. Hola Arturo,
      no parece la cosa tan simple a priori...
      Trataré de escribir un post al respecto

      Saludos cordiales

      Eliminar
  20. Buenas Ismael,

    Muy bueno tu foro, y muy productivo.
    Tengo una duda. Necesito crear un ejecutable que ejecute una combinacion de letras ( sin necesidad de pulsarlas), unicamente lanzar esa apliacion y me pulse esas teclas.
    Por ejemplo, un programa qye ejecute CTRL + ALT + 5.
    ¿Seria posible realizar esa operacion conel metodo de SENDKEYS?

    Muchas gracias por tu ayuda, saludos

    ResponderEliminar
    Respuestas
    1. Hola
      gracias por tu comentario...
      Replicar esas tres teclas con sendkeys, sabiendo que:
      CONTROL := ^ (signo exponencial)
      ALT := % (signo de porcentaje)

      en teoría sería algo así:
      SendKeys "^%5", True

      pero siempre asegúrate que tienes activa esas aplicación.

      slds

      Eliminar
    2. Muchas gracias poor tu comentario

      Eliminar
  21. Hola Ismael, antes que nada, muchísimas gracias por tu predisposición y por compartir tus conocimientos.

    Tengo en una macro la instrucción:

    Application.SendKeys ("^HOME")

    Pero cuando corro la macro desde la sheet, me escribe en la celda seleccionada OME. He probado con PGUP, y esribe PGUP... además me apaga el teclado númerico. Te agradeceré si tienes alguna solución para ello.

    ResponderEliminar
    Respuestas
    1. Hola, y perdona la demora...
      perdí tu comentario con el paso del tiempo.

      Prueba con:
      Application.SendKeys ("^{HOME}")

      Saludos

      Eliminar
  22. Hola que tal? tengo una consulta respecto a "Evaluate" ya que supero los 255 caracterres y me arroja error, habra alguna alternativa para trasformar una string en valor??

    Gracias por tu tiempo!

    ResponderEliminar
    Respuestas
    1. Hola!
      si tu formulación supera los 255 caracteres..(qué fórmula tienes!!), yo trataría de partirla en varias secciones que no superen ese límite.
      Saludos cordiales

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.