** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Problema con Sendkeys
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Problema con Sendkeys

 Responder Responder Página  12>
Autor
Mensaje
AmadeoIsaboya Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 24/Mayo/2010
Localización: España
Estado: Sin conexión
Puntos: 708
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita AmadeoIsaboya Cita  ResponderRespuesta Enlace directo a este mensaje Tema: Problema con Sendkeys
    Enviado: 06/Septiembre/2017 a las 18:53
Buenas tardes,
Recientemente he cambiado de ordenador y con él también de sistema operativo (Windows 10). En cambio, sigo empecinado en usar Access 2003 y VBA porque nunca me gustaron las versiones posteriores y sobre todo porque temía 'perder' mis queridas bases de datos y la programación y automatización que tengo hecha en ellas.
Después de un sin número de vicisitudes (faltaban complementos, referencias, ocx, etc., el Visual descatalogado por Microsoft, mi versión de Access sin soporte, el Jet en el olvido) conseguí por fin hacer funcionar Access 2003 en mi nuevo ordenador, pero ahora me he encontrado con un problema hasta el momento insoluble, y es que Windows 10 por cuestiones de seguridad no acepta el comando Sendkeys y me da el error 70 de acceso denegado.
La verdad es que en mi programación hice uso y abuso de Sendkeys y no tengo prácticamente ningún formulario en el qué su código no recoja este comando varias veces.
Por internet encontré una posible solución, alguien había creado una función con ese nombre y sustituía el comando, pero a mí no me funcionó porque lo que hacía la función era escribirme directamente en el código lo que yo quería introducir en un campo o en un control de formulario. Afortunadamente había clonado la base de datos y no fue nada irreparable, excepto que perdí también la función y ahora no la encuentro.
Supongo que este problema lo habrán padecido muchos usuarios, al parecer con Windows 7 y 8 ya se producía, por lo que espero que alguien me podrá dar una solución.
Gracias de antemano.

Recuerden, hoy es el día de mañana que tanto les preocupaba ayer. (Dale Carnegie)
Arriba
JuanW Ver desplegable
Habitual
Habitual
Avatar

Unido: 12/Mayo/2005
Localización: España
Estado: Sin conexión
Puntos: 120
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita JuanW Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 07/Septiembre/2017 a las 10:30
Hola:

Tu mismo lo dices:"uso y abuso de Sendkeys".

Mi consejo es que lo uses lo menos posible. Hay alternativas en VBA para (casi) todo.

Saludos
Arriba
JuLoMi Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 16/Junio/2006
Localización: España
Estado: Sin conexión
Puntos: 202
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita JuLoMi Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 07/Septiembre/2017 a las 10:43
en estos casos, yo utilizo el Wscript..

Public Function ESPECIAL_SendKeys(Quines)
     Dim WshShell
     Set WshShell = CreateObject("WScript.Shell")
     WshShell.SendKeys Quines
     Set WshShell = Nothing
End Function

por ejemplo, para 'Ocultar el Panel de Exploración'
  
  ESPECIAL_SendKeys "{F11}"  
Si se puede imaginar..., SE PUEDE HACER!
Arriba
AmadeoIsaboya Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 24/Mayo/2010
Localización: España
Estado: Sin conexión
Puntos: 708
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita AmadeoIsaboya Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 08/Septiembre/2017 a las 20:05
Gracias por tu ayuda, esta es con ligeras variaciones la función que había probado y que no me sirve porque en vez de escribirme en los controles de un formulario lo hace en el código de un módulo.
De todos modos he comprobado tu función y, como decía, me hace lo mismo: no envía las teclas (en este caso una cadena de texto) donde toca.
También he probado de usar el optional Wait pero en true y en false me da el mismo problema, no sé si actúa con el WshShell.
Pero como contaba cuando abrí el hilo, uso sendkeys para muchas más acciones. En el caso en que he probado el Wscript.shell podría pasar el valor por variable, pero en otros casos tendría que buscar otras soluciones individualizadas, lo que me dificulta mucho "adaptar" mis bases de datos.
Seguro que hago algo mal y que una solución debe existir, seguiré buscando...
Recuerden, hoy es el día de mañana que tanto les preocupaba ayer. (Dale Carnegie)
Arriba
JuLoMi Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 16/Junio/2006
Localización: España
Estado: Sin conexión
Puntos: 202
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita JuLoMi Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 08/Septiembre/2017 a las 20:11
lo siento, pero no "pillo" lo de "no me sirve porque en vez de escribirme en los controles de un formulario lo hace en el código de un módulo."

a mí funciona perfectamente en todos los formularios.
es de suponer que cuando ejecutas la funcion, el foco esta en el formulario/control deseado...
no llego a mas ideas.Confused
Si se puede imaginar..., SE PUEDE HACER!
Arriba
AmadeoIsaboya Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 24/Mayo/2010
Localización: España
Estado: Sin conexión
Puntos: 708
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita AmadeoIsaboya Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 08/Septiembre/2017 a las 22:22
Pues yo tampoco me lo explico, de hecho con Sendkeys nunca me pasó nada parecido, siempre enviaba las pulsaciones donde correspondía. Ahora me escribe en otro procedimiento del módulo de otro formulario.
Pero tu aportación me ha hecho pensar en una cosa: solamente he probado tu solución en uno de los formularios (suele ser el primero en ser utilizado) y debería probarlo en otros escenarios, en otras condiciones, porque en el único que he hecho ensayos se cierra (aunque teóricamente después de ejecutarse tu función) para dar paso a otras instrucciones y formularios y tal vez ese sea al problema. 
Lo probaré en otro ejemplo y ya os explicaré como ha ido.
Otra vez gracias!
Recuerden, hoy es el día de mañana que tanto les preocupaba ayer. (Dale Carnegie)
Arriba
AmadeoIsaboya Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 24/Mayo/2010
Localización: España
Estado: Sin conexión
Puntos: 708
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita AmadeoIsaboya Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 12/Septiembre/2017 a las 18:49
Hola de nuevo,
Ya he probado en otro formularios y persiste el problema, pero ha mejorado algo, en vez de escribirme en el código del formulario escribe en el control del formulario que ha recibido el enfoque, es decir NO donde toca.
En este caso este es mi código adaptado con la función suministrada por JuLoMi:

Private Sub IdConcepto_GotFocus() 'Este es el control que al entrar desencadena el evento
If sing2 = 12 Then Exit Sub ' Este valor hace que al recuperar el enfoque no se repita un bucle infinito
If Me.PrecioUnidad > 0 And Me.Cantidad > 0 Then ' Si el control cantidad y precio están rellenados
Dim SumParci As Double ' Variable
SumParci = Me.PrecioUnidad * Me.Cantidad 'obtener resultado suma parcial
DoCmd.GoToControl "sumaparcial" 'ir al campo correspondiente 'Quiero que escriba aquí el resultado

ESPECIAL_SendKeys SumParci
'Sendkeys SumParci, True ' devolver valor 'DESCONECTADO, substituido problema sendkeys windows10 Error 70 acceso denegado 12/09/17
End If
sing2 = 12 'evitar bucle infinito cuando el control vuelva a recibir el enfoque por 2ª vez
DoCmd.GoToControl "idconcepto" ' Vuelvo al control original
sing2 = 0 ' Vaciar variable para próxima ocasión
End Sub
----------------------------------------------------------------------------------------------------
Esto es solamente un ejemplo, tengo 490 entradas con el comando SendKeys sólo en esta BD. Con acciones muy distintas. En este caso está muy claro que puedo introducir la suma parcial de otros modos sin usar sendkeys, pero en otros supuestos la solución no será tan sencilla, hay varios formularios involucrados, instrucciones sql, etc. Debo encontrar una solución sustitutiva del Sendkeys, la función suministrada parece ser el reemplazo adecuado pero cuando consiga que la cadena que se trasmite se reciba donde se la espera.
He probado también añadir la opción Wait en los dos modos (true y false) con el mismo resultado, este optional parece no operar con WScript.Shell.
Mientras espero vuestra respuesta seguiré indagando. Gracias de antemano.
Recuerden, hoy es el día de mañana que tanto les preocupaba ayer. (Dale Carnegie)
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: España
Estado: Sin conexión
Puntos: 9670
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Mihura Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 12/Septiembre/2017 a las 20:19
Publicado originalmente por AmadeoIsaboya AmadeoIsaboya escribió:

...., en vez de escribirme en el código del formulario escribe en el control del formulario que ha recibido el enfoque, es decir NO donde toca.

Es que eso es lo que toca .... Wink

Sendkeys envía pulsaciones de tecla al control que tiene el enfoque .... no escribe en el código del formulario.

... o yo ando más perdido que carracuca .... Ouch


Por cierto, ¿me puedes explicar que es lo que quieres que haga esa sub que has posteado?


Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
AmadeoIsaboya Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 24/Mayo/2010
Localización: España
Estado: Sin conexión
Puntos: 708
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita AmadeoIsaboya Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 12/Septiembre/2017 a las 20:51
Hola,
Esa sub en concreto pertenece a un formulario en el que introduzco compras: cada registro tiene una cantidad, un precioUnidad, un concepto, etc. El producto de la cantidad de artículos por su precio debe reflejarse en el control SumaParcial y este cálculo lo obtengo cuando el campo IdConcepto recibe el enfoque.
Observa que con DoCmd.GoToControl "sumaparcial" retiro el enfoque a "concepto" y se lo doy a sumaParcial (así funcionaba al menos SendKeys) pero por motivo que desconozco antes de que se ejecute esta instrucción WScript.shell ya escribe en el control anterior, el IdConcepto que debería haber "abandonado" previamente.
Lo de escribir en el código del formulario era con la prueba anterior, en otro caso en que uso el sustituto de SendKeys me escribe en el código no de ese formulario sino en otro en el que ejecuto una instrucción sql. Yo fui el primer sorprendido de este comportamiento y también ando muy perdido.
Y todo por la "deshabilitación" de SendKeys que hizo Microsoft y el control que hacen las últimas versiones de Windows sobre este comando, sólo que yo me entero ahora porque funcionaba con Vista hasta comprarme este ordenador nuevo. He leído (ahora) bastante sobre el tema, he visto que hay algunos que han conseguido obviar el problema desconectando el control de cuentas de usuario (UAC) o ejecutando Access con permisos de administrador, pero a mí de momento no me ha funcionado, creo que con Windows 7 y 8 se resolvía así el problema pero con Windows 10 han dado un paso más en las restricciones.
Espero haberte aclarado algo, muchas gracias por interesarte.

Recuerden, hoy es el día de mañana que tanto les preocupaba ayer. (Dale Carnegie)
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: España
Estado: Sin conexión
Puntos: 9670
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Mihura Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 12/Septiembre/2017 a las 21:46
Eso me pareció que hacía ... pero no quería creérmelo LOL

Prueba a sustituir todo eso por ...  

me.SumaParcial = Me.PrecioUnidad * Me.Cantidad




Editado por Mihura - 12/Septiembre/2017 a las 21:47
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
AmadeoIsaboya Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 24/Mayo/2010
Localización: España
Estado: Sin conexión
Puntos: 708
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita AmadeoIsaboya Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 13/Septiembre/2017 a las 18:32
Publicado originalmente por AmadeoIsaboya AmadeoIsaboya escribió:

Esto es solamente un ejemplo, tengo 490 entradas con el comando SendKeys sólo en esta BD. Con acciones muy distintas. En este caso está muy claro que puedo introducir la suma parcial de otros modos sin usar sendkeys, pero en otros supuestos la solución no será tan sencilla, hay varios formularios involucrados, instrucciones sql, etc. Debo encontrar una solución sustitutiva del Sendkeys, la función suministrada parece ser el reemplazo adecuado pero cuando consiga que la cadena que se trasmite se reciba donde se la espera.

 
Gracias por el aporte pero como decía la solución a este ejemplo es muy fácil, el problema es que SendKeys se repite muchas veces en mis BD y necesito una función sustitutiva pero que escriba donde lo hacía SendKeys, o "desconectar" (si es posible) el control de Windows 10 sobre el comando y no me dé el Error 70 de "acceso denegado".
Recuerden, hoy es el día de mañana que tanto les preocupaba ayer. (Dale Carnegie)
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: España
Estado: Sin conexión
Puntos: 9670
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Mihura Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 13/Septiembre/2017 a las 19:27
Obviamente cada uno toma las decisiones que cree convenientes en los asuntos que le competen.

Dicho esto, déjame aconsejarte que elimines por completo el SendKeys de tus aplicaciones, te evitarás una continua fuente de errores y quebraderos de cabeza.

Si te decides a acometer el cambio, aquí te podremos ayudar a realizar lo que quieres sin necesidad de su uso.

Como nota, tengo que decirte que es rarísimo que alguna aplicación mía use SendKeys (cuando leí que tenías 490 usos del mismo en una sola BD se me quedaron los ojos como platos ... Confused).

Ya nos dirás. Un saludo.


Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
AmadeoIsaboya Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 24/Mayo/2010
Localización: España
Estado: Sin conexión
Puntos: 708
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita AmadeoIsaboya Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 13/Septiembre/2017 a las 19:57
Ahora mismo acabo de realizar otra prueba, he intercalado una pausa de un segundo entre el docmd.gotocontrol "sumaparcial" y la función suministrada por JuLoMi (Public Function ESPECIAL_SendKeys(Quines)), por si se trataba de un problema de "wait", de un retardo, lo que hacía que no escribiera donde quiero.
Con el increíble resultado que el cursor va al control, espera, y después se vuelve a idConcepto y ahí me escribe el resultado Confused.
Al final he hecho lo que me has dicho, meter el valor directamente: me.sumaparcial = etc., ahora sólo me queda resolver 489 casos más, y algunos serán peliagudos, por lo que recojo tu ofrecimiento de ayuda.
Nadie, nunca, en ninguna documentación, me advirtió sobre problemas o peligros del uso de SendKeys, y yo nunca tuve ningún problema. De ahí el uso-abuso del comando.
Muchas gracias y por favor, no cerréis este hilo.
Recuerden, hoy es el día de mañana que tanto les preocupaba ayer. (Dale Carnegie)
Arriba
MexMan70 Ver desplegable
Colaborador
Colaborador


Unido: 17/Julio/2007
Localización: DarkSide
Estado: Sin conexión
Puntos: 8959
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita MexMan70 Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 13/Septiembre/2017 a las 21:38
Hola AmadeoIsaboya, en la misma ayuda de Access reza asi (Al menos desde la version 2003):

Acción EnviarTeclas

Seguridad  Se recomienda evitar el uso de la instrucción SendKeys o de una macro AutoKeys con datos importantes o confidenciales. Algún usuario malintencionado podría interceptar las pulsaciones de teclas y comprometer la seguridad del equipo y sus datos.
...
...

Notas
... 

El intervalo de las pulsaciones en Access o cualquier otra aplicación puede ser muy engañoso. Por ello, se recomienda que si hay cualquier otra manera (como la acción BuscarRegistro =se refiere a parte del ejemplo que he omitido=) disponible para realizar la tarea deseada, evite el uso de la acción EnviarTeclas
< x="0" y="0" width="99999" height="99999" id="hc_extension_off">< x="0" y="0" width="99999" height="99999" id="hc_extension_highcontrast">< x="0" y="0" width="99999" height="99999" id="hc_extension_highcontrast_back">< x="0" y="0" width="99999" height="99999" id="hc_extension_grayscale">< x="0" y="0" width="99999" height="99999" id="hc_extension_grayscale_back">< x="0" y="0" width="99999" height="99999" id="hc_extension_invert">< x="0" y="0" width="99999" height="99999" id="hc_extension_invert_back">< x="0" y="0" width="99999" height="99999" id="hc_extension_invert_grayscale">< x="0" y="0" width="99999" height="99999" id="hc_extension_yellow_on_black">< x="0" y="0" width="99999" height="99999" id="hc_extension_yellow_on_black_back">
OneDrive: https://1drv.ms/f/s!AhsRUsxKwte3gVJR2a-FgxJL8H6R
Arriba
AmadeoIsaboya Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 24/Mayo/2010
Localización: España
Estado: Sin conexión
Puntos: 708
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita AmadeoIsaboya Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 14/Septiembre/2017 a las 20:42
Hoy he seguido con la revisión - renovación de esta base de datos. El caso de hoy ha sido mucho más laborioso (como suponía) pero explica a la perfección el porque del uso excesivo de sendkeys.
Se trata del primer ejemplo en el que usé la función sustitutiva de SendKeys, aquel en que os conté que me escribía en el código de otro formulario.
La funcionalidad de este formulario concreto es pasar desde Excel los movimientos bancarios (son cadenas de texto). Para que me sirvan estos "asientos" debo añadirles la entidad bancaria y extraer la fecha del movimiento e insertarla en un campo.
El problema aparecía cuando pulsaba el botón para denominar la entidad bancaria (tengo un botón para cada una). Tengo un bucle que recorre todos los registros y en cada uno insertaba el nombre del banco seleccionado mediante el envío de Sendkeys.
¿Por qué Sendkeys y no me.banco = Strbanco?
Pues porque el control - campo de entidad bancaria es un cuadro combinado en el que puedes elegir manual e individualmente cada uno de ellos, desplegando y clicando o escribiendo. Si le pasas una cadena por Visual Basic te da el error de que el campo no admite ese tipo de datos (espera el IdBanco, no su nombre), cosa que NO PASABA con sendkeys porque era como si yo mismo tecleara la entidad en cada registro.
Diréis que muy fácil, como cada banco tiene su Id, cuando pulses el botón mándale este dato y no el nombre. Pero no es tan sencillo, todos los botones tienen exactamente el mismo código y remiten a una única función a la que paso por variable el título del botón. Así cuando cambio de banco, introduzco uno nuevo, etc. el proceso es sencillísimo, basta cambiarle el título a un botón o crear uno nuevo con su título. Y no quiero renunciar a esta virtualidad, los años me han demostrado que los cambios en los bancos son constantes, el que más utilizo ha cambiado 3 veces de denominación. Además, cuando creo bases de datos procuro darles un enfoque "externo", no me dedico a programar pero nunca se sabe si algún día le puedo pasar esta aplicación a otro que utilice otros bancos, otras cuentas, etc. 

Solución: Ha sido extraer el idBanco mediante un dlookup que me devuelve el ID del mismo por su nombre. Y he tenido que pasar un buen rato recordando y probando la sintaxis exacta hasta encontrar la correcta. Y es que estoy oxidado en VBA, lo reconozco.
Seguimos, sólo me quedan unos 485 casos que resolver mientras mantengo la BD operativa y procuro no inundarla con registros de prueba mientras hago los cambios. Pero tiene un lado positivo, me obliga a estudiar, repasar y ensayar en Visual Basic y aparte de quitarme el óxido me gusta, así que no hay mal que por bien no venga.

Recuerden, hoy es el día de mañana que tanto les preocupaba ayer. (Dale Carnegie)
Arriba
 Responder Responder Página  12>
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable