Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/12/2010, 21h24   #1
Membre à l'essai
 
Homme Jean François Denes
Amateur
Inscription : juin 2010
Messages : 42
Détails du profil
Informations personnelles :
Nom : Homme Jean François Denes
Localisation : France

Informations professionnelles :
Activité : Amateur

Informations forums :
Inscription : juin 2010
Messages : 42
Points : 22
Points : 22
Par défaut USysRibbons pour Ribbon XML

Bonjour,

Je viens de voir que l'on pouvait utiliser la table USysRibbon (ou autre table) pour charger les rubans.

Y a t-il une raison d'utiliser cette méthode ou fichier XML externe avec func Loadribbons ?

UsysRibbon me parait avoir l'avantage de ne pas avoir de fichiers externes à gérer.

Merci.
JFD
JFDAccess est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2010, 12h45   #2
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 939
Points : 6 278
Points : 6 278
Bonjour,

La table USysRibbons est faite pour contenir le xml des rubbans.
Elle est reconnue pas Access, et les rubans sont chargés sans une ligne de code VBA.
Après avoir collé le xml des rubans dans USysRibbons et avoir redémarré la base de données,
on retrouve le nom de ces rubans dans les listes déroulantes permettant de choisir le ruban de l'Application ou d'un formulaire.

Le gros avantage est que l'on n'a pas besoin d'avoir des fichiers externes pour les rubans.
Tout est dans le fichier base de données.

A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2010, 17h06   #3
Membre à l'essai
 
Homme Jean François Denes
Amateur
Inscription : juin 2010
Messages : 42
Détails du profil
Informations personnelles :
Nom : Homme Jean François Denes
Localisation : France

Informations professionnelles :
Activité : Amateur

Informations forums :
Inscription : juin 2010
Messages : 42
Points : 22
Points : 22

Merci, C'est bien ce que je croyais avoir compris,

Par contre étant débutant en Access, j'ai une question, je ne trouve pas d'exemple "simple" pour manipuler en VBA les rubans une fois créés. Les actions à partir du ruban (on_action) sont bien décrites dans les assistants, mais je n'y vois pas la contrepartie dans les formulaires.

ex: comment sélectionner simplement un tab/ un group, ... à partir d'un formulaire

=> Y a t-il un exemple explicitant la totalité de ce qu'il y a à faire.

Actuellement j'ai réussi a construire le ruban, => XML correct, associé à un formulaire => OK mais pas à actionner un tag à partir du formulaire:

l'état de mes élucubrations ci dessous!
XML
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="TestRuban_OnLoad">
    <ribbon startFromScratch="false">
         <tabs>
              <tab id="tab1" tag="tab1Tag" label="LabelTab1">
                   <group id="group1" tag="TagGroup1" label="LabelGroup1" screentip="Group1ScreeTip" supertip="Group1Supertip">
                        <button id="button1" tag="Button1Tag" label="LabelButton1" onAction="TestRuban_OnAction" imageMso="DiagramRadialInsertClassic" keytip="B" insertAfterQ="TestRuban_OnAction"/>
                   </group>
                   <group id="group2" label="LabelGroup2" tag="Group2Tag">
                        <button idMso="MasterViewClose"/>
                   </group>
              </tab>
         </tabs>
    </ribbon>
</customUI>

Chargement des rubans

Code :
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
Function LoadRibbons()
Dim i As Integer
Dim db As DAO.Database
Set db = Application.CurrentDb
 
 
For i = 0 To (db.TableDefs.Count - 1)
   If (InStr(1, db.TableDefs(i).Name, "Ribbons")) Then
      Dim rs As DAO.Recordset
      Set rs = CurrentDb.OpenRecordset(db.TableDefs(i).Name)
      rs.MoveFirst
 
        On Error GoTo traiter32609
      While Not rs.EOF
            Application.LoadCustomUI rs("RibbonName").Value, rs("RibbonXml").Value
            rs.MoveNext
      Wend
 
      rs.Close
      Set rs = Nothing
   End If
Next i
 
db.Close
Set db = Nothing
 
Exit Function
traiter32609:
rs.Close
Set rs = Nothing
db.Close
Set db = Nothing
 
End Function
Procédure onLoad :
Code :
1
2
3
4
5
6
7
8
Sub testruban_OnLoad(ribbon As IRibbonUI)
 
    Dum = LoadRibbons()
 
    Set MonRuban = ribbon
    MonRuban.InvalidateControl "button1"
 
End Sub
=> Au passage de
Code :
 MonRuban.InvalidateControl "button1"
, j'obtiens le message "Erreur 424, objet requis"

Merci: calim2:
JFD
JFDAccess est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2010, 20h25   #4
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 939
Points : 6 278
Points : 6 278
Bonsoir,

J'ai essayé le xml de ton ruban.
Access rapporte une erreur sur la ligne :
Code xml :
                        <button id="button1" tag="Button1Tag" label="LabelButton1" onAction="TestRuban_OnAction" imageMso="DiagramRadialInsertClassic" keytip="B" insertAfterQ="TestRuban_OnAction"/>
Elle est due à
Code :
insertAfterQ="TestRuban_OnAction"

Pour être averti des erreurs dans le xml des rubans, aller dans les options d'Access.
Choisir la rubrique «Avancé», et dans la partie droite, sous «Général», cocher l'option «Afficher les erreurs du complément d'interface utilisateur».

Citation:
je ne trouve pas d'exemple "simple" pour manipuler en VBA les rubans une fois créés
C'est parce que ce n'est pas simple.
On ne peut pas modifier un ruban une fois qu'il est chargé.
On ne peut pas décharger un ruban chargé.
La seule chose possible est de jouer avec les fonctions de rappel (CallBacks).
Pour forcer le ruban a appeler des fonctions de rappel, on utilise les méthodes Invalidate et InvalidateControl de l'objet ruban (IRibbonUI) .

Remarque sur le chargement des rubans.
Si tu utilises la table USysRibbons, tu n'as pas besoin de code pour charger les rubans.
Il suffit, dans les propriétés du formulaire (onglet Autres), de sélectionner le nom du ruban.
Le ruban se chargera tout seul à la première ouverture du formulaire.

A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2010, 21h18   #5
Membre à l'essai
 
Homme Jean François Denes
Amateur
Inscription : juin 2010
Messages : 42
Détails du profil
Informations personnelles :
Nom : Homme Jean François Denes
Localisation : France

Informations professionnelles :
Activité : Amateur

Informations forums :
Inscription : juin 2010
Messages : 42
Points : 22
Points : 22
Merci pour l'info sur «Afficher les erreurs du complément d'interface utilisateur».
J'avais développé le XML avec l'assistant ruban de T Gasperment - très pratique - celui-ci ne détectait pas d'erreur!
Par ailleurs, Access ne détecte rien d'anormal chez moi. => Comment devrait-il signaler l'erreur ?
Est-ce que cela explique que je ne puisse faire marcher les méthodes Invalidate et InvalidateControl de l'objet ruban (IRibbonUI). qui sont si j'ai bien compris les méthodes permettant de sélectionner un tag spécifique à partir d'un VBA de formulaire.

Merci,
JFD
JFDAccess est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2010, 19h58   #6
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 939
Points : 6 278
Points : 6 278
Bonjour,

Il s'agit d'une erreur d'exécution (comme pour une division par zéro par exemple).
La syntaxe en elle-même est correcte.

Voici l'erreur que j'ai :
Citation:
Erreur détectée dans le code XML d'interface personnalisée «C:\..\..\bdd.mdb»

Ligne : 5
Colonne : 127
Code d'erreur 0x80004005
ID de contrôle Office inconnu : TestRuban_OnAction
Access cherche un élément ayant pour identifiant "TestRuban_OnAction", mais ne le trouve pas.

Citation:
Est-ce que cela explique que je ne puisse faire marcher les méthodes Invalidate et InvalidateControl de l'objet ruban (IRibbonUI). qui sont si j'ai bien compris les méthodes permettant de sélectionner un tag spécifique à partir d'un VBA de formulaire
Je viens de tester, et malgré l'erreur 0x80004005 ça fonctionne quand même.

Je n'arrive pas à reproduire l'erreur 424.
Sauf si je cliques sur "Réinitialiser" dans l'éditeur Visual Basic.
Si la variable globale MonRuban est réinitialisée on perd le lien avec le ruban.
La seule chose à faire est de fermer la base de données, et de la réouvrir à fin de déclencher l'événement onLoad du ruban.

Essaie avec ce xml.
Dans la table USysRibbons, champ RibbonName = "TestRuban" et champ RibbonXML =
Code xml :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="TestRuban_OnLoad">
    <ribbon startFromScratch="false">
         <tabs>
              <tab id="tab1" tag="tab1Tag" label="LabelTab1" insertBeforeMso="TabHomeAccess" >
                   <group id="group1" tag="TagGroup1" label="LabelGroup1" screentip="Group1ScreeTip" supertip="Group1Supertip">
                        <button id="button1" tag="Button1Tag" getLabel="TestRuban_GetLabel" onAction="TestRuban_OnAction" imageMso="DiagramRadialInsertClassic" keytip="B" />
                        <button id="button2" tag="Button2Tag" label="Invalider Button1" onAction="TestRuban_OnAction" imageMso="RecordsRefreshRecords" />
                   </group>
                   <group id="group2" label="LabelGroup2" tag="Group2Tag">
                        <button idMso="MasterViewClose"/>
                   </group>
              </tab>
         </tabs>
    </ribbon>
</customUI>
Et le code VBA associé au ruban :
Code vba :
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
 
Dim MonRuban As IRibbonUI
 
' -------------------------------------------------------------------
' Fonctions de rappel pour le ruban "TestRuban"
' -------------------------------------------------------------------
 
Sub TestRuban_OnLoad(ribbon As IRibbonUI)
    ' Mémoriser Ruban
    Set MonRuban = ribbon
End Sub
 
' Demande du label d'un contrôle
Sub TestRuban_GetLabel(control As IRibbonControl, ByRef label)
    Select Case control.Id
       Case "button1"
            label = Time
    End Select
End Sub
 
' Bouton appuyé
Sub TestRuban_OnAction(control As IRibbonControl)
    Select Case control.Id
       Case "button1"
            MsgBox "button1"
       Case "button2"
            MonRuban.InvalidateControl "button1"
    End Select
End Sub

Fermer la base de données, puis la réouvrir.

Dans les propriété du formulaire, onglet Autres, sélectionner le nom du ruban : TestRuban.

A l'ouverture du formulaire, le ruban va se charger tout seul.
Lorsqu'on clique sur le bouton 2, il invalide le bouton 1.
Cela génère de la part du ruban, un appel à TestRuban_GetLabel(..) à cause de la présence de
Code :
getLabel="TestRuban_GetLabel"
dans les attributs du bouton 1.

A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/12/2010, 21h56   #7
Membre à l'essai
 
Homme Jean François Denes
Amateur
Inscription : juin 2010
Messages : 42
Détails du profil
Informations personnelles :
Nom : Homme Jean François Denes
Localisation : France

Informations professionnelles :
Activité : Amateur

Informations forums :
Inscription : juin 2010
Messages : 42
Points : 22
Points : 22

Effectivement ça marche!
Merci beaucoup pour cette réponse parfaitement documentée.

Je vais essayer de trouver quelles sont les différences par rapport à ma première mouture.

Par contre je n'arrive pas à faire exécuter l'action
Code :
MonRuban.InvalidateControl "button1"
à partir d'un sub placé comme action d'un bouton du formulaire.

Au début je voulais activer un tag à partir d'un formulaire, mais en fait je pense comprendre que les rubans sont plus faits pour avoir une action d'un ruban vers un formulaire que d'un formulaire vers un ruban.

De toutes façons, gd merci pour cette aide.
JFD
JFDAccess est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2010, 23h34   #8
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 939
Points : 6 278
Points : 6 278
Bonsoir,

La variable MonRuban est hors de portée du module de classe du formulaire.
Tu peux ...
  • La déclarer en Public (à la place de Dim)
  • Ecrire une Sub dans le module de code du ruban :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub TestRuban_InvaliderCtl(sNomCtl As String)
    On Error GoTo ErrH:
    If Not MonRuban Is Nothing Then
       MonRuban.InvalidateControl sNomCtl
    Else
       MsgBox "La variable MonRuban a été reinitialisée et ne pointe plus sur le ruban.", , "Action impossible"
    End If
    Exit Sub
     
    ErrH:
    MsgBox "Erreur No. " & Err.Number & " : " & Err.Description, , "Erreur"
    End Sub
    et appeler la Sub depuis le formulaire :
    Code :
    TestRuban_InvaliderCtl "button1"
J'utilise la deuxième option, ce qui me permet de n'écrire qu'une seule fois ma gestion d'erreurs.

Citation:
Au début je voulais activer un tag à partir d'un formulaire, mais en fait je pense comprendre que les rubans sont plus faits pour avoir une action d'un ruban vers un formulaire que d'un formulaire vers un ruban.
J'utilise majoritairement le ruban comme les anciennes barres d'outils : 1 bouton (ou autre élément) du ruban=> une action.
La mise à jour d'éléments du ruban demande pas mal de code et souvent des variables globales.
C'est pas ce qu'il y a de plus direct.

Si je dois modifier des éléments de mon ruban, en fonction de telle ou telle chose sur mon formulaire, je ne peux pas le faire directement.
Je dois invalider un ou plusieurs contrôles de mon ruban pour déclencher l'appel des fonctions de rappel.
Je ne peux passer aucun argument à ces fonctions de rappels.
Il faut donc que le code du formulaire enregistre certaines infos dans des variables globales, pour que ces informations soient visibles depuis les fonctions de rappel.

C'est vrai aussi dans l'autre sens.
Lorsque quelque chose change sur le ruban (sélection dans une liste déroulante par exemple), le formulaire ne le sait pas et on ne peux pas interroger la valeur d'un élément du ruban.
J'ai donc tout intérêt à mémoriser dans une variable globale la valeur en cours de ma liste déroulante, lorsque le ruban appelle la fonction de rappel correspondant à cet événement.

J'espère ne pas avoir trop noirci le tableau
C'est juste que pour un menu un peu complexe, ça va me prendre quelques dizaines de minutes pour le faire avec un formulaire (utilisé en tant que menu), alors qu'avec le ruban je compterai plutôt en heures.

Bonne continuation.
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/12/2010, 19h06   #9
Membre à l'essai
 
Homme Jean François Denes
Amateur
Inscription : juin 2010
Messages : 42
Détails du profil
Informations personnelles :
Nom : Homme Jean François Denes
Localisation : France

Informations professionnelles :
Activité : Amateur

Informations forums :
Inscription : juin 2010
Messages : 42
Points : 22
Points : 22
Encore Merci pour la qualité des réponses

Puis-je suggérer que lors de la mise à jour d'un des tuto sur les rubans ces conditions d'utilisation soient précisées. Ou peut-être étais-je un peu trop naif -et débutant-
JFDAccess est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h35.


 
 
 
 
Partenaires

Hébergement Web