Pulsar un botón de otro formulario con código en access

Pulsar un botón de otro formularioOs mostramos un pequeño truco para poder pulsar un botón de un formulario desde otro formulario diferente en Access, ésto puede resultar muy útil como podrás ver en el truco.

Para poder pulsar un botón de un formulario desde otro formulario tenemos que declarar el Sub como Public del botón que queremos pulsar.
Vamos a verlo con un ejemplo, supongamos que tememos un formulario A con un botón que actualiza los datos de una lista incrustada en el mismo formulario y por otro lado tenemos un formulario B, y queremos que al cerrar el formulario B se pulse el botón "cmdActualizar" del formulario A para que se actualicen los datos de la lista mencionada.
Bien, pues para ello, lo primero que haremos será poner como público el Sub del botón en cuestión que tenemos en el formulario A:

Public Sub cmdActualizar_Click()
me.Lista.requery
End Sub

Luego solo tenemos que llamar a ésta Sub desde el evento "Al cerrar" del formulario B tal que así:

Private Sub Form_Close()
If currentProject.AllForms(formularioA).IsLoaded Then
Form_formularioA.cmdActualizar_Click
End If
End Sub

Como se puede ver hemos colocado una condición, que si el formulario A está abierto entonces pulsamos el botón, de ésta manera nos aseguramos de que no se produzcan errores en caso de tener el formulario A cerrado por cualquier motivo.
Como siempre dejamos los comentarios abiertos para cualquier duda que tengáis.

Categorías: 

Comentarios

Ante todo agradezo la ayuda que proporcionan mediante estas paginas.
mi consulta es la sig:
Hice una adaptación para hacer click en un boton que hace correr una macro
Nombre de la macro "SesRes"
nombre del boton en formulario A : "Restantes"

Public Sub Restantes_Click()
DoCmd.RunMacro ("SesRes"), 1, 1
End Sub

(cuando lo ejecuto directamente desde el Formulario A anda perfecto)
Mi problema es cuando lo quiero ejecutar desde el cierre del Formulario B

Private Sub Form_Close()
If CurrentProject.AllForms("Recursos").IsLoaded Then
Form_Recursos.Restantes_Click
End If
End Sub

Al cerrar form me aparece el sig mensaje:
"Falló la acción" /Nombre de Macro "SesRes"/Condición "Verdadero"/Nombre de acción "Ejecutar Comando"/Argumentos "18"

Detengo la acción y me aparece el sig mens.

"se ha producido el error 2046 en tiempo de ejecucion"
"la accion o comando"I" no esta disponible ahora"
cuando pulso Depurar me aparece en amarillo :

"Form_Recursos.Restantes_Click"
Desde ya les estoy muy agradecido. revise todo y no encuentro como solucionar el problema

Olvide mencionar que en mi caso el Formulario A en mi caso se llama "Recursos" y el Formulario B "Agenda"
Disculpen por la omision

Uhmm... puede que el problema esté en la llamada a la macro, prueba a convertir la macro a código y poner el código en el mismo módulo del formulario en vez de hacer la llamada a la macro, por ver si el problema viene por ahí.

Hota Tronico, desde ya te agradezco que hayas respondido.
Ya habia probado convirtiendola en codigo, el que funciona perfectamente si se cliquea directamente , pero al intentar hacerlo andar desde el "Private Sub Form_Close()" del formulario "Agenda" (o "Formulario B") me da un error similar a cuando llamaba la macro "SesRes"
"se ha producido el error 2046 en tiempo de ejecucion"
"error definido por la aplicacion o el objeto"

cuando pulso Depurar me aparece en amarillo :
"Form_Recursos.Restantes_Click"

Estoy desorientado

Public Sub Restantes_Click()

With CodeContextObject
.Restan = .SesProgr - .SesRealiz * -1
DoCmd.RunCommand acCmdRefresh
End With
End Sub

Private Sub Form_Close()
If CurrentProject.AllForms("Recursos").IsLoaded Then
Form_Recursos.Restantes_Click
End If
End Sub

Daniel

Prueba a sustituir el código del botón por un msgbox, a ver si de esa manera te funciona (seguro que si). No se lo que hace ese código tuyo, a lo mejor necesitas llevar el enfoque al formulario antes, también puedes hacer que se ejecute desde un botón del formulario B y que después cierre el formulario, por ejemplo con un botón aceptar.

También podrías probar a poner ese código en un módulo independiente y público, es cuestión de ir haciendo pruebas hasta dar con la solución. Cuentanos...

Hola Tronico
Muchas gracias por responder. Te comento que estoy medio loco. Vengo haciendo todas esas pruebas que sugeris y hasta ahora sigo dandome contra la pared.
Respecto del msgbox ANDA PERFECTO. mi problema es cuando quiero ejecutar el click de un boton (o cuadro de texto) cuyo evento ejecuta una macro, o macro transformada.
Anda todo bien si lo cliqueo desde el formulario "A" donde esta declarado como publico -ejecuta la macro o el codigo de la macro convertida sin problemas-.El problema es cuando , cliqueo el boton ubicado en el formulario "B" , o "al salir" , de este mismo formulario "B" (como te mencione anteriormente). Aunque parezca caprichoso, le di mil vueltas y la unica manera de conseguir que me grabe en el campo "Restan" -del que depende el "Subformulario Pacientes" - mediante el sig codigo {.Restan = .SesProgr - .SesRealiz * -1} .
-Si o si- necesito que me quede grabado en el Campo Restan de la tabla para que pueda verse desde otro formulario que me filtra por dias y horas
Desde ya muchas gracias
Daniel

Prueba a grabar el dato con un recordset directamente en la tabla y luego haces un requery como se explica en el ejemplo inicial.

Hola Tronico gracias por responder.
Mi problema es precisamente ese , mi problema es poder grabar el dato directamente en la tabla. La macro o el codigo convertido los puedo ejecutar desde el formulario principal A, y me graban sin problema alguno en la tabla . Lo que no consigo es que lo haga desde el formulario B.
Paso a explicarte:
Cada paciente tiene un registro en una tabla. En el formulario que muestra la informacion de cada paciente hay insertado un subformulario que muestra todos los turnos programados de ese paciente con fecha, hora y ....
Hasta ahi todo bien, puedo ver individualmente en cada registro todos los dias que concurrio y los dias que resta atenderse en formato "Vista hoja de datos"(en el subformulario de A) mas los controles calculados insertados el Formulario A . Esos datos calculados los puedo grabar en la tabla que guarda todos los pacientes ejecutando una macro o codigo .
Mi problema es automatizar (ya que manualmente lo puedo hacer registro por registro) la grabacion en un campo de la tabla desde el control calculado .
Para que todo esto?
Desde una agenda diaria que tiene un control calendar me muestra todos los turnos de cada dia asignados a cada paciente , donde necesito que tambien me muestre cuantas sesiones le restan para terminar .

Desde ya muchas gracias
Daniel

buena tengo un formulario principal el cual tiene un boton que me confecciona un mail con los datos del formulario, y a su ves dentro de este formulario tengo un subformulario que posee otro boton que manda la informacion del menu principal por Winsock texto plano. hasta hay todo bien funciona por separado (ahora lo que quiero es con un solo boton hacer las dos cosas al mismo tiempo)
desde ya muchas gracias por su tiempo
PD: siempre me da falla en tiempo de ejecucion...

Habría que ver el código de lo que estás haciendo pero siguiendo el ejemplo del artículo te debería funcionar...