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 FunctionII-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 FunctionII-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 SubII-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 SubII-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 SubII-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 FunctionCré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.





