[Excel VBA]Probleme de creation de barres

Résolu/Fermé
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 - 17 août 2006 à 17:30
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 - 21 août 2006 à 14:52
Salut, je voudrais creer une fonction qui au chargement va creer une barre avec des boutons, et chacun de ces boutons lance une macro. j'ai deja essaye plusieurs facons de faire, trouvees sur le net, mais a chaque fois c'est la ligne contenant la commande de la creation de la barre qui bloque le processus. voila ou j'en suis au moment actuel :

Sub NewBar_Open()
CommandBars.Add(Name:="BarPerso", Position:=msoBarFloating)
cbar1.Visible = True
cbar1.Controls.Add Type:=msoControlButton, Before:=1

With CommandBars("BarPerso")
.Left = 620
.Top = 450
.Width = 120
End With
End Sub

Private Sub exec_Click()
End Sub

le 1er sub contient le _Open (d'apres le fichier help de l'editeur vb) pour s'executer a l'ouverture du classeur. le 2eme sub est la macro a executer et exec est le nom du bouton (fictif) et _Click (toujours d'apre le fichier d'aide) est l'evenement quand on clique sur le bouton.

il n'y a qu'une seule ligne pour un seul bouton car j'ai deja du mal a faire une barre avec un seul bouton, alors une creation dynamique de boutons.....

bref, si quelq'un pourrait m'aider ce serait vraiment sympa, et merci d'avance.

23 réponses

ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
17 août 2006 à 17:41
salut, et.....j'adore ta signature XD

hum, revenons a nos moutons...un formulaire tu dis? comment ca?
0
balou311 Messages postés 765 Date d'inscription mardi 1 février 2005 Statut Membre Dernière intervention 21 septembre 2006 87
17 août 2006 à 17:45
Ben un formulaire sous visual basic tu peux faire des formulaire en excel un peu comme quand tu les fais sous access

PS: moi aussi j'adore ma signature et c'est tellement vrai....
0
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
17 août 2006 à 17:48
o_o

oki, je commence dans vba la, alors je vois pas le genre de formulaires que tu pe avoir et surtout, je ne vois pas comment tu peu reemplacer une commandbar par un formulaire....

pourrais-tu preciser ta pensée s'il te plait?
0
balou311 Messages postés 765 Date d'inscription mardi 1 février 2005 Statut Membre Dernière intervention 21 septembre 2006 87
17 août 2006 à 17:56
Ben ce que je veux dire c'est que au lieu de faire un command bar tu fais un formulaire.
c'est à dire que ton formulaire aura des boutons qui lancerons tes macro...
je pense que tu te prendras moins la tête

c'est plus clair?
0
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
17 août 2006 à 18:00
euh, vi, je vois ce que tu veux dire maintenant, mais, j'ai deja fait cela et on me demande des boutons dans une commandbar a la place ^^; (et en plus j'ai pris la peine de faire une bonne presentantion des boutons T_T)...donc la je dois me prendre la tete, comme tu dis ^^;
0
balou311 Messages postés 765 Date d'inscription mardi 1 février 2005 Statut Membre Dernière intervention 21 septembre 2006 87
17 août 2006 à 18:07
Ah ok désolé

et bien je ne pourrais pas plus t'aider alors

bonne chance et bon courage
0
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
17 août 2006 à 18:10
oki, merci comme meme ^^
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Armojax Messages postés 1860 Date d'inscription mercredi 19 janvier 2005 Statut Membre Dernière intervention 2 octobre 2024 1 528
18 août 2006 à 07:54
Il est passé par ici, il repassera par là... (air connu).

Pourquoi tiens-tu à créer dynamiquement ta barre d'outils ? Tu peux parfaitement te la faire à la main, tranquillement. Il y a dans Excel quantités de barres d'outils qui sont en attente (Dessin, Protection, Graphique, Wordart, etc.). On les affiche quand on en a besoin, et sinon elles restent masquées.
A l'ouverture, tu l'affiches, et à la fermeture tu la masques.
Application.CommandBars("MaBarre").Visible = True/False
Pourquoi te compliquer la vie ?
0
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
18 août 2006 à 09:38
ah, salut.....again ^^;

euh, je n'essaie pas de me compliquer la vie, c'est mes superiurs qui la compliquent pour moi ^^;
s'ile me disent de faire ceci, alors je dois le faire coute que coute ^^;

enfin, pour le moment je n'ai qu'une seule macro : celle que tu m'a aide a faire (il a pas aimé le bouton sur une des feuilles u_u;). mais je cherche a faire une qui en fait autant que necessaire en prevision de futures macros ^^, pour le moment j'ai essaye d'avoir juste une fonction qui se lancerait au chargement du classeur et qui creerait le bouton necessaire, une fois que j'aurais compris le fonctionnement, j'avais prevu de faire une fnction a qui on passait des argument et qui crééerais des boutons en foction des arguments qui lui sont donés. les arguments seraient :
nom du bouton , macro liée, position du bouton [pas necessaire].

pour le moment, rien qu'une macro qui crééérais le bouton pour la macro consolidation au chargement du classeur serait bien, apres j'aurais assez de temps pour essaier de trouver par moi meme une facon d'ameliorer la macro ^^;
0
Armojax Messages postés 1860 Date d'inscription mercredi 19 janvier 2005 Statut Membre Dernière intervention 2 octobre 2024 1 528
18 août 2006 à 10:22
Essaie ce genre de petit truc...
Sub CréeBarreOutils()

  On Error Resume Next
  CommandBars("MaBarre").Delete
  On Error GoTo 0
  
  With CommandBars.Add(Name:="MaBarre")
  
    With .Controls.Add(Type:=msoControlButton)
      .OnAction = "MaMacro"                     ' macro à lancer
      .FaceId = 2600                            ' modèle de bouton
      .TooltipText = "Ça fait ci"               ' info bulle
    End With
  
    With .Controls.Add(Type:=msoControlPopup)
      .Caption = "Autre façon de faire"
      .TooltipText = "Texte qu'on veut"
      With .Controls.Add(msoControlButton)
        .TooltipText = "Ça fait ca"             ' info bulle
        .FaceId = 2600                          ' modèle de bouton
        .OnAction = "MonAutreMacro"             ' macro à lancer
        .Caption = "Lancement"                  ' texte de la ligne
      End With
    End With
    
    .Visible = True
  End With
  
End Sub
Sub MaMacro()
  MsgBox "Ça marche !"
End Sub
Sub MonAutreMacro()
  MsgBox "Ça marche aussi!"
End Sub
0
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
18 août 2006 à 11:44
hoooo, je vois que j'ai encore du chemin a faire avant de pouvoir sortir des idees dans ce genre : je n'avais pas pense a utiliser les infobulles pour decrire les actions du bouton ^^;

en tout cas ca marche tel quel, il faut juste que je l'adapte maintenant...

pendant que j'y suis, je voulais savoir si c'est possible de faire une commande qui cherche toutes les macros et met leurs noms dans un tableau? je veux dire, je ne me souviens pas d'avoir vu ce genre de fonctions ou meme de comparateur dans le genre iffunction()...
0
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
18 août 2006 à 12:13
oki....j'ai essaye d'adapter le code pour faire des boutons et barre dynamiquement. mais, comme il y a toujours un "mais", meme s'il ne me dit pas que j'ai des erreurs dans le code, il ne cree aucune barre....

voici le code changé :

Private Sub CréeBarreOutils__Initialize()

Dim cbar As String
Dim mac As String
Dim lab As String
cbar = ""
Sheets("listeMacros").Activate
c = 1
r = 1
Tr = Feuille.Cells(65536, 1).End(xlUp).Row
For r = 1 To Tr
If Cells(r, c).Value <> "" And Cells(r, c).Value <> cbar Then
cbar = Cells(r, c).Value
mac = Cells(r, c + 1).Value
lab = Cells(r, c + 2).Value
On Error Resume Next
CommandBars(cbar).Delete
On Error GoTo 0

With CommandBars.Add(Name:=cbar)
createcbar
.Visible = True
End With
Next
End Sub
Sub createcbar(mac, lab)
With .Controls.Add(Type:=msoControlButton)
.OnAction = mac ' macro à lancer
.FaceId = 2600 ' modèle de bouton
.TooltipText = lab ' info bulle
End With

With .Controls.Add(Type:=msoControlPopup)
.Caption = "Autre façon de faire"
.TooltipText = "Blabla"
With .Controls.Add(msoControlButton)
.TooltipText = lab ' info bulle
.FaceId = 2600 ' modèle de bouton
.OnAction = mac ' macro à lancer
.Caption = lab ' texte de la ligne
End With
End With
End Sub
Sub MaMacro()
MsgBox "Ça marche !"
End Sub
Sub MonAutreMacro()
MsgBox "Ça marche aussi!"
End Sub

la feuille listeMacros contiens un tableau de r(rows) x 3(columns) avec l'ordre suivant : nom de la barre/nom de la macro/libellé. ce que j'ai essaye de faire c'est que le programme verifie le nom de la barre et tant que le nom est le meme il lui ajoute le bouton de la macro correspondante avec le libellé correspondant.
0
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
18 août 2006 à 12:19
hmmmm, en attendant de finir cette macro, j'ai adapté celle que tu m'a donnée Armojax :

Sub CBO()

On Error Resume Next
CommandBars("BarrePerso").Delete
On Error GoTo 0

With CommandBars.Add(Name:="BarrePerso")

With .Controls.Add(Type:=msoControlButton)
.OnAction = "Lancement" ' macro à lancer
.FaceId = 2600 ' modèle de bouton
.TooltipText = "Consolidation" ' info bulle
End With
.Visible = True
End With

End Sub

et ici aussi il y a un petit probleme : la macro marche tres bien si je la lance avec un raccourci ou depuis le menu des macros, mais comme j'ai besoin que la barre soit créée a l'ouverture du fichier, je n'ai pas reussi a trouver le moyen de faire lancer la macro a l'ouverture. quelqu'un aurait une idee dessus?
0
Armojax Messages postés 1860 Date d'inscription mercredi 19 janvier 2005 Statut Membre Dernière intervention 2 octobre 2024 1 528
18 août 2006 à 12:29
Mets le lancement de ta macro à l'ouverture de ton classeur :
Private Sub Workbook_Open()
  ==   ici le lancement  ==
End Sub
Cette macro se situe non pas dans un module standard, mais dans le code associé à ThisWorkbook (au-dessus des modules dans l'Explorateur de Projets).
0
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
18 août 2006 à 12:44
oki, merci encore Armojax, j'ai bien essaye d'utiliser _Open, mais je le mettais dans le module, m'etonne plus qu'il a pas marche ¬_¬

en ce qui concerne la creation dynamique des barres, j'ai verifie au pas a pas et l'erreur se situerais ici :

Private Sub CréeBarreOutils__Initialize()

Dim cbar As String
Dim mac As String
Dim lab As String
cbar = ""
Sheets("listeMacros").Activate
c = 1
r = 1
Tr = Feuille.Cells(65536, 1).End(xlUp).Row
For r = 1 To Tr
If Cells(r, c).Value <> "" And Cells(r, c).Value <> cbar Then
cbar = Cells(r, c).Value
mac = Cells(r, c + 1).Value
lab = Cells(r, c + 2).Value
On Error Resume Next
CommandBars(cbar).Delete
On Error GoTo 0

With CommandBars.Add(Name:=cbar)
createcbar <==
.Visible = True
End With
Next
End Sub

jusque la je n'ai vu que comment appeler une macro depui une autre macro, mais je n'ai pas eu besoin de passer des arguments jusque la, or la macro createbar a besoin de 2 arguments mac et lab. j'ai essaye de mettre createbar(mac, lab) mais a ce moment il me dit qu'il me manque ":=" quelque part....ce que je n'ai pas compris mac et lab font reference au nom de la macro et au libbele de la macro dans creebarreoutils, pareil pour createbar. est-ce que le conflit viendrais du fait que les variables ont le meme nom?
0
Armojax Messages postés 1860 Date d'inscription mercredi 19 janvier 2005 Statut Membre Dernière intervention 2 octobre 2024 1 528
18 août 2006 à 15:28
Voilà un test que j'ai fait. Dans la feuille listeMacros, j'ai en colonnes A, B, C, D :
Nom-barre Nom-macro Libellé-barre N°-bouton
B1        Macro1    La Une        483
B1        Macro2    La Deux       481
B1        Macro3    La Trois      482
B1        Macro4    La Quatre     484
B2        Macro5    La Cinq        59
B2        Macro6    La Six        276
Essaie ce petit code :
Sub CréeBarreOutils()

  Dim I         As Long
  Dim Barre     As String
  Dim Macro     As String
  Dim Libellé   As String
  Dim Bouton    As Long
  
  Worksheets("listeMacros").Activate
  
  I = 2
  Do While Cells(I, 1).Value <> ""
    Barre = Cells(I, 1).Value
    
    On Error Resume Next
    CommandBars(Barre).Delete
    On Error GoTo 0
    
    With CommandBars.Add(Name:=Barre)
      Do
        Macro = Cells(I, 2).Value
        Libellé = Cells(I, 3).Value
        Bouton = Cells(I, 4).Value
        With .Controls.Add(Type:=msoControlButton)
          .OnAction = Macro
          .FaceId = Bouton
          .TooltipText = Libellé
          .Caption = Libellé
        End With
        I = I + 1
      Loop While Cells(I, 1) = Barre
      .Visible = True
    End With
  Loop
  
End Sub
Sub Macro1()
  MsgBox "OK1"
End Sub
Sub Macro2()
  MsgBox "OK2"
End Sub
Sub Macro3()
  MsgBox "OK3"
End Sub
Sub Macro4()
  MsgBox "OK4"
End Sub
Sub Macro5()
  MsgBox "OK5"
End Sub
Sub Macro6()
  MsgBox "OK6"
End Sub
0
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
18 août 2006 à 15:42
hum, je vois a peu pres ce que tu fais, mais :
1. comment je pourrais savoir le n° des boutons
2. j'ai pas pensé a ca avant, mais est-ce qu'il y a une commande qui deplacera la barre nouvellement cree a coté des autres barres en haut, (de preference apres la derniere barre dockée pour les retrouver plus facilement)?
0
Armojax Messages postés 1860 Date d'inscription mercredi 19 janvier 2005 Statut Membre Dernière intervention 2 octobre 2024 1 528
18 août 2006 à 15:52
Pour les boutons, tu peux soit les fariquer toi-même, soit piocher dans ceux qui existent. Par curiosité ce matin, je me suis fait une petite macro pour les visualiser par tranches de 20, de 1 à... 10000 ! D'accord, il y a des trous, mais quand même !

Pour ne pas me palucher ça à chaque fois, j'ai noté les plus funny. Voici la liste que j'ai faite :
' VALEURS DE QUELQUES "FaceID"
' 25 Loupe
' 29 Traces de pas
' 33 Réveil
' 38à41 Flèches
' 46 Jumelles
' 49 Point d'interrogation
' 50 Calculette
' 51 Main
' 52 Petit cochon
' 59 Smiley content
' 126 Horloge
' 141 Jumelles
' 272 Note de musique
' 273 Cloche
' 274 Bulle de BD
' 275 Téléphone
' 276 Smiley boudeur
' 342 Ampoule blanche
' 343 Ampoule allumée jaune
' 352 Ampoule allumée rouge
' 353 Livre
' 481 As de coeur
' 482 As de carreau
' 483 As de pic
' 484 As de trèfle
' 964 Point d'exclamation
' 983 Livre
' 1016 Maison
' 1019 X blanc dans un cercle rouge
' 1102 Verre à pied
' 1382 Spot
' 1885 Drapeau rouge
' 1907 Drapeau blanc
' 6914 Etoile filante verte
' 6915 Etoile filante jaune
' 6916 Etoile filante rouge

Quant à l'emplacement dans l'écran, tu peux utiliser les propriétés Top et Left, qui permettent de positionner respectivement par rapport au haut et au bord gauche de l'écran.
0
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
18 août 2006 à 15:59
donc, si je veux placer la barre a la derniere ligne et a la fin, donc a droite, je dois mettre :

msoBarRow = msoBarRowLast
msoBarPosition = msoBarRight

c'est bien ca? (ceci viens du fichier help de l'editeur ^^;)
0
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
18 août 2006 à 16:37
ok, j'ai essaye et ca marche, il place effectivement les barres en la ou je veux, le seul probleme c'est que si il y a plus d'une barre il place une barre par ligne, ou (si je me suis pas bien exprimé) il cree un row par bare créée. voici le dernier code, ayant le meme effet que les autres, que j'ai utilisé :

With CommandBars.Add(Name:=Barre)
CommandBars(Barre).Position = msoBarTop
CommandBars(Barre).RowIndex = msoBarRowFirst
Do
Macro = Cells(I, 2).Value
Libellé = Cells(I, 3).Value
Bouton = Cells(I, 4).Value
With .Controls.Add(Type:=msoControlButton)
.OnAction = Macro
.FaceId = Bouton
.TooltipText = Libellé
.Caption = Libellé
End With
I = I + 1
Loop While Cells(I, 1) = Barre
.Visible = True

End With
0
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
21 août 2006 à 11:09
okie, apres une petite discution avec les concernés, la barre n'a finalement pas besoin d'etre dockée....en revanche je voudrais juqte savoir comment je pourrais supprimer la barre avant de fermer la feuille, car, la barre (ou les barres, depends de la liste des barres) reste et se retrouve dans d'autres feuilles, ce qui gene ceux pour qui la macro a ete faite ^^;....je sais que je dois utiliser une commande dans le genre :

Private Sub Workbook_BeforeClose(Cancel as Boolean)
Dim Barre As String

Worksheets("listeMacros").Activate

I = 2
Do While Cells(I, 1).Value <> ""
Barre = Cells(I, 1).Value

On Error Resume Next
CommandBars(Barre).Delete
On Error GoTo 0

Loop
End Sub


euh...je crois pas que j'ai oublié quelque chose...enfin, si ce que j'ai utilisé est bon, si j'ai bien compris je dois le mettre dans "ThisWorkbook" dans "Microsoft Excel Objets" et pas dans les modules, c'est bien ca?

p.s : je viens de tester et ca provoque un blocage au niveau de excel, qui plante....quelqu'un pourrait m'aider a corriger l'erreur que j'ai fait avec le code?
0
Armojax Messages postés 1860 Date d'inscription mercredi 19 janvier 2005 Statut Membre Dernière intervention 2 octobre 2024 1 528
21 août 2006 à 11:36
Quand tu crées une barre d'outils, elle s'ajoute aux autres barres déjà existantes dans Excel. Si tu fais : Affichage/Barres d'outils, ta barre figure dans la liste. Tant que tu ne la supprimes pas, elle y reste, qu'elle soit visible ou non. Une fois créée, tu peux quitter Excel, puis rappeler ton classeur : avec Affichage/Barres d'outils, tu peux constater que ta barre ne s'est pas fait la malle, même si tu ne l'as pas regénérée.
Donc je ne vois pas trop l'intérêt de la supprimer/recréer à chaque fois.
Quand à gêner ou non certains utilisateurs : il suffit que tu la rendes visible pour ceux qui en ont besoin :
CommandBars("MaBarre").Visible = True/False.
Personne n'est gêné par les barres d'outils masquées qui ne s'affichent pas.

D'ailleurs je me pose une question : sur combien de postes ta macro va-t-elle fonctionner ? Si c'est sur 50 ou 1500, OK, mieux vaut la générer par programme. On diffuse la nouvelle version, et ça roule.
Mais si c'est seulement sur ton poste et celui de ton boss, tu passeras moins de temps à créer la barre et à l'installer à la main... Quand tu as une version stable, tu installes la barre sur le poste de Paulette, et 5 ans après ça roule toujours sans problème...
Tout ça dépend evidemment du contexte, que je ne connais pas.
0
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
21 août 2006 à 12:06
hmmm, il est vrai que je ne devrais pas me soucier de cela si ce n'est que pour 2 pc, les problemes sont :

1. le boss a l'autorité, si il donne un ordre et que c'est dans ton domaine d'aaction tu dois l'executer (je suis stagiaire, pour l'instant).
2. j'ai toujours tendance a faire les fonctions et programmes de facon a ce qu'ils soient executables sur tous les pc et pour toutes les personnes.
3. j'ai tendance a dynamiser un maximum chacune de mes fonctions, quite a perdre en compacité, la fonction pourra s'executer sur n'importe quel poste.
4. pour le moment l'entreprise n'est pas tres grande (3 personnes) mais des septembre d'autres personnes vont s'y joindre (3-4 d'apres ce que je sais) donc ce n'est plus 3 postes mais une mini entreprise qui utiliseront la macro ^^;

bref, autant de raison pour lesquelles je fais ce qu'on me dit, par contre, j'ai essaye de supprimmer les barres car c'est la 1ere idee que j'ai eu, mais il est vrai que je peux aussi simplement les cacher ^^
je vais essaier cela.
0
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
21 août 2006 à 12:43
argh, je dois vraiment etre bete, je n'arrive pas a faire marcher la fonction correctement....j'ai utilise ca :

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim Barre As String
Dim NL As Long
Worksheets("listeMacros").Activate
NL = Worksheets("listeMacros").Cells(65536, 1).End(xlUp).Row

For I = 2 To NL
If Cells(I, 1).Value <> "" Then
Barre = Cells(I, 1).Value

On Error Resume Next
CommandBars(Barre).Visible = False
On Error GoTo 0
End If
Next

End Sub

et, malgré le fait qu'il ne me montre pas d'erreurs, il ne ferme pas la barre...
0