Bonjour,
Pour remplacer les boîtes de dialogue MsgBox et InputBox, on peut créer des formulaires personnalisés et les ouvrir avec OpenForm et le paramètre acDialog.
Le problème est que lorsque OpenForm nous rend la main, le formulaire est fermé et ne peut pas lire le résultat.
Il y a des solutions discutables avec des variables globales ou des boucles d'attente.
Ici l'astuce consiste à rendre invisible le formulaire (Visible = False) au lieu de le fermer.
Le programme appelant reprend la main dès que le formulaire de dialogue est rendu invisible, et on peut lire le résultat avant de le fermer définitivement.
Pour mettre tout ça en pratique, insérez ce code dans le formulaire de dialogue :
- Remplacez les XXXXXX par le résultat à renvoyer en cas de fermeture du formulaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 Option Compare Database Option Explicit '-------------------------------------------------------------------------------- ' Formulaire dialogue '-------------------------------------------------------------------------------- ' Définissez le résultat si fermeture dans Form_Unload, à la place des XXXXXX ' Définissez les résultats avec la propriété Result (Result = LaValeur) '-------------------------------------------------------------------------------- ' Variable contenant le résultat Dim lResult As Variant '------------------------------------------------- ' Propriété de lecture/écriture du résultat '------------------------------------------------- Private Property Let Result(pResult As Variant) ' Met à jour le résultat lResult = pResult ' Rend le formulaire invisible pour rendre la main au programme appelant Me.Visible = False End Property Public Property Get Result() As Variant Result = lResult End Property '------------------------------------------------- ' Sur fermeture du formulaire '------------------------------------------------- Private Sub Form_Unload(Cancel As Integer) ' Seulement si le formulaire est visible ' Sinon le formulaire doit se fermer If Me.Visible Then ' Résultat si formulaire fermé Result = XXXXXX ' Annule la fermeture (le formulaire sera fermé par l'appelant) Cancel = True End If End Sub
- Mettez à jour le résultat en fonction des actions sur le formulaire (click, mise à jour de contrôle, ...) avec la propriété Resultat.
L'écriture dans cette propriété redonne la main au programme appelant.
Si vous ne souhaitez pas ce comportement, retirez la ligne Me.Visible = False et insérez la à l'endroit où vous voulez redonner la main à l'appelant.
Ensuite dans le code appelant le formulaire de dialogue :
- Définissez une variable pour recevoir le résultat :
- Ouvrez le formulaire en mode dialogue :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Dim lResult As Variant ' Modifier Variant par le type de données utilisé
- Récupérez le résultat avec la propriété Result :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 ' Ouvre le formulaire en mode dialogue DoCmd.OpenForm "MonFormulaireDialogue", , , , , acDialog
- Fermez le formulaire de dialogue (il est invisible mais il faut le fermer) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 ' Récupère le résultat lorsque le formulaire est rendu invisible lResult = Forms("MonFormulaireDialogue").Result
lResult contient le résultat.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 ' Ferme le formulaire invisible DoCmd.Close acForm, "MonFormulaireDialogue"
On peut mettre ce code dans une fonction dans un module standard :
Le code appelant est alors réduit à :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Public Function OpenDialogForm(pFormName As String, Optional pOpenArg As String) As Variant ' Ouvre le formulaire en mode dialogue DoCmd.OpenForm pFormName, , , , , acDialog, pOpenArg ' Récupère le résultat lorsque le formulaire est rendu invisible OpenDialogForm = Forms(pFormName).Result ' Ferme le formulaire invisible DoCmd.Close acForm, pFormName End Function
En pièce-jointe, un petit exemple.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Dim lResult As Variant ' Ouvre le formulaire de dialogue lResult = OpenDialogForm("MonFormulaireDialogue")
Partager