Votre question

VBA Types de contrôles/Events

Tags :
  • Index
  • Programmation
Dernière réponse : dans Programmation
Anonyme
9 Avril 2010 02:31:26

Bonjour,
Je voudrais afficher les Barres de commandes ainsi que leurs controles avec ce code :

  1. Sub ListerBarres()
  2. Dim cbar As CommandBar
  3. Dim Ctrl As CommandBarControl
  4. Cells(1, 1) = "Nom de la barre d'outils"
  5. Cells(1, 2) = "Nom local de la barre d'outils"
  6. Cells(1, 3) = "Index"
  7. Cells(1, 4) = "Type"
  8.  
  9.  
  10. For Each cbar In Application.CommandBars
  11. x = x + 1
  12. Cells(1, 1).Offset(x, 0) = cbar.Name
  13. Cells(1, 2).Offset(x, 0) = cbar.NameLocal
  14. Cells(1, 3).Offset(x, 0) = cbar.Index
  15. Cells(1, 4).Offset(x, 0) = cbar.Type
  16. For Each Ctrl In Application.CommandBars(cbar.Index).Controls
  17. x = x + 1
  18. Cells(1, 2).Offset(x, 0) = Ctrl.Caption
  19. Cells(1, 3).Offset(x, 0) = Ctrl.Index
  20. Cells(1, 4).Offset(x, 0) = Ctrl.ID
  21. Cells(1, 5).Offset(x, 0) = Ctrl.Type
  22. Next
  23. Next
  24. End Sub


Le problème est que le Type est un indice, et MsoBar/ControlType n'est pas un vrais enum, donc pas de For Each ni MsoBarType(index), j'aimerais récupérer le nom du type des barres et des contrôles en toutes lettres, existe t'il un moyen à part une suite infinie de IF ?

D'ailleurs si l'on ne peut réorganiser ni les onglets ni les contrôles à quoi cela sert-il ? Peut on accéder aux évènements soulevées par les contrôles à travers CommandeBar(index).Controls(index) ?

J'en profite pour parler d'un deuxiéme probléme, j'ai ce code là :

  1. Option Explicit
  2. Dim clsCBClass As New clsCBEvents
  3.  
  4. Sub InitEvents()
  5. Dim cbrBar As Office.CommandBar
  6.  
  7. Set cbrBar = CommandBars(11) ' ("Formatting")
  8. With cbrBar
  9. Set clsCBClass.cmdBold = .Controls(3) ' ("Bold")
  10. ' Set clsCBClass.cmdItalic = .Controls("&Italic")
  11. ' Set clsCBClass.cmdUnderline = .Controls("Underline")
  12. ' Set clsCBClass.cboFontSize = .Controls("&Font Size:")
  13. End With
  14. Set clsCBClass.colCBars = CommandBars
  15. End Sub


Module de classe clsCBEvents:
  1. Public WithEvents colCBars As Office.CommandBars
  2. Public WithEvents cmdBold As Office.CommandBarButton
  3. Public WithEvents cmdItalic As Office.CommandBarButton
  4. Public WithEvents cmdUnderline As Office.CommandBarButton
  5. Public WithEvents cboFontSize As Office.CommandBarComboBox
  6.  
  7.  
  8. Private Sub cboFontSize_Change(ByVal Ctrl As Office.CommandBarComboBox)
  9. MsgBox ("Mourf !")
  10. End Sub
  11.  
  12. Private Sub cmdBold_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
  13. MsgBox ("Mourf !")
  14. End Sub
  15.  
  16. Private Sub cmdItalic_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
  17. MsgBox ("Mourf !")
  18. End Sub
  19.  
  20. Private Sub cmdUnderline_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
  21. MsgBox ("Mourf !")
  22. End Sub
  23.  
  24. 'Private Sub colCBars_OnUpdate()
  25. ' MsgBox ("Mourf !")
  26. 'End Sub


Ce qui est hallucinant c'est que colCBars_OnUpdate() est bien soulevée mais pas les autres !
Où est mon erreur ?

Merci d'avance !

Autres pages sur : vba types controles events

Anonyme
10 Avril 2010 00:46:27

Mini Up ?
m
0
l
a c 232 L Programmation
10 Avril 2010 13:23:20

Salut,

Pour avoir le nom en fonction du type:
  1. Function CBGetCBType(cbrBar As CommandBar) As String
  2. ' Returns a string representing the command bar type.
  3.  
  4. Dim strCBType As String
  5.  
  6. Select Case cbrBar.Type
  7. Case msoBarTypeNormal
  8. strCBType = "Toolbar"
  9. Case msoBarTypeMenuBar
  10. strCBType = "Menu bar"
  11. Case msoBarTypePopup
  12. strCBType = "Popup menu"
  13. End Select
  14. CBGetCBType = strCBType
  15. End Function


Je n'ai pas trop compris ton 2è problème.
m
0
l
Contenus similaires
Pas de réponse à votre question ? Demandez !
11 Avril 2010 01:05:37

(Oui, surtout que dans le code que tu nous donne la méthode est commentée!)
m
0
l
Anonyme
11 Avril 2010 11:48:30

Bonjour,
Merci pour la fonction OmaR, grâce à son nom j'ai réussi à trouver sa petite soeur pour les contrôles :ange: 

Rakipu a dit :
(Oui, surtout que dans le code que tu nous donne la méthode est commentée!)


Et oui en effet, je suis désolé j'ai fais quelques test avant de venir ici, pour ne pas dire n'importe quoi ( :whistle:  ), donc voici le code :

Anonyme a dit :

  1. Option Explicit
  2. Dim clsCBClass As New clsCBEvents
  3.  
  4. Sub InitEvents()
  5. Dim cbrBar As Office.CommandBar
  6.  
  7. Set cbrBar = CommandBars(11) ' ("Formatting")
  8. With cbrBar
  9. Set clsCBClass.cmdBold = .Controls(3) ' ("Bold")
  10. Set clsCBClass.cmdItalic = .Controls("&Italic")
  11. Set clsCBClass.cmdUnderline = .Controls("Underline")
  12. Set clsCBClass.cboFontSize = .Controls("&Font Size:")
  13. End With
  14. Set clsCBClass.colCBars = CommandBars
  15. End Sub


Module de classe clsCBEvents:
  1. Public WithEvents colCBars As Office.CommandBars
  2. Public WithEvents cmdBold As Office.CommandBarButton
  3. Public WithEvents cmdItalic As Office.CommandBarButton
  4. Public WithEvents cmdUnderline As Office.CommandBarButton
  5. Public WithEvents cboFontSize As Office.CommandBarComboBox
  6.  
  7.  
  8. Private Sub cboFontSize_Change(ByVal Ctrl As Office.CommandBarComboBox)
  9. MsgBox ("Mourf !")
  10. End Sub
  11.  
  12. Private Sub cmdBold_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
  13. MsgBox ("Mourf !")
  14. End Sub
  15.  
  16. Private Sub cmdItalic_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
  17. MsgBox ("Mourf !")
  18. End Sub
  19.  
  20. Private Sub cmdUnderline_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
  21. MsgBox ("Mourf !")
  22. End Sub
  23.  
  24. Private Sub colCBars_OnUpdate()
  25. MsgBox ("Mourf !")
  26. End Sub



Le résultat obtenu, colCBars_OnUpdate() est bien appelée (trop bien même), alors que, lorsque je la commente et que j'appuie sur mettre en gras, souligner etc ... rien pas de MsgBox ...
m
0
l
a c 232 L Programmation
11 Avril 2010 14:01:40

Essaie de regarder cette KB:
http://support.microsoft.com/kb/826931

Il semblerait qu'il faille juste définir une valeur à l'élément Tag de ton bouton.
m
0
l
Anonyme
11 Avril 2010 15:33:48

J'ai essayé et ça n'a pas marché... Mais je me pose une question est-ce que mon code marche chez quelqu'un ? Et est-il possible que puisqu'on ne peut plus toucher aux commandbar dans Office2007, on ne peut accéder à leurs évents ? Ainsi les objets définis par WithEvents sont forcement de nouveaux objets avec leurs propres évènements indépendants ? Et comme j'essaye d'acceder à la commandbar 11 ("Formatting"), je n'y ai pas droit donc les objets crées sont forcement indépendant ?
Du délire ?
Comment-est ce que vous faites pour handler l'évènement d'un bouton en VBA ?

EDIT : Je viens de tester ce code :
  1. Sub InitEvents()
  2. Dim cbrBar As CommandBar
  3.  
  4. Set cbrBar = CommandBars(11)
  5. With cbrBar
  6. Set clsCBClass.cmdBold = CommandBars("Perso").Controls(1)
  7. Set clsCBClass.cmdItalic = .Controls("&Italic")
  8. Set clsCBClass.cmdUnderline = .Controls("Underline")
  9. Set clsCBClass.cboFontSize = .Controls("&Font Size:")
  10. End With
  11. Set clsCBClass.colCBars = CommandBars
  12. End Sub


Les évènements de mon bouton perso sont bien soulevées, pourtant le code est le même ( le Tag ne change rien).

Quel qu'un a des infos là dessus ?
m
0
l
a c 232 L Programmation
11 Avril 2010 17:04:53

Essaie de t'inscrire à l'évènement sinon, je suppose que c'est comme ça (désolé je fais pas de VBA :) ):
  1. AddHandler cmdBold.Click, AddressOf cmdBold_Click

m
0
l
Anonyme
11 Avril 2010 17:38:22

Moi non plus c'est bien cela le problème xD

"Hi,
I've got bad news for you..
VBA (and VB6) doesn't support multievent handling.. You can not handle multiple events by one procedure and you can not use multiple handlers on one event.. This is possible in VB.NET with AddHandler and RemoveHandler..
VB6 could help you in this case, when you make your checkboxes dynamically and give them the same name and different indexes.. In this case, you can have one handling sub, BUT VBA in excel doesn't support indexes for controls, as VB6 does.. :( "

Source : http://www.programmersheaven.com/mb/vba/323244/323244/c...

Moi qui pensais que VB6 mourrait avec le la sortie du .NET 3.5 ... On ouvre Office 2010 et... surprise IDE n'a pas changé d'un poil ^^

Bon je pense que l'on peut en conclure qu'il est impossible sous Office 2007 (par conséquent 2010 ?) en VBA de modifier/cacher/supprimer les CommandBar qui sont accéssibles que par VSTO et handler les événements des Contrôles sur les quels on a plus la main ...

Le VBA est mort vive le VSTO !

Merci pour votre aide !
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS