Bonjour,
Je ne sais ce que vous en pensez mais personnellement, je trouve que quelque fois le "mieux" peut être l'ennemi du bien. Exemple, la personnalisation des menus et barres d'outils dans Access depuis la version 2007. Avant, un clic droit et deux ou trois manip et l'affaire était réglée pour des besoins simples. Maintenant il faut maîtriser le XML et construire une usine à gaz pour le moindre menu et la moindre fonction !?
Bref, j'ai fabriqué mon menu maison :
1 - J'ai créé trois tables (pas indispensable mais pratique pour gérer le contenu des menus) :
. Table "Menu" : Elle me permet d'identifier les différents menus que je souhaite gérer (contenu : un id automatique, un nom et un oui/non pour actif/inactif).
. Table "Type" : Pas indispensable mais pratique si on souhaite pouvoir gérer différents type de fonctions (imprimer un état, ouvrir un formulaire, voir un état, exécuter une fonction...)
. Table "Fonctions" : Elle me permet de liste les fonctions de l'ensemble des menus (elle en lien avec la table menu évidemment) (contenu : un ide automatique, un nom, l'id du menu lié, l'id du type de la fonction, un oui/non pour actif/inactif et un champ texte pour la saisie de l'élément lié (état, formulaire, fonction...))
2 - J'ai créé une fenêtre qui me permet de gérer mes tables.
3 - Dans le formulaire où je veux le menu :
. Je crée un champ liste déroulante. Son contenu est basé sur la table "Fonctions" en filtrant par l'id du menu et l'actif/inactif. En code évènement de la liste j'utilise...
Sur réception de focus :
Sur clic :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Private Sub Liste_Menu_Imprimer_GotFocus() Me.Liste_Menu_Parametre.Dropdown End Sub
+ La fonction action menu qui permet de traiter la fonction appelée selon son type :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Private Sub Liste_Menu_Imprimer_Click() Call Action_Menu(Me.Liste_Menu_Imprimer) End Sub
. Je crée un bouton et je lui donne le nom du menu. La macro d’événement sur clic c'est "AtteindreContrôle" + le nom de la liste déroulante (il doit exister l'équivalent en vba mais je ne connais pas, dsl).
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
41
42
43
44 Function Action_Menu(REF_Num As Integer) Dim Parametre As String Dim stDocName As String Dim stLinkCriteria As String Dim Typ As Integer 'Test du paramètre Num 'If REF_Num = False Or REF_Num = "" Or REF_Num = 0 Or REF_Num < 0 Or IsNull(REF_Num) Then Exit Function Typ = DLookup("MENDET_MENTYP", "MENu_DETail", "MENDET_Num = " & REF_Num) If Typ = 1 Then 'Ouvrir un formulaire stDocName = DLookup("MENDET_Parametre", "MENu_DETail", "MENDET_Num = " & REF_Num) DoCmd.OpenForm stDocName, , , stLinkCriteria End If If Typ = 2 Then 'Voir un état stDocName = DLookup("MENDET_Parametre", "MENu_DETail", "MENDET_Num = " & REF_Num) DoCmd.OpenReport stDocName, acViewPreview, , , acDialog End If If Typ = 3 Then 'Exécuter une requête stDocName = DLookup("MENDET_Parametre", "MENu_DETail", "MENDET_Num = " & REF_Num) DoCmd.SetWarnings False 'Désactive les messsages d'alerte DoCmd.OpenQuery stDocName 'Exécution de la requête DoCmd.SetWarnings True 'Réactive les messages d'alerte End If If Typ = 4 Then 'Exécuter une fonction stDocName = DLookup("MENDET_Parametre", "MENu_DETail", "MENDET_Num = " & REF_Num) 'Call stDocName End If If Typ = 5 Then 'Imprimer un état stDocName = DLookup("MENDET_Parametre", "MENu_DETail", "MENDET_Num = " & REF_Num) DoCmd.OpenReport stDocName, acNormal, , , acDialog End If Parametre = 0 End Function
Je place le bouton où je souhaite (c'est totalement libre, cool non ?)
Je réduit la liste déroulante à 0 en largeur et je la place sur le coté gauche du bouton.
Résultat :
En apparence, seulement un bouton visible.
Quand vous cliquez sur le bouton, le focus est dirigé vers la liste déroulante et elle est automatiquement ouverte.
Si vous cliquez sur une fonction, le traitement est exécuté.
Si vous cliquez en dehors de la liste, elle est automatiquement fermée.
Voilà, comme un bon vieux menu déroulant.
Merci de me dire ce que vous en pensez et de me suggérer des améliorations.
Partager