I. Introduction▲
L'une des nouveautés les plus visibles d'Office 2007, a été le remplacement des menus par le ruban.
Deux camps se sont aussitôt formés :
- Les inconditionnels ne voulant plus entendre parler de menu.
- Les réfractaires déconcertés par la place occupée et par le changement de langage nécessaire à la personnalisation. du ruban
Or il s'avère que, pour ceux qui le souhaitent, l'on peut tout à fait supprimer le ruban dans une application et le remplacer par des menus personnalisables.
Cela ne peut fonctionner qu'avec des fichiers .mdb ou .mde.
Pour les fichiers au nouveau format 2007 .accdb
et .accde, vous devez passer directement à la configuration du ruban.
I-A. Illustration▲
Voici une base d'une version 2000-2003, ouverte avec Access 2007, avec son menu dans l'onglet Compléments du ruban.
Voici dans la même application, le même menu sans le ruban.
II. Mise en application▲
II-A. Principes de fonctionnement▲
- Condition 1
Vos menus doivent être créés dynamiquement
Cela peut sembler à première vue un obstacle, mais en fait après avoir lu et assimilé l'excellent tutoriel de Philippe JOCHMANS sur le lien suivant https://starec.developpez.com/tuto/barrecommande/. vous vous apercevrez que même en étant un néophyte comme moi, cela devient tout à fait réalisable. - Condition 2
Vous devez créer votre barre de menus par code, lors du démarrage de l'application. - Condition 3
Vous devez paramétrer votre application pour qu'elle refuse le Ruban et les menus intégrés, et pour qu'elle accepte votre menu personnalisé.
II-B. Application▲
Pour étayer notre propos nous allons simuler une application avec trois formulaires.
- Un formulaire Menu général "Frm_Accueil" avec un menu popup "Fichier" et un menu popup "Edition"
- Un formulaire N°1 "Frm_1" sans menu
- Un formulaire N°2 "Frm_2" avec un menu popup "Fichier", des boutons de filtre, tri , recherche et retour sur le menu général.
II-B-1. Code Vba▲
Il faut commencer par s'assurer que la référence Microsoft Office 12 Object Library est bien cochée, ainsi que Microsoft DAO X.XX Object Library
II-B-1-a. Module Fonctions▲
Nous allons créer un module appelé " Fonctions " dans lequel nous mettrons toutes les fonctions à appeler.
Option
Compare Database
Option
Explicit
'------------------------------------------------------------
' Tri_croissant
'-----------------------------------------------------------
Public
Function
Tri_croissant
(
)
On
Error
GoTo
Tri_croissant_Err
DoCmd.RunCommand
acCmdSortAscending
Tri_croissant_Exit
:
Exit
Function
Tri_croissant_Err
:
MsgBox
Error
$
Resume
Tri_croissant_Exit
End
Function
'------------------------------------------------------------
' Tri_décroissant
'------------------------------------------------------------
Public
Function
Tri_decroissant
(
)
On
Error
GoTo
Tri_decroissant_Err
DoCmd.RunCommand
acCmdSortDescending
Tri_decroissant_Exit
:
Exit
Function
Tri_decroissant_Err
:
MsgBox
Error
$
Resume
Tri_decroissant_Exit
End
Function
'--------------------------------------------------------------
'Retour formulaire accueil
'------------------------------------------------------------
Public
Function
Retour
(
)
On
Error
GoTo
Retour_Err
'Ferme le formulaire et revient au formulaire d'accueil
DoCmd.Close
acForm, "Frm_2"
Form_Frm_Accueil.SetFocus
'Reconstruit la barre de menus originale
Call
CreateMenuGen
Retour_Exit
:
Exit
Function
Retour_Err
:
MsgBox
Error
$
Resume
Retour_Exit
End
Function
II-B-1-b. Module Menus▲
Puis nous créons un autre module "Menus"
Option
Compare Database
Option
Explicit
Public
Function
CreateMenu
(
)
Dim
cmb As
Office.CommandBar
Dim
btn As
Office.CommandBarButton
Dim
cmbBtn1 As
CommandBarButton
Dim
cmbBtn2 As
CommandBarButton
Dim
cmbBtn3 As
CommandBarButton
Dim
cmbBtn4 As
CommandBarButton
Dim
cmbBtn5 As
CommandBarButton
Dim
cmbBtn6 As
CommandBarButton
Dim
cmbFic As
Office.CommandBarPopup
On
Error
Resume
Next
Application.CommandBars
(
"MyMenu"
).Delete
' On crée la barre de menu
Set
cmb =
Application.CommandBars.Add
(
"MyMenu"
, msoBarTop, True
, False
)
' On crèe le menu fichier
Set
cmbFic =
cmb.Controls.Add
(
msoControlPopup)
cmbFic.Caption
=
"&Fichier"
'On ajoute les boutons Apercu, Mise en page et Imprimer
Set
btn =
cmbFic.Controls.Add
(
msoControlButton, 247
)
Set
btn =
cmbFic.Controls.Add
(
msoControlButton, 109
)
Set
btn =
cmbFic.Controls.Add
(
msoControlButton, 4
)
'On Ajoute le bouton Filtre
Set
cmbBtn1 =
cmb.Controls.Add
(
msoControlButton, 640
)
cmbBtn2.BeginGroup
=
True
'On Ajoute le bouton "Tous les enregistrements"
Set
cmbBtn2 =
cmb.Controls.Add
(
msoControlButton, 605
)
' Ajout sur la barre du bouton "Recherche"
Set
cmbBtn3 =
cmb.Controls.Add
(
msoControlButton, 141
)
cmbBtn3.BeginGroup
=
True
' Ajout sur la barre du bouton "Tri croissant"
Set
cmbBtn4 =
cmb.Controls.Add
(
msoControlButton)
With
cmbBtn4
.Style
=
msoButtonIcon
.BeginGroup
=
True
.FaceId
=
210
.TooltipText
=
"Tri croissant"
.OnAction
=
"=Tri_croissant()"
End
With
' Ajout sur la barre du bouton "Tri décroissant"
Set
cmbBtn5 =
cmb.Controls.Add
(
msoControlButton)
With
cmbBtn5
.Style
=
msoButtonIcon
.BeginGroup
=
False
.FaceId
=
211
.TooltipText
=
"Tri décroissant"
.OnAction
=
"=Tri_decroissant()"
End
With
' Ajout sur la barre du bouton "Retour accueil"
Set
cmbBtn6 =
cmb.Controls.Add
(
msoControlButton)
With
cmbBtn6
.Caption
=
"Retour Accueil"
.Style
=
msoButtonIconAndCaption
.BeginGroup
=
True
.FaceId
=
2151
.TooltipText
=
"Retour au menu principal"
.OnAction
=
"=Retour()"
End
With
cmb.Visible
=
True
End
Function
Public
Function
CreateMenuGen
(
)
' Création de la barre de menus du formulaire d'accueil
Dim
cmb As
Office.CommandBar
Dim
cmbFic As
Office.CommandBarPopup
On
Error
Resume
Next
Application.MenuBar
=
""
Application.CommandBars
(
"MyMenu"
).Delete
Set
cmb =
Application.CommandBars.Add
(
"MyMenu"
, msoBarTop, True
, False
)
' ajout du menu popup "fichier"
Set
cmbFic =
Application.CommandBars
(
"Menu Bar"
).Controls
(
1
)
cmbFic.Copy
cmb
' ajout du menu popup "Edition"
Set
cmbFic =
Application.CommandBars
(
"Menu Bar"
).Controls
(
2
)
cmbFic.Copy
cmb
Call
CreatePropertyMenu
cmb.Visible
=
True
End
Function
II-B-1-c. Code Formulaire Menu Général▲
Option
Compare Database
Option
Explicit
Private
Sub
Cmd_OpenForm1_Click
(
)
On
Error
GoTo
Err_Cmd_OpenForm1_Click
Dim
stDocName As
String
DoCmd.RunCommand
acCmdWindowHide
stDocName =
"Frm_1"
DoCmd.OpenForm
stDocName, acNormal
Exit_Cmd_OpenForm1_Click
:
Exit
Sub
Err_Cmd_OpenForm1_Click
:
MsgBox
Err
.Description
Resume
Exit_Cmd_OpenForm1_Click
End
Sub
Private
Sub
Cmd_OpenForm2_Click
(
)
On
Error
GoTo
Err_Cmd_OpenForm2_Click
Dim
stDocName As
String
'Ouvre le formulaire Frm_2
Application.Echo
False
DoCmd.RunCommand
acCmdWindowHide
stDocName =
"Frm_2"
DoCmd.OpenForm
stDocName, acNormal
DoCmd.Maximize
'transforme la barre de menus du formulaire 2
Call
CreateMenu
Application.Echo
True
Exit_Cmd_OpenForm2_Click
:
Exit
Sub
Err_Cmd_OpenForm2_Click
:
MsgBox
Err
.Description
Resume
Exit_Cmd_OpenForm2_Click
End
Sub
Private
Sub
Form_Load
(
)
'rend la barre de menus visible à l'ouverture
DoCmd.ShowToolbar
"MyMenu"
, acToolbarYes
End
Sub
II-B-1-d. Code Formulaire 1▲
Code Sur Form_Frm1
Option
Compare Database
Option
Explicit
Private
Sub
Cmd_Retour_Click
(
)
On
Error
GoTo
Err_Cmd_Retour_Click
'On ferme le formulaire
DoCmd.Close
'on revient au formulaire d'accueil
Form_Frm_Accueil.SetFocus
'On rend visible le menu
DoCmd.ShowToolbar
"MyMenu"
, acToolbarYes
Exit_Cmd_Retour_Click
:
Exit
Sub
Err_Cmd_Retour_Click
:
MsgBox
Err
.Description
Resume
Exit_Cmd_Retour_Click
End
Sub
Private
Sub
Form_Load
(
)
DoCmd.ShowToolbar
"MyMenu"
, acToolbarNo
End
Sub
II-B-1-e. Code Formulaire 2▲
Code Sur Form_Frm_2
Option
Compare Database
Option
Explicit
Private
Sub
Form_Load
(
)
'Rend le menu visible
DoCmd.ShowToolbar
"MyMenu"
, acToolbarYes
Me.SetFocus
End
Sub
II-B-2. Options de démarrage▲
Quatre propriétés de démarrage nous intéressent plus particulièrement.
- La propriété AllowBuiltInToolbars qui correspond à "Autoriser les menus intégrés "
- La propriété AllowFullMenus qui correspond à " Afficher les menus complets "
- La propriété StartUpMenuBar qui correspond à " Barre de Menu "
- La propriété StartUpForm qui correspond à " Afficher le formulaire "
Pour paramétrer ces propriétés nous allons ajouter les codes suivants dans le module " Menus "
Function
ModifProp
(
chNomPropriete As
String
, varTypeProp As
Variant
, varValeurProp As
Variant
) As
Integer
Dim
MyDb As
DAO.Database
Dim
prp As
DAO.Property
Const
conErreurPropNonTrouvee =
3270
'code erreur si propriété non trouvée
Set
MyDb =
CurrentDb
On
Error
GoTo
Change_Err
MyDb.Properties
(
chNomPropriete) =
varValeurProp
ModifProp =
True
Exit
Function
Change_Err
:
If
Err
=
conErreurPropNonTrouvee Then
'Crèe la propriété
Set
prp =
MyDb.CreateProperty
(
chNomPropriete, varTypeProp, varValeurProp)
MyDb.Properties.Append
prp
Resume
Next
Else
ModifProp =
False
Exit
Function
End
If
End
Function
Public
Function
CreatePropertyMenu
(
)
Call
ModifProp
(
"AllowBuiltInToolbars"
, dbBoolean, False
) 'refuse les menus intégrés
Call
ModifProp
(
"AllowFullMenus"
, dbBoolean, False
) 'refuse les menus complets
Call
ModifProp
(
"StartUpMenuBar"
, dbText, "MyMenu"
) 'nom du menu à l'ouverture
Call
ModifProp
(
"StartUpForm"
, dbText, ""
) 'Pas de formulaire au démarrage
'c'est l'autoexec qui doit le faire.
End
Function
Créons une procédure à lancer au démarrage. Pour cela un petit module " Load "
Option
Compare Database
Option
Explicit
Public
Function
demarrage
(
)
Application.Echo
False
'Lance le processus
Call
CreateMenuGen
'Ouvre le formulaire d'accueil
Dim
stDocName As
String
stDocName =
"Frm_Accueil"
DoCmd.OpenForm
stDocName, acNormal
DoEvents
Application.Echo
True
End
Function
Il ne reste plus qu'à créer une macro autoexec lançant la fonction " demarrage () "
Voilà c'est
terminé. Vous pouvez ouvrir votre application et voir le résultat.
Ne pas oublier que vous avez
la touche Maj au démarrage pour revenir aux menus normaux.
III. Conclusion▲
Je n'ai pas créé ce processus pour m'opposer aux adeptes du Ruban (dont je me sers régulièrement), mais
simplement pour montrer que l'on peut tout à fait opter pour une solution autre que celle imposée.
Cela s'apparente un peu à du bricolage et cela peut sembler compliqué, mais une fois créé quelques
menus standards, cela devient presque aussi facile qu'avant.
Si les menus sont créés de cette façon dans
les versions antérieures, ils pourront être lus sans problème avec Access 2007 et vous pourrez les
modifier à votre guise. Vous pouvez ainsi anticiper la transition.
Mon regret est bien sûr que cela ne fonctionne pas avec les nouveaux formats d'Access.
Vous pouvez télécharger le fichier servant d'exemple
A noter que ces applications fonctionnent avec le Runtime.
IV. Remerciements▲
Je tiens à remercier tout particulièrement Domi2, Philippe JOCHMANS, Tofalu, Pierre FAUCONNIER et l'équipe des rédacteurs Office pour leur patience et leur accueil.