2012-01-09 36 views
8

No soy experto en acceso, y tengo una (¡espero!) Pregunta simple ...¿Cómo hago referencia al formulario actual en una expresión en Microsoft Access?

Tengo un formulario con un número de registros. En algunos cuadros de texto, solo presento los valores de la tabla subyacente, por lo que están vinculados a los campos correspondientes.

Pero algunos cuadros de texto deben contener valores calculados. Algunos cálculos son complicados e involucran muchos campos de la tabla. Escribo el cálculo como una función de VBA. Podría entrar en algo así como "Fuente de control":

=MyFunction([Field1], [Field2], [Field3] ...) 

Pero no quiero enumerar decenas de campos en la llamada a la función. En cambio, quiero enviar el formulario completo (o el registro actual) como un parámetro, y dejar que la función haga referencia a los campos que necesita. Puedo hacerlo así:

=MyFunction([Forms]![MyForm]) 

Pero no me gusta tener que nombrar el formulario en la llamada. ¿No hay una forma de enviar la "forma actual" como un argumento de función? En VBA, solo usa la palabra clave "Me", para el examen "Me! [Field1]". Pero parece que "Yo" no es aceptado en una expresión.

¿Hay alguna otra manera de hacer referencia al formulario actual en una expresión?

(Es una pregunta estética, lo sé. Pero no es una buena programación usar "[Form]! [MyForm]". Más tarde copia los controles a otra forma y olvida cambiar el nombre en la expresión. .)

Agradecido por su ayuda! :-)

/Anders

Respuesta

9

que puede utilizar:

=MyFunction([Form]) 

El código sería:

Function MyFunction(frm As Form) 
MsgBox frm.Name 
End Function 
3

'yo' sólo puede ser llamado desde dentro del objeto de formulario correspondiente (es decir, en los procedimientos, funciones y eventos del objeto).

Mi forma favorita para referirse a la forma actual es llamar al objeto Screen.ActiveForm ...

screen.activeForm.recordset.fields(myFieldname).value 
screen.activeForm.controls(myControl).value 
screen.activeForm.name 
.... 

Por supuesto, puede enviar el objeto de formulario a una función personalizada

my Result = myCustomFunction(screen.activeForm) 

O podrías construir un objeto definido por el usuario. Los campos necesarios se podrían considerar como propiedades internas, establecidas en el subinicial Class_Initialize del objeto correspondiente.

+0

'Screen.ActiveForm.Name' se puede utilizar en una función global! ¡Gracias por eso! – bgmCoder

+0

Creo que esto debería marcarse como la respuesta, ya que funcionará para lograr el objetivo en muchas más situaciones que pasar el nombre del formulario como parámetro y eliminará la necesidad de pasar un parámetro, incluso un código más limpio y menos confuso. Felicitaciones a Philippe Grondier! Esto resolvió un problema al que me refería muy claramente. – DRC

2

Si está utilizando el código en el formulario, "me" se refiere al formulario actual. Entonces

Call SomeFunction(me) 

Sin embargo, "me" no se puede utilizar en el contexto de una expresión que está vinculada a un cuadro de texto.

En ese caso, puede elegir la pantalla actual en la rutina con screen.activeform como se sugiere.

Voy a menudo:

Dim f  as form 
Set f = screen.ActiveForm 
+1

Es bastante posible establecer un evento o incluso el origen de control de un objeto para una función utilizando la hoja de propiedades para el control, como estoy seguro que sabes, y en ese caso '= AFunction ([Formulario])' puede ser bastante útil. Es particularmente útil si desea cortar y pegar un control en varias formas. Creo que esta es la funcionalidad que el OP estaba considerando. – Fionnuala

+3

Golly, no tenía idea de que [Form] podría usarse en lugar de la palabra clave [me] en una expresión. De hecho, esto funciona y pasa el nombre del formulario y lo hace sin una codificación dura. Este consejo ciertamente abre algunas posibilidades de las que no tenía conocimiento. –

+0

Sí, no sabía que "Formulario" en una expresión era análogo a la palabra clave "Me" en VBA. Muy útil. Parece que no puedo encontrar documentación de esta técnica, ¡pero funciona! –

1
Screen.ActiveControl.Parent 
' or 
someControlVariable.Parent 

Puedo usar este si quiero que el subformulario actual (o formulario si no está actualmente en un subformulario) porque el uso de Screen.ActiveForm no proporciona el subformulario actual, pero sólo el formulario que contiene ese subformulario. Tenga en cuenta su contexto, si el control está dentro de un control de pestaña, entonces su elemento principal es ese control de pestaña y no el formulario.

0

En ACC2013 No pude usar la respuesta de fionnuala. Así que cambié a:

Controlador de eventos en la propiedad-Window:

=MyFunction() 

Mi código sería:

Function MyFunction() 
    Dim frm As Form 
    Set frm = Screen.ActiveForm 
    MsgBox frm.Name 
End Function 
+0

Como se indicó, puede pasar "me" o [form], ubt debe reemplazar "[form]" con el nombre real del formulario. Entonces, la respuesta fionnuala funcionará, pero NUNCA usas [Formulario], sino que reemplazas el formulario con el nombre del formulario como FORMS! SomeFormName. Creo que es mejor pasar "yo" a las rutinas, ya que entonces el código puede ejecutarse correctamente desde un formulario en el caso de que se inicie alguna otra forma u obtenga los focos, entonces su código no recogerá el error. Sin embargo, el uso de Screen.ActiveForm está bien. –

+0

¿Por qué es un problema utilizar [Formulario] en el generador de expresiones? ¿ActiveForm es incluso una opción en esta instancia? Veo una desventaja de utilizar explícitamente el nombre del formulario, ya que estos nombres pueden cambiar, o quizás desee robar las expresiones o el código de un formulario, pero use un nombre diferente para el formulario. –

Cuestiones relacionadas