** 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 Invertir el orden de clasificación
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: 28/Septiembre/2017 a las 19:12
Muchas gracias, lo probaré
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: 9742
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Mihura Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 27/Septiembre/2017 a las 21:42
Es correcto, solo una puntualización, hay que quitar las comillas de "varcontrol", quedaría así:

Forms(varForm).Controls(varSecundario).Form.Controls(varControl) = IdDatos


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

Access Aplicaciones
Tecsys.es
Arriba
pitxiku Ver desplegable
Habitual
Habitual
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 91
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita pitxiku Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 27/Septiembre/2017 a las 21:09
Puedes usar variables para acceder a los elementos dentro de las colecciones Forms y Controls:

Dim varForm As String
Dim varControl As String

varForm = "Nombre del formulario"
varSecundario = "Nombre del control subformulario"
varControl = "Nombre del control"

Forms(varForm).Controls(varSecundario).Form.Controls("varControl") = IdDatos

Más o menos, escrito del tirón
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: 27/Septiembre/2017 a las 19:09
Buenas tardes,
Estas semanas he estado sustituyendo el Sendkeys en varios formularios, y salvo algunos problemillas iniciales con la sintaxis del Dlookup he podido solucionarlo todo, había podido hasta el momento. (Este post se empezó cuando no estaba solucionado, ahora ya lo está, lo cuelgo porque creo que la información puede servir a alguien).
Para los que no hayan seguido la problemática y para abreviar, sustituir la línea de Sendkeys + cadena de texto que se enviaba a un cuadro combinado implica ahora asignar valor al combo mediante visual básic, y como buen cuadro combinado que se precie, y aunque tengamos normalmente esta columna oculta, funciona con la clave Id (autonumérico) del registro, y no por la cadena string del concepto que sea, con lo cual me veo obligado a hacer previamente ese Dlookup, obtener el ID correspondiente, y así si que puedo asignar un determinado valor a un cuadro combinado. Esto está SOLUCIONADO.
El problema actual es el siguiente: 

Tengo varios formularios que contienen subformularios. Los utilizo para introducir "operaciones", normalmente compras. Tengo uno de operaciones genéricas y otro que utilizo sólo para compras en supermercados. Cada registro de los formularios principales contiene los datos generales de la compra: fecha, proveedor, medio de pago, etc. Los subformularios recogen los "detalles" de cada operación: núm. de artículos, precio unidad, CONCEPTO (artículo) y descripción.
Ese campo concepto es un cuadro combinado en el que puedes elegir un artículo, introducirlo directamente, o bien captarlo de la tabla "TiposDeAnotación" mediante un botón. Esto abre el form "Categorías", y seleccionando una de ellas se abre al lado el formulario "tiposDeAnotación" para que escojas una de ellas con un doble click.
Este envío del concepto o tipoAnotación lo hacía con Sendkeys. Para saber a que formulario tenía que enviar el valor cuando abría el frm "TiposDeAnotación" le pasaba el nombre del formulario de destino por argumentos:
Private Sub Concepto_DblClick(Cancel As Integer)
Dim datos, NameForm As String
datos = Concepto.Value 'Valor escogido
NameForm = TxtFrmOrigen 'Nombre del frm de origen pasado con Args al abrir
If NameForm <> "No consta" Then 'Valor predeterminado, el txt frm origen no habría sido rellenado al abrir
DoCmd.OpenForm NameForm 'Aunque ya está abierto, así le damos enfoque
DoCmd.GoToControl "idconcepto" 'Ir al control
Sendkeys datos 'Darle el valor
Sendkeys "{tab}" 'Validar anotación pasando al campo siguiente
DoCmd.Close acForm, "categorías" 'Cerrar este frm y por código el frm auxiliar de tipos anotación
Else
MsgBox "El formulario no consta" 'No tenemos dónde enviar los datos
Exit Sub 'Salir
End If
End Sub

Como podéis ver, con sendkeys me bastaba referirme al formulario principal de llamada y al control (del subformulario) correpondiente (que tienen el mismo nombre, es un dato fijo), y el pase de datos se producía sin ningún problema, apareciéndome el valor escogido en mi registro de detalle.
Sin Sendkeys, pensaba que se trataría de cambiar el valor de cadena del tipoAnotación (por ejemplo patatas) por su correspondiente IdTipoAnotación, así había sido hasta ahora.
Pues bien, empezó por darme "error definido por la aplicación o el objeto" sobre el que VBA no te da demasiada información. Supuse que sería por no hacer referencia al subformulario en el que estaba el campo - combo IdConcepto, así que empezó mi periplo por dar con la sintaxis adecuada: con puntos separando frm principal, sbf y campo, con signo de admiración, añadiendo la coletilla .form al subformulario, combinando, etc., etc., pero todas daba un error o el otro.
Al final deduje que el problema estaba en que, con la sintaxis correcta (si daba con ella) NO se puede pasar por variable el nombre del frm principal o por lo menos el del subformulario que contiene, en vez de 'leer' el contenido de la variable VBA me indicaba que no encontraba el campo "nombreVariable".
Busqué en el foro y no encontré hacer referencia a subformularios, pero en internet (http://www.llodax.com/Tutoriales/SintaxisSubForms.htm) encontré este artículo, al parecer de Xavi y en el qué se menciona a Eva Etxebeste, Mihura, Búho y un largo etcétera que lo han posteado, y me solucionó el problema. Es una tabla donde se escenifican llamadas a un formulario que contiene un sbf que a la vez contiene otro, y describe la sintaxis adecuada dependiendo desde dónde hagas referencia.
Entonces hice una prueba, introduje la sintaxis tal como se describe en la tabla, pero utilizando el nombre literal de form principal, subform y de campo, y voilà, objetivo conseguido. Esta es la sintaxis correcta en mi caso, llamando a un sbf desde "fuera":
Forms!SupermercadosTemporal!DetallesTemporal.Form!IdConcepto = IdDatos ' Pasar Valor
Sólo me quedaba distinguir entre uno u otro formulario de origen, cosa que conseguí con un Select Case:
        Select Case NameForm
        Case "supermercadosTemporal" 'El concepto se ha solicitado desde este form
        Forms!SupermercadosTemporal!DetallesTemporal.Form!IdConcepto = IdDatos ' Pasar Valor
        Case "Operaciones" 'El concepto se ha solicitado desde este form
        Forms!operaciones!Detalles.Form!IdConcepto = IdDatos ' Pasar Valor
        End Select

Llego a la conclusión de que no se puede hacer referencia a forms y sbfs mediante variables, pero no me atrevo a ser categórico. Alguien con superiores conocimientos podría desdecirme.
Es otra razón por la cual llegué a hacer tanto uso de Sendkeys allá por 2007 cuando creé esta BD. Vaya pues en mi descargo, aunque ahora estoy contento con el código sustitutivo, como dice JuLoMi: Si se puede imaginar se puede hacer!

Con esto he arreglado el problema de Sendkeys en 8 formularios y subformularios. Como veis la problemática se va diversificando, de no poder resolver el problema hubiera abierto otro hilo con la cuestión "referencia a subformularios" o algo así. Lo posteo por si a alguien le puede servir.
De tanto hacer DlookUp me he planteado automatizar la tarea, estoy creando un formulario en el que puedes escoger una de tus tablas o consultas, y esto te lista todos los campos que contiene con su tipo de datos. Dependiendo de estos, (ya sabéis, si string finalizar la condición where con un & "'", si es numérico, no, etc.). También solucionar si contiene apóstrofos el resultado. Cuando lo tenga listo lo colgaré en el foro por si alguien le puede sacar partido.

Muchas gracias, PUEDE CERRARSE este hilo, de surgir algún problema 'insoluble' y distinto a los mencionados abriré el hilo correspondiente.
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: 19/Septiembre/2017 a las 23:36
Os podría seguir contando los avatares de modificar todos los procedimientos en que incluí SendKeys, desgraciadamente muchos, pero me temo que se va a convertir en una miscelánea de casos.
Por lo que sea, a mí no me funciona la función pasada por JuLoMi y que ya había probado con ligeras modificaciones, sacada de otro foro.
Hoy mismo, después de solucionar el problema de las dichosas comillas (1000 gracias a Patxi Sanz, a EmilioVe por su fenomenal trabajo publicado en este foro) el problema ha radicado en sustituir un Sendkeys que enviaba la pulsación %4 (alt+4) a un botón de un formulario que a la vez abría otro formulario relacionado con args. Pues bien, como no sé dónde hayan acabado esas teclas (no se ha abierto nada), he decidido sustituir el sendkeys por una llamada a la sub del botón. Poniéndole Call delante y sin ponerlo, abriendo el formulario en el que radica el botón y pasándole el enfoque antes de ejecutar la instrucción, y 100 pruebas más sin resultado, por el momento. Mañana más, pero si no llego a la solución ya buscaré en el foro o abriré otro hilo ad hoc.
Sólo para dejar constancia de que sendKeys a mí JAMAS me dió ningún problema, y puedo dar fe que la he ejecutado en miles de ocasiones, con otros programas en funcionamiento, en diferentes ordenadores, y por muchísimo tiempo. Pero por algo se habrá hecho, quiero creer.
En fin, muchas gracias. Puede cerrarse el hilo.

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

Unido: 29/Marzo/2005
Localización: Alcalá Meco
Estado: Sin conexión
Puntos: 2933
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita lbauluz Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 19/Septiembre/2017 a las 18:04
¿Se puede cerrar el hilo?
Quod natura non dat, Salmantica non præstat
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: 19/Septiembre/2017 a las 17:53
Perfecto! Funciona de maravilla. Muchas Gracias.
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: 18/Septiembre/2017 a las 21:32
encontrado!
http://www.mvp-access.com/buho/ficheros/ruedaratonVBA.zip
Si se puede imaginar..., SE PUEDE HACER!
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: 18/Septiembre/2017 a las 21:21
perdon, me he confundido y lo que pedias es el "RuedaVBA"

No sé de donde lo saque, pero si me das un email te envio el .ZIP (1298 Kb)
Si se puede imaginar..., SE PUEDE HACER!
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: 18/Septiembre/2017 a las 21:17
yo uso el IndenterVBA, disponible aquí:

https://www.add-ins.com/macro-products-for-Microsoft-Excel/how-to-indent-vba-code/how-to-indent-vba-code.htm

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: 18/Septiembre/2017 a las 20:35
Tengo la tb bancos y el cuadro combinado que lee la misma, como recomiendas. pero no es tan fácil como cambiar el nombre del banco. Si lo hiciera así, cambiaría el nombre en todos los registros anteriores, de modo que en los que figuraba "Sa Nostra" ahora serían "BMN" y dentro de muy poco todos estos serían "Bankia". Lo mismo pasaría con los proveedores, por ejemplo.
De todos modos ese problema está solucionado con el Dlookup. Ahora estoy centrado en resolver el problema de SendKeys en otro formulario, ya lo había pulido todo y ahora al abrir el formulario me da un error, me pide un parámetro basado en un cuadro combinado del mismo. No tuve la precaución de cerrar y abrir este form cuando "solucionaba" cada una de las sub que contiene por lo que ahora no sé dónde pueda estar el error, pues no salta un código de error de VBA sino un mensaje de Access que no da opción a depurar el código incorrecto.
Así que vuelta a empezar, esta vez paso a paso, procedimiento por procedimiento, después probar, y no pasar al siguiente hasta que resuelvo el anterior.
Y ahora me he encontrado con un problema nuevo: utilizando el Dlookup para obtener el idProveedor, todo funcionaba de maravilla hasta que seleccioné un proveedor llamado "S'Estació". Ya me he mirado el hilo magistral en el qué se tratan los problemas de cadenas que contengan comillas pero en mi caso todavía no he podido encontrar la solución, aunque supongo que lo conseguiré.
Y con tantas tardes de VBA ha surgido otro pequeño pero molesto inconveniente. Mi VB no acepta el scroll del ratón, por lo que se dificulta navegar por tantas y largas páginas de código. He buscado en este foro y no he encontrado nada, por lo que lanzo esta cuestión. Si encontráis que se está convirtiendo demasiado en una miscélanea puedo abrir otro hilo.
Muchas gracias por vuestra ayuda.



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: 9742
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Mihura Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 14/Septiembre/2017 a las 20:56
Me da que complicas muchísimo lo básico ...

- deberías tener una tabla con los bancos (id, nombre, ....)
- deberías tener un cuadro combinado (Me.CboBanco) con los id y nombres de los distintos bancos

Una vez que seleccionas el banco:
- en el valor Me.CboBanco tienes el id del mismo
- en el valor Me.CboBanco.Column(1) tienes el nombre del banco
- tu botón de proceso cogerá estos datos y hará lo que deba

Cuando el nombre del banco cambie, lo cambias en la tabla y asunto resuelto, es tan simple como eso.

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: 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
MexMan70 Ver desplegable
Colaborador
Colaborador


Unido: 17/Julio/2007
Localización: DarkSide
Estado: Sin conexión
Puntos: 8975
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: 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
 Responder Responder Página  12>
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable