IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Remplacement du ruban par des menus dans Access 2007

Access 2007 permet d'utiliser les anciens menus pour les bases aux formats MDB ou MDE

3 commentaires Donner une note à l´article (5)

Article lu   fois.

L'auteur

Profil ProSite personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

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.

Image non disponible

Voici dans la même application, le même menu sans le ruban.

Image non disponible

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"

Image non disponible

- Un formulaire N°1 "Frm_1" sans menu

Image non disponible

- 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.

Image non disponible

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

Image non disponible
II-B-1-a. Module Fonctions

Nous allons créer un module appelé " Fonctions " dans lequel nous mettrons toutes les fonctions à appeler.

Code module Fonctions
Sélectionnez
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"

Code Module Menus
Sélectionnez
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
Code Frm_Accueil
Sélectionnez
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

Code Frm_1
Sélectionnez
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

 
Sélectionnez
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 "

Code Module Menus
Sélectionnez
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 "

Code module Load
Sélectionnez
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.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Copyright © 2009 Jean-Damien GAYOT. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.