Access - Sentencias SendKeys

 
Vista:
Imágen de perfil de jesus

Sentencias SendKeys

Publicado por jesus (2 intervenciones) el 23/01/2015 21:47:40
Hola a todos. Soy nuevo en este foro y espero que podáis ayudarme, al igual que espero, algún día, poder ser de utilidad a otros...

Veréis, mi problema es el siguiente: Estoy realizando una aplicación de base de datos en Access 2007 para mi trabajo (no es que yo sea informático ni nada por el estilo, pero como saben que me gusta el mundillo de Access, pues me lo han endosado a mi...)
Una de las cosas que mis jefes quieren que pueda hacerse, es cargar los datos de nuestros clientes desde otra base que utilizamos a menudo. Un compañero mío lo consiguió hacer desde Excel, pero, por alguna razón que no consigo
entender, el código que me dijo que había usado no funciona en Access (tal vez no me lo pasó todo, pues no pareció hacerle mucha gracia que le preguntase...)

Os explico:

En la base desde la que desean que se carguen los datos, tenemos una pantalla principal en la que se introduce el dni del cliente. Se pulsa "Enter" y pasamos a una segunda pantalla en la que aparecen los datos personales de dicho cliente (nombre y apellidos, dirección...). Si pulsamos "Enter" de nuevo, pasa a una tercera pantalla en la que aparecen los datos del último pedido que ha realizado el susodicho cliente. La pantalla que desearía copiar, es la
segunda.

Bien, a la pantalla inicial se puede llegar desde casi cualquier otra pulsando F4. Se abre lo que podríamos llamar un desplegable en el que introducimos el nombre de la transacción (en este caso CCP21) y de nuevo la tecla enter. Una vez hecho esto ya nos aparece la primera pantalla donde introducimos el dni, pulsamos enter... y vamos comprobando las pantallas.

Si queremos copiar una de ellas, podemos ir a Edición (en la barra de herramientas), seleccionar todo, copiar; pero también podemos hacerlo con atajos del teclado pulsando "Alt +e" y "s" y después "Alt +e" y "c".

Bueno, la idea es hacerlo desde un formulario de Access utilizando AppActivate y después SendKeys.

Para ello he creado un formulario con un cuadro de texto llamado txtdni, un segundo cuadro de texto llamado txtdatos y un botón de comando llamado cargar con el siguiente código colocado en el evento "Al hacer click":

Private Sub cargar_click()
AppActivate "WINVT"
Sendkeys "{F4}", True
SendKeys "CCP21", True
SendKeys "{enter}", True
SendKeys txtdni.value

'para que me coja el valor que haya introducido en el cuadro de texto

SendKeys "{Enter}", True

'con esto pasa a la segunda pantalla que contiene los datos personales

SendKeys "%es", True

'se supone que debería seleccionar la pantalla activa, es decir, la segunda pantalla.

SendKeys "%ec", True

'por tanto, debería copiar la segunda pantalla, que debería ser la seleccionada...

DoEvents
AppActivate "Microsoft Access"

'vuelvo al formulario de Access (esto sí lo hace bien)

txtdatos.SetFocus

'pongo el foco en el cuadro de texto txtdatos (también lo hace)

DoCmd.RunCommand acCmdPaste

'pego en txtdatos lo que he copiado antes (lo hace, pero... con sorpresa)

End Sub

Bien, pues resulta que, al pinchar en "cargar", me hace casi todo, pero solo casi . Pasa el foco a la aplicación en Winvt, va a la pantalla principal, introduce el dni que he puesto en el formulario, pasa a la pantalla siguiente mostrando los datos del cliente (la que quiero capturar), vuelve al formulario en Access, y, en el cuadro txtdatos me pega los datos... ¡¡¡DE LA PRIMERA PANTALLA!!! (no los de la segunda, los de la primera...)

Eso sí, si vuelvo a pulsar el botón de comando, entonces me pega los de la segunda pantalla (aunque, al maximizar winvt, éste se encuentra en la tercera pantalla). He probado todo lo que se me ha ocurrido (he puesto el código dos veces seguidas -copia la primera pantalla y aparece la palabra "executing" en la pantalla que he pegado-, he puesto dos veces seguidas la sentencia SendKeys "{enter}" para que pase directamente a la tercera pantalla con el mismo resultado...) ¿Cómo puedo conseguir que me copie los datos de la segunda pantalla con un solo click en el botón cargar?

¿Qué es lo que hago mal? En Excel el código funciona pues la aplicación que hizo el compañero va bien. ¿Es que en Access no puede hacerse?

Por favor, si podéis echarme una mano os lo agradecería mucho, ya que no sé qué más puedo intentar.

Muchas gracias a todos por vuestra atención y ayuda.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Norberto
Val: 1.094
Oro
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Sentencias SendKeys

Publicado por Norberto (753 intervenciones) el 26/01/2015 12:06:07
Hola.

Prueba con AppActivate "WINVT", True para que espere a que se active la ventana antes de seguir con los SendKey's.

Si no funciona, prueba a añadir en un módulo lo siguiente:

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

y entre el AppActivate y los SendKey's pon Sleep xxx y juegas con diferentes valores a ver si es cuestión de que las pulsaciones se envían antes de que la App se active.

Un saludo y suerte,

Norberto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de jesus

Sentencias SendKeys

Publicado por jesus (2 intervenciones) el 28/01/2015 23:22:45
En efecto, Norberto. Lo he probado y el problema era que las pulsaciones se enviaban "antes de tiempo". Al obligarle a esperar, me ha funcionado perfectamente. Muchísimas gracias por tu ayuda, ya tengo otro problemilla resuelto.

Ahora me surge otra cuestión que tampoco tengo nada clara. Abusando de tu amabilidad voy a comentarte a ver si me puedes orientar un poco:

Como explicaba en mi pregunta, debo llegar siempre a la pantalla inicial para "introducir" el dni y poder obtener los datos que debo copiar a Access. Casi siempre puede hacerse a través de la tecla de función F4, pero, en ocasiones, esa aplicación está en otra pantalla en la que no está activada esa tecla de función. Si de alguna manera pudiera "leer" la pantalla en la que está para poder indicarle, por ejemplo: "Si el título de la pantalla es 'Descuentos realizados' ir a la pantalla ..."

Es decir, después de utilizar "AppActivate" comprobar en qué pantalla está la otra aplicación y determinar la acción que debe tomar el programa antes de enviar las teclas Sendkeys txtdni.value.

No sé si esto puede hacerse o si hay algún otro sistema para conseguir llegar a la pantalla principal esté donde esté la aplicación ya que, si por algún motivo algún compañero la ha utilizado y se ha quedado, por ejemplo, en la pantalla "descuentos realizados", lógicamente, el código que utilizo, no consigue el resultado esperado (me ha pasado hoy probando la respuesta que me habías dado, y me he quedado con cara de pasta de churro hasta que me he dado cuenta de lo que ocurría )

De nuevo, muchas gracias a todos, ojalá podáis ayudarme para solucionar este segundo problemilla.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar