OVH Cloud OVH Cloud

MenuBars et CommandBars

3 réponses
Avatar
Kamel
Bonsoir,

Pourrait on m'expliquer la différence entre menubar et commandbar ??? (plus
généralement les menus en vb dans excel)

Merci

3 réponses

Avatar
Bob Phillips
Les menus sont un type spécifique de commandbar. Dans VBA, tous sont des
commandbars. Il est juste déterminé par le type de control (commande?).
Par Example, un menu
Sub MenuBar()
On Error Resume Next
Application.CommandBars("Worksheet Menu
Bar").Controls("MonToolBar").Delete
On Error GoTo 0

With Application.CommandBars("Worksheet Menu Bar")
With .Controls.Add(Type:=msoControlPopup)
.BeginGroup = True
.Caption = "myMenu"
With .Controls.Add(Type:=msoControlButton)
.Caption = "Routine1"
.OnAction = "MonMacro1"
End With
With .Controls.Add(Type:=msoControlButton)
.Caption = "Routine2"
.OnAction = "MonMacro2"
End With
End With
End With
End Sub
et un toolbar
Sub ToolBar()
On Error Resume Next
Application.CommandBars("MonToolBar").Delete
On Error GoTo 0

With Application.CommandBars.Add(Name:="MonToolBar", temporary:=True)
With .Controls.Add(Type:=msoControlButton)
.Caption = "Routine1"
.FaceId = 29
.OnAction = "MonMacro1"
End With
With .Controls.Add(Type:=msoControlButton)
.Caption = "Routine2"
.FaceId = 30
.OnAction = "MonMacro2"
End With
.Visible = True
.Position = msoBarTop
End With
End Sub

Voyez aussi

http://support.microsoft.com/kb/166755/fr
XL97 : WE1183 : personnaliser barre de menus, des menus et Élément de menu

--

HTH

RP
(remove nothere from the email address if mailing direct)


"Kamel" wrote in message
news:
Bonsoir,

Pourrait on m'expliquer la différence entre menubar et commandbar ???
(plus

généralement les menus en vb dans excel)

Merci




Avatar
anonymousA
bonjour,

le résultat de mes elucubrations et PARFOIS celles de l'aide de VBA sur
la question si ca peut t'inspirer

Sub TestBoAvecMenus()

'Les constantes possibles de position sont à rechercher dans msoBarPosition
'si on veut créer un commandbar Popup, il faut absolument le déclarer
dans position

'si on veut créer un commandbar de type MenuBar (elle aura des boutons
de fermeture du
'fichier , de restauration, d'agrandissement, il faut le déclarer dans
'MenuBar:=true=> la barre de menus active sera transférée à cette barre
de menus.

'les constantes de type de commandbar sont dans msoBarType et permettent
de savoir
'en testant cette propriété s'il s'agit d'une barre de commande de type
MenuBar (ou 1),
'de type PopUp (ou 2) ou de type Normal (ou 0)

'les commandes de protection sont à choisir dans msoBarProtection et ne
peuvent être
'déclarées que par une instruction
Application.CommandBars("MaBarre").protection=msoBarNoProtection
'p.e

'les commandes de pposition par rapport aux autres barres sont à choisir
dans msoBarRow
'grace à l'instruction
' with MyBar
' .RowIndex = msoBarRowFirst
' .Left = 140
' End With

'on efface la barre de commandes créée si nécessaire
'Attention, on est obligé d'effacer l'intégralité des commandbars que
l'on a crée même celle qui appartiennet
'à la barre de commande MaBArre car elles sont enregistrées comme des
commandbars puisqu'on les
'a nommées comme telles et que le delete de la commandbar principale
auxquelles elles appartiennent
'ne suffisent pas à effacer de la mémoire à tout le moins la désignation
de celles-ci. Elles perdurent au delà
'de la fermeture de la session Excel.
'Ces barres n'apparaissent cependant pas dans la liste des barres d'outils

On Error Resume Next
With Application
.CommandBars("MaBarre").Delete
.CommandBars("Addbar1").Delete
.CommandBars("Addbar11").Delete
End With

Err.Clear
On Error GoTo 0

Dim MyBar As CommandBar

Set MyBar = Application.CommandBars.Add(Name:="MaBarre",
Position:=msoBarFloating, Temporary:=True)

'************************************************************************************
'LES CONTROLES et LA FAMILLE MSOTYPE
'*************************************************************************************

'Ensuite , il faut mettre des controles dans la barre de commandes créée
'si on sait à l'avance la nature des boutons ,c'est mieux de déclarer
'leurs types (CommandBarPopup,CommandBarButton,CommandBarComboBox)
'autrement on peut simplement les déclarer comme CommandBarControl
'et leur affectation dépendra de la définition dans Add par
msocontroltype.Il y en a
'23 types sous Xcel 2000.

'*********************************************************************************
'expression.Add(Type, Id, Parameter, Before, Temporary)

'expression Obligatoire. Expression qui renvoie un objet
CommandBarControls.

'Type:Argument de typeVariant facultatif. Type de contrôle à ajouter à
la barre
'de commandes spécifiée. Il peut s'agir de l'une des constantes
MsoControlType
'suivantes : msoControlButton, msoControlEdit, msoControlDropdown,
msoControlComboBox
'ou msoControlPopup. En fait , on peut en mettre d'autres , voir liste
ci-dessous.

'Id:Argument de type Variant facultatif. Nombre entier qui spécifie un
contrôle
'prédéfini. Si la valeur de l'argument est 1, ou si vous ne spécifiez
pas cet argument,
'un contrôle personnalisé vide du type spécifié sera ajouté à la barre
de commandes.

'Parameter:Argument de type Variant facultatif. Pour les contrôles
prédéfinis, cet
'argument est utilisé par l'application conteneur pour exécuter la
commande. Pour
'les contrôles personnalisés, vous pouvez utiliser cet argument pour
envoyer des
'informations aux macros Visual Basic, ou pour stocker des informations
relatives
'aux contrôles (similaire à une deuxième valeur de la propriété Tag).

'Before:Argument de type Variant facultatif. Numéro qui indique la
position du nouveau
'contrôle dans la barre de commandes. Le nouveau contrôle s'insère avant
celui qui
'occupe déjà cette position dans la barre. Si vous ne spécifiez pas cet
argument,
'le contrôle est ajouté à la fin de la barre de commandes spécifiée.

'Temporary:Argument de type Variant facultatif. Affectez-lui la valeur
True s'il s'agit
'd'un nouveau contrôle temporaire. Les contrôles temporaires sont
automatiquement
'supprimés lors de la fermeture de l'application conteneur. La valeur
par défaut est
'False.
'************************************************************************************

'les controles pour Excel 2000 sans objet

'msoControlCustom (ou 0): réservé à une utilisation ultérieure
'msoControlGenericDropdown(ou 8): réservé à une utilisation ultérieure
'msoControlGraphicPopup (ou 11): réservé à une utilisation ultérieure
'msoControlLabel (ou 15): réservé à une utilisation ultérieure
'msoControlSplitExpandingGrid (ou 17): réservé à une utilisation
ultérieure

'Existe dans les controles intégrés d'Excel

'msoControlButton (ou 1):marche et marche avec OnAction. Un classique
'msoControlEdit(ou 2)marche (rentrer du texte) et marche avec OnAction
'msoControlDropdown (ou 3)marche et ressemble à combobox et marche
avec OnAction
'msocontrolcombobox (ou 4): marche et marche avec OnAction du genre
de "Zoom". Un classique
'msoControlSplitDropdown (ou 6) du genre de "Annuler et rétablir"
'msoControlOCXDropdown(ou 7)du genre quand on clique sur la boite à
outils dans la barre d'outils de controle"
'msoControlPopup (ou 10):marche et marche avec OnAction.Un classique
'msoControlButtonPopup (ou 12):à voir 'du genre PopUp dans la barre
de menus "Dessins" qui active un controle avec des formes dessus
'msoControlSplitButtonPopup(ou 13)'marche mais ne marche pas avec
OnAction.du genre des boutons qui active les couleurs de police ou de
motifs dans les barres de menus "Mise en forme" et "Dessins"
'msoControlSplitButtonMRUPopup(ou 14) ?
'msoControlGrid (ou 18)'du genre de styles de fléches dans la barre
d'outils "Dessins"

'les controles indécis: pas d'exemples dans Excel comme controles
built-in.

'msoControlButtonDropdown(ou 5): à voir
'msoControlGraphicDropdown(ou 9):à voir
'msoControlExpandingGrid (ou 16):à voir
'msoControlGauge (ou 19):à voir
'msoControlGraphicCombo(ou 20):à voir
'msoControlPane (ou 21)
'msocontrolActiveX (ou 22) marche mais ne donne pas grand chose et ne
marche pas avec OnAction

'**************************************************************************************
Dim MyCtrl1 As CommandBarPopup 'CommandBarControl '
Dim MyCtrl11 As CommandBarPopup 'CommandBarControl '
Dim MyCtrl111 As CommandBarButton 'CommandBarControl

Dim MyCtrl2 As CommandBarButton 'CommandBarControl

Dim MyCtrl3 As CommandBarPopup 'CommandBarControl '
Dim MyCtrl31 As CommandBarButton 'CommandBarControl

Dim MyCtrl4 As CommandBarComboBox 'CommandBarControl

Dim MyCtrl5 As CommandBarControl 'CommandBarControl
Dim MyCtrl6 As CommandBarControl 'CommandBarControl

'*******************************************************************************************
'Pour les propriétés des objets controls
CommandBarPopup,CommandBarButton,CommandBarComboBox,
'Voir dans l'aide
'*******************************************************************************************

'*******************************************************************************************
'Il existe une procédure evenementielle Click pour CommandBarButton et
une procédure evenementielle
'Change pour un CommandBarComboBox.Voir l'aide pour celà.
'*******************************************************************************************

'Il est possible de faire un OnAction sur les 3 types de controles .
Voir MyCtrl3


Set MyCtrl1 = MyBar.Controls.Add(msoControlPopup, , , , True)
With MyCtrl1
.CommandBar.Name = "Addbar1" 'on peut définir un nom de commandbar
car c'est un controle PopUp. ceci n'est

'pas possible pour une controlbutton.Attention, voir plus haut pour la
destruction obligatoire
.Caption = "MyCtr&l1" 'la légende du bouton. dans le cas d'un Popup
'pas nécessaire de mettre le style. Par
défaut , la légende
'y est avec la flèche symbolisant le PopUp
' 1er menu
End With
MsgBox MyCtrl1.CommandBar.Name
Set MyCtrl11 = MyCtrl1.Controls.Add(msoControlPopup, , , , True)
With MyCtrl11
.CommandBar.Name = "Addbar11" 'Attention, voir plus haut pour la
destruction obligatoire
.Caption = "MyCt&rl11"
' 1er ss menu
End With

Set MyCtrl111 = MyCtrl11.Controls.Add(msoControlButton, , , , True)
With MyCtrl111

.Caption = "MyCtrl111"
.OnAction = "procMyCtrl111"

' 1er ss ss menu
' => Exécution de la macro "procMyCtrl111"
End With


Set MyCtrl2 = MyBar.Controls.Add(msoControlButton, , , , True)
With MyCtrl2
.Caption = "M&yCtrl2" 'la légende du bouton
.OnAction = "procMyCtrl2" 'procédure attachée au bouton
.Width = 50 'largeur du bouton
.Style = msoButtonIconAndCaption 'msoButtonCaption 'le style du
bouton. Si on veut la légende, il faut celui-ci ou
'l'un des 5
autres,msoButtonIconAndCaption,msoButtonIconAndCaptionBelow,msoButtonIconAndWrapCaption,msoButtonIconAndWrapCaptionBelow,msoButtonWrapCaption
' Ceci n'est valable que pour les 1ers boutons de la barre des
menus. la légende des sous-boutons
'des menus PopUp apparaissent par défaut même sans préciser style.
.FaceId = 512 'l'icone du bouton mais qu'on ne verra que si style
a été défini à msoButtonIcon ou à msoButtonIconAndCaption
End With

Set MyCtrl3 = MyBar.Controls.Add(msoControlPopup, , , , True)
With MyCtrl3
.Caption = "MyCtr&l3"
.OnAction = "procMyCtrl3"
End With

Set MyCtrl31 = MyCtrl3.Controls.Add(msoControlButton, , , , True)
With MyCtrl31
.Caption = "&MyCtrl31"
.OnAction = "procMyCtrl31"
End With

Set MyCtrl4 = MyBar.Controls.Add(msoControlComboBox, , , , True)
With MyCtrl4
.Caption = "MyCtr&l4"
.Width = 170
.DropDownLines = 0 'nbre de lignes du combobox. Si 0, s'adapte
automatiquement à la taille de la source
.DropDownWidth = -1 'largeur du combobox. Si -1, s'adapte
automatiquement à la taille du plus grand élement de la source
.ListHeaderCount = 0 'nbre de lignes du combobox au dessus de la
ligne de séparation. Si -1, pas de ligne de séparation
.Clear
'si on veut rentrer des données dans le combobox après les avoir épurés
des doublons
'et triés, on passe par un tableau et on rentre les données du tableau
dans le combobox
' Crtlnb = 1
' For i = 1 To fullline
' .AddItem Text:=TABDATE(i), Index:=Crtlnb
' Crtlnb = Crtlnb + 1
' Next
For Each c In Range("A2:I1000") 'pas possible d'envoyer une
variable tableau
.AddItem c.Value 'ni de remplir comme un combo
classique par un Array
Next
.OnAction = "procMyCtrl4"
End With

'Dans le cas de bouton de commandes non standard donc différents de
msoControlButton,
'msoControlPopup ou msoControlComboBox, il faut déclarer un ID
référencé existant
'dans Excel coincidant avec le msocontroltype que l'on a porté. Ceci
dit, la déclaration
'du msocontroltype est superfétatoire si on déclare le N° d'ID qui
convient. Dans l'
'exemple suivant déclarer est suffisant. Nul besoin de
déclarer msoControlSplitButtonPopup

Set MyCtrl5 = MyBar.Controls.Add(, 401, , , True)
With MyCtrl5
.Caption = "MyCtr&l5"
'.OnAction = "procMyCtrl5"
End With

Set MyCtrl6 = MyBar.Controls.Add(msoControlSplitButtonPopup, 1691, ,
, True)
With MyCtrl6
.Caption = "MyCtr&l6"
'.OnAction = "procMyCtrl5"
End With

MyBar.Visible = True

End Sub
Sub procMyCtrl111()

'MsgBox "c'est la procédure déclenchée par MyCtrl111 "

'MsgBox
CommandBars.ActionControl.Parent.Parent.Parent.Controls(1).Caption 'on
obtient ici MyCtrl11

'semble suivre un loi impaire (1,3,5...)

'Il suffit donc de stipuler dans les déclarations des controles PoUp
pères un nom de barre de commande
'propriété Commandbar.name pour être assuré de connaitre la chaine
totale des contrôles.

'dans le cas suivant, on obtient le nom de la barre de commandes
personnalisée hiérarchique au 1er degré
'MsgBox CommandBars.ActionControl.Parent.Name 'ici on obtient Addbar11
donc cf déclaration dans TestBoavecmenus on sait qu'ils'agit du controle
Ctrl11
''dans le cas suivant, on obtient le nom de la barre de commandes
personnalisée hiérarchqiue au 2nd degré
'MsgBox CommandBars.ActionControl.Parent.Parent.ParentName 'ici on
obtient Addbar donc cf déclaration dans TestBoavecmenus on sait
qu'ils'agit du controle Ctrl1
''dans le cas suivant, on obtient le nom de la barre de commandes
personnalisée hiérarchqiue au 3eme degré
'MsgBox
CommandBars.ActionControl.Parent.Parent.Parent.Parent.Parent.Name ' on
obtient ici MaBarre
'
'MsgBox
CommandBars.ActionControl.Parent.Parent.Parent.Parent.Parent.Controls(1).Caption
'on obtient ici MyCtrl1

'***************************************************************************************************************************************
'Méthode pour retrouver toute la chaine hiérarchique d'un controle
'Cette chaine suit une loi 1,3,5 ce qui implique le Parent.Parent pour
retrouver le controle de niveau hiérarchique
'supérieur sauf le premeir pour lesquel un. Parent suffit
'***************************************************************************************************************************************
On Error Resume Next

Set ctrlparent = CommandBars.ActionControl.Parent

Do While Not ctrlparent.Name = "Microsoft Excel" 'on remonte jusqu'à
l'objet Parent de + haut niveau qui est evidemment Excel
MsgBox ctrlparent.Name
If Err.Number <> 0 Then
Err.Clear
Exit Do
End If
Set ctrlparent = ctrlparent.Parent.Parent
Loop

'si on veut connaitre des infos sur le controle hiérarchique supérieur,
il faut seulement déclarer .controls(1) car evidemment
'le controle supérieur est forcément seul, soit c'est un msobutton et
cette propriété ne lui permet pas d'avoir des controles fils
'soit c'est un control msopopup et si la proriété CommanBar.name lui a
été assignée , ce qu'il conveinet de faire en tout
'état de cause pour le discriminer , il n'a aussi lui-même qu'un controle.


End Sub
Sub procMyCtrl2()

MsgBox "c'est la procédure déclenchée par MyCtrl2 "

On Error Resume Next

Set ctrlparent = CommandBars.ActionControl.Parent

Do While Not ctrlparent.Name = "Microsoft Excel" 'on remonte jusqu'à
l'objet Parent de + haut niveau qui est evidemment Excel
MsgBox ctrlparent.Name
If Err.Number <> 0 Then
Err.Clear
Exit Do
End If
Set ctrlparent = ctrlparent.Parent.Parent
Loop

End Sub
Sub procMyCtrl3()

'pour tester le OnAction sur un controle de type PopUp. On change le nom
du sous
'controle du bouton Ctrl3. On voit qu'on peut faire tourner une
procédure (tampon=2*3)
'Ceci dit, si on fait perdre le focus à Ctrl3 en faisan tourner la procédure
'p.e ne affichant un msgbox ou un userform ou en activant autre chose,
le sous-menu
'associé à Ctrl3 ne sera pas affiché

tampon = 2 * 3

If
Application.CommandBars("MaBarre").Controls("&MyCtrl3").Controls(1).Caption
= "&MyCtrl31modif" Then
Application.CommandBars("MaBarre").Controls("&MyCtrl3").Controls(1).Caption
= "&MyCtrl31"
Else
Application.CommandBars("MaBarre").Controls("&MyCtrl3").Controls(1).Caption
= "&MyCtrl31modif"
End If

End Sub
Sub procMyCtrl31()

'suite au changement de nom dans procMyCtrl3, il faut remettre l'ancien
nom du sous controle

MsgBox "c'est la procédure déclenchée par MyCtrl31 "
MsgBox tampon
MsgBox
Application.CommandBars("MaBarre").Controls("&MyCtrl3").Controls(1).Caption

End Sub
Sub procMyCtrl4()

MsgBox "c'est la procédure déclenchée par MyCtrl4 "

With Application.CommandBars("MaBarre").Controls("MyCtr&l4")
essai = .List(.ListIndex)
End With

'si on a mis dans le combobox une relation avec un range et qu'on veut
'retrouver dans ce dernier la valeur qu'on a cliquée dans le combobox
'en ayant défini la plage de recherche par set plage=range(hhhh)

'plage.Find(What:=essai, LookIn:=xlFormulas, LookAt:=xlWhole,
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:úlse).Activate

MsgBox essai

End Sub
Sub procMyCtrl5()

MsgBox "c'est la procédure déclenchée par MyCtrl5 "

End Sub

Sub procMyCtrl6()

'si on veut obtenir le nom du controle parent et celui du controle ou de
la barre parente

MsgBox CommandBars.ActionControl.Parent.Parent.Parent.Controls(1).Caption
MsgBox
CommandBars.ActionControl.Parent.Parent.Parent.Parent.Parent.Controls(1).Caption


End Sub

A+

Bonsoir,

Pourrait on m'expliquer la différence entre menubar et commandbar ??? (plus
généralement les menus en vb dans excel)

Merci




Avatar
MichDenis
Bonjour Kamel,

Le concept "menubar" est associé au programme "visual Basic". Dans VBA ( visual basic for application ), on doit se référer à la
collection "CommandBars" qui regroupent toutes les barres d'outils et de menus d'excel

Dans la feuille de calcul, la barre des menus représente l'item no 1 de la collection.

Msgbox Application.CommandBars(1).Name

Ou

Msgbox Application.CommandBars("Worksheet Menu bar").name


Dans l'éditeur de programation, je t'invite à consulter l'explorateur d'objets qui te fera mieux comprendre le "modèle objet"
d'excel et des autres applications microsoft.


Salutations!



"Kamel" a écrit dans le message de news:
Bonsoir,

Pourrait on m'expliquer la différence entre menubar et commandbar ??? (plus
généralement les menus en vb dans excel)

Merci