Excel: boucle pour plusieurs commandbutton

Excel: boucle pour plusieurs commandbutton - VB/VBA/VBS - Programmation

Marsh Posté le 22-07-2009 à 08:41:04    

Bonjour à tous,  
 
 
Je suis débutant pour les macros excel et j'aurai besoin de votre aide.  
 
J'ai créé un classeur et y est incorporé 38 boutons dont le nom et les couleurs sont modifiables via des cellules.  
 
Il existe bien la possibilité de créer une fonction pour chacun des boutons, mais vu le nombre, cela augmenterait la possibilité d'erreur et ralentirait sans aucun doute mon programme.  
 
J'aimerai donc créer une boucle qui me permettrait de simplifier mon programme. Cette boucle serait du style:  
 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)  
 
Dim i As Integer  
 
For i = 1 To 38  
 
If Cells((8 + i * 3), 54).Value = "" Then  
ActiveSheet.Shapes("CommandButton" & i).Visible = False  
Else  
ActiveSheet.Shapes("CommandButton" & i).Visible = True  
"CommandButton" & i.Caption = Cells(8 + i * 3, 54)  
"CommandButton" & i.ForeColor = RGB(Cells(8 + i * 3, 60), Cells(8 + i * 3, 61), Cells(8 + i * 3, 62))  
"CommandButton" & i.BackColor = RGB(Cells(8 + i * 3, 57).Value, Cells(8 + i * 3, 58).Value, Cells(8 + i * 3, 59).Value)  
 
End If  
Next  
End Sub  
 
Malheureusement, cela ne marche pas, j'ai mis en gras l'erreur que me signale vba sous le code "erreur de compilation, erreur de syntaxe".  
 
Comment faire pour créer un "bouton variable"...  
 
Merci d'avance pour vos réponses  
 
Bonne journée à tous  

Reply

Marsh Posté le 22-07-2009 à 08:41:04   

Reply

Marsh Posté le 22-07-2009 à 09:12:31    

Tu mets tous tes boutons dans un tableau/collection et tu le parcours ensuite.

Reply

Marsh Posté le 22-07-2009 à 10:33:11    

Merci Deamon pour ta réponse
 
Si j'ai bien compris, il faut créer une variable du style :
 
Dim BoutonVar(38) as String
 
Puis donner une valeur à chaque collection
 
BoutonVar(1)=CommandButton1
...
...
...
BoutonVar(38)=CommandButton38
 
Et l'utiliser dans la boucle avec par exemple
 
For i = 1 to 38
BoutonVar(i).caption=cells(8+i*3,54)
Next
 
Est-ce bien ca? Désolé mais je n'ai jamais utilisé de collection.
 
Merci encore.
 
Bonne journée
 
Corranh9

Reply

Marsh Posté le 22-07-2009 à 10:34:33    

Oui voilà c'est ça.

Reply

Marsh Posté le 22-07-2009 à 11:30:05    

Bonjour
 
je dirais que la méthode de Deamon est la plus propre, mais ce que tu as fait fonctionne parfaitement.
 
J'ai fait ce test, aucun souci, si ce n'est que forcement, si tu as un trou dans tes CommandButton (genre tu passes de CommandButton1 à CommandButton3) ca pose souci, surement ce que tu as.
 

Code :
  1. On error resume next
  2. For i = 1 to 38
  3.     ActiveSheet.OLEObjects("CommandButton" & x).Object.Caption = "toto" & x
  4. Next


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 12-09-2012 à 09:38:08    

Bonjour,  
 
J'ai des notions de VB sous excel, mais je ne maîtrise pas du tout les collections, group, et autres oleobjects.  
 
J'ai essayé vos deux solutions, mais elle ne marchent pas, est-ce parce que je travaille dans une userform? (c'est la que sont mes boutons).  
 
il dit:  "Membre de méthode ou de donnée introuvable"
 
en indiquant l'erreur là ou c'est en gras:  
     For i = 6 To 10
         UserForm2.OLEObjects("CommandButton" & i).Object.Size = 20
     Next
 
Est-ce que j'ai mal compris quelque chose?  
 
Merci d'avance,

Reply

Marsh Posté le 12-09-2012 à 10:34:04    

Bonjour,
 
Tu peux parcourir les contrôles de ton userform grâce à la collection Controls :
 

Code :
  1. Dim Ctrl As Control
  2.  
  3.    For Each Ctrl In UserForm2.Controls
  4.       If TypeName(Ctrl) = "CommandButton" Then
  5.          Ctrl.width = 100
  6.       End If
  7.    Next


---------------
Bel ours Vave, je me dois de l’admettre. -Skyl"win"-  Mais toi tu es intelligent -Homerde- - Ce génie -SkylWINd- JDD S16M72 10:43:46 GMT-DTC +1
Reply

Marsh Posté le 13-09-2012 à 10:36:14    

Ca marche, excellent ! Merci !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed