8
votes

Comment faire référence au formulaire actuel dans une expression dans Microsoft Access?

Je ne suis pas d'expert d'accès, et j'ai un (j'espère!) Question simple ...

J'ai un formulaire avec un certain nombre d'enregistrements. Dans certaines zones de texte, je viens de présenter des valeurs de la table sous-jacente - de sorte qu'elles sont liées aux champs correspondants.

mais certaines boîtes de texte doivent contenir des valeurs calculées. Certains calculs sont compliqués et impliquent de nombreux champs de la table. J'écris le calcul comme une fonction VBA. Je pourrais saisir quelque chose comme celui-ci comme "Source de contrôle": xxx

mais je ne veux pas répertorier des dizaines de champs dans l'appel de la fonction. Au lieu de cela, je souhaite envoyer tout le formulaire (ou l'enregistrement actuel) en tant que paramètre et laisser la fonction référence aux champs dont il a besoin. Je peux le faire comme ceci: xxx

mais je n'aime pas avoir à nommer le formulaire dans l'appel. N'y a-t-il pas un moyen d'envoyer le "formulaire actuel" comme argument de la fonction? Dans VBA, vous utilisez simplement le mot-clé "Me", pour exprimer "moi! [Field1]". Mais il semble que "moi" n'est pas accepté dans une expression.

existe une autre façon de référencer la forme actuelle dans une expression?

(C'est une question cosmétique, je savoir. Mais ce n'est pas une bonne programmation d'utiliser "[Formulaire]! [MyForm]". Plus tard, copiez les commandes à un autre formulaire et oubliez de changer le nom dans l'expression ...)

reconnaissant ton aide! : -)

/ anders


0 commentaires

6 Réponses :


10
votes

Vous pouvez utiliser: xxx

Le code serait le suivant: xxx


0 commentaires

5
votes

'Me' ne peut être appelé qu'à partir de l'objet de formulaire correspondant (c.-à-d. Dans les procédures, fonctions et événements de l'objet).

Mon moyen préféré de faire référence au formulaire actuel consiste à appeler l'écran Screen.ActiveForm .. . xxx

Bien sûr, vous pouvez envoyer l'objet de formulaire à une fonction personnalisée xxx

ou vous pouvez construire un utilisateur- objet défini. Les champs nécessaires pourraient ensuite être considérés comme des propriétés internes, définis dans la catégorie de la classe_initialize de l'objet correspondant.


2 commentaires

écran.activeform.name peut être utilisé dans une fonction globale! Merci pour ça!


Je pense que cela devrait être marqué comme la réponse puisqu'il fonctionnera pour atteindre l'objectif dans des situations beaucoup plus que de transmettre le nom du formulaire en tant que paramètre et éliminera la nécessité de passer un paramètre à tout prix, même un code moins confus. Kudos à Philippe Grondier! Cela a résolu un problème que je m'adressais très soigneusement.



3
votes

Si vous utilisez du code dans le formulaire, alors "moi" se référent du formulaire actuel. Donc xxx pré>

Cependant, "moi" ne peut pas être utilisé dans le contexte d'une expression liée à une zone de texte. p>

Dans ce cas, vous pouvez ramasser l'écran actuel dans la routine avec Screen.ActiveForm comme suggéré. P>

i Go: P>

Dim f     as form
Set f = screen.ActiveForm


3 commentaires

Il est tout à fait possible de définir un événement ou même la source de contrôle d'un objet à une fonction à l'aide de la feuille de propriétés pour le contrôle, car je suis sûr que vous savez, et dans ce cas = acconctionner ([formulaire]) peut être assez utile. Il est particulièrement utile si vous souhaitez couper et coller un contrôle sur plusieurs formes. Je crois que c'est cette fonctionnalité que l'OP envisageait.


Golly, je ne savais pas que [forme] pourrait être utilisé à la place du mot clé [ME] dans une expression. Cela fonctionne effectivement et passe le nom du formulaire et le fait sans codage dur. Cette pointe ouvre certainement certains possibilites que je n'étais pas au courant.


Ouais, je ne savais pas que "la forme" dans une expression était analogue au mot-clé "moi" dans VBA. Très utile. Je n'arrive pas à trouver la documentation de cette technique, mais cela fonctionne!



1
votes
Screen.ActiveControl.Parent
' or
someControlVariable.Parent
I use this if I want the current subform (or form if not currently in a subform) because using Screen.ActiveForm does not provide the current subform, but only the form containing that subform.  Do be aware of your context, if the control is within a tab control then its parent is that tab control and not the form.

0 commentaires

0
votes

in Acc2013 Je ne pouvais pas utiliser réponse Fionnuala . J'ai donc changé en:

gestionnaire d'événements dans la fenêtre de la propriété: p> xxx pré>

Mon code serait: p>

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


2 commentaires

Comme indiqué, vous pouvez transmettre "moi" ou [formulaire], ubt que vous devez remplacer "[formulaire]" avec le nom réel du formulaire. Donc, la réponse Fionnuala fonctionnera, mais vous n'utilisez jamais [formulaire], mais remplacez le formulaire avec le nom du formulaire tel que Formulaires! CertainsFormeName. Je pense qu'il est préférable de transmettre "moi" aux routines depuis que le code peut exécuter correctement à partir d'un formulaire dans le cas où un autre formulaire est lancé ou obtient les fonctions, votre code ne prendra pas le problème. Cependant, vous utilisez de l'écran.ActiveForm est ok.


Pourquoi est-ce un problème d'utiliser [forme] dans l'expression constructeur? Est une activité active même une option dans ce cas? Je vois un inconvénient d'utiliser explicitement le nom du formulaire car ces noms peuvent changer ou que vous souhaitez voler des expressions ou un code d'un formulaire, mais utilisez un nom différent pour le formulaire.



0
votes

L'approche suivie de Philippe Grondier ci-dessus est plus universelle, en particulier lorsque vous devez faire référence à un champ sur une forme C'est une nouvelle instance d'un objet de formulaire et un critère de requête combo de contrôle fait référence à la valeur d'un autre champ sur le même formulaire. Tant que c'est la forme active, vous utilisez une fonction qui renvoie la valeur. E.G.

Public Function ActiveFormControlValue(strControlName As String) As Variant
    ActiveFormControlValue = Screen.ActiveForm.Controls(strControlName).Value
End Function


0 commentaires