Boucle for

Résolu
EnguerrandP Messages postés 295 Date d'inscription vendredi 26 avril 2013 Statut Membre Dernière intervention 15 juillet 2015 - 8 août 2013 à 08:56
EnguerrandP Messages postés 295 Date d'inscription vendredi 26 avril 2013 Statut Membre Dernière intervention 15 juillet 2015 - 8 août 2013 à 12:31
Bien le bonjour, je voudrait savoir si il est possible de faire une boule for sur le nom de bouton sur un worksheet (ex: Cmd1 , Cmd2 ,....Cmd50)

For i = 1 to 50
 Cmd & i .caption = Range ("A2")
Next i 

Et si ensuit je pourrait faire une boucle for sur :

Private Sub Cmd9_Change() 
End sub

pour pouvoir réduir considérablement mon code.
Voila se que donne mon code pour un boutton au total il y en a 46 comme celui la. :
Private Sub Ln1_Change()
If (Ln1.Value = "") Or (Ln1.Value <> "RDV") Or (Ln1.Value <> "ABS") Or (Ln1.Value <> "SLN") Then
    Ln1.BackColor = &HFFFFFF
    Range("Q7").Interior.Color = &HFFFFFF
End If
If (Ln1.Value = "rdv") Or (Ln1.Value = "RDV") Or (Ln1.Value = "Rdv") Or (Ln1.Value = "RDv") Then
    Ln1.Value = "RDV"
    Ln1.BackColor = &HFFC0C0
    Range("Q7").Interior.Color = &HFFC0C0
End If
If (Ln1.Value = "sln") Or (Ln1.Value = "SLN") Or (Ln1.Value = "Sln") Or (Ln1.Value = "SLn") Then
    Ln1.Value = "SLN"
    Ln1.BackColor = &HC0E0FF
    Range("Q7").Interior.Color = &HC0E0FF
End If
If (Ln1.Value = "abs") Or (Ln1.Value = "ABS") Or (Ln1.Value = "Abs") Or (Ln1.Value = "ABs") Then
    Ln1.Value = "ABS"
    Ln1.BackColor = &HE0E0E0
    Range("Q7").Interior.Color = &HE0E0E0
End If
End Sub
--

Merci d'avoir pris le temps de me lire .

9 réponses

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 344
Modifié par jordane45 le 8/08/2013 à 09:22
Bonhour.
Oui on peut.
Regardes du côté de " controls"


Si tu veux reduire ton code utilises du switch case a la place des ifs.

Ps: si tu dev sur Excel, poses tes question dans la section VBA du forum.



Cordialement,
Jordane
____________________________________________
1
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 344
8 août 2013 à 10:28
Pas switch... SELECT.
(c'est ça de faire plusieurs langages en même temps...on s'y perd... ^^ )
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 344
8 août 2013 à 10:27
Pas de soucis, je comprend mieux.


je pense que tu as tout un bloc "commun" à tes boutons.
tu pourrais donc le mettre en "FONCTION".

exemple:
Private Sub I3_Clic()
If (I3.Caption <> "") Then
jour = Range("I3")
Mois = Range("I9")
Année = Range("I10")
A = action(Année, Mois, jour)
End If
End Sub

Private Sub J3_Clic()
If (J3.Caption <> "") Then
jour = Range("J34")
Mois = Range("J9")
Année = Range("J10")
A = action(Année, Mois, jour)
End If
End Sub



Function action(Année, Mois, jour)
Nommois = MonthsBox.Value
If FeuilleExiste("Agenda_Jour_" & jour & "_" & Mois & "_" & Année) Then
   Worksheets("Agenda_Jour_" & jour & "_" & Mois & "_" & Année).Visible = True
   Worksheets("Agenda_Jour_" & jour & "_" & Mois & "_" & Année).Activate
ElseIf Not FeuilleExiste("Agenda_Jour_" & "Jour" & "_" & Mois & "_" & Année) Then
    Worksheets("Agenda_Jour_vide").Copy After:=Sheets("Feuil 3")
    Worksheets("Agenda_Jour_vide (2)").Name = "Agenda_Jour_" & jour & "_" & Mois & "_" & Année
    Worksheets("Agenda_Jour_" & jour & "_" & Mois & "_" & Année).Range("B2") = jour
    Worksheets("Agenda_Jour_" & jour & "_" & Mois & "_" & Année).Range("B9") = "jeudi"
    Worksheets("Agenda_Jour_" & jour & "_" & Mois & "_" & Année).Range("C9") = jour
    Worksheets("Agenda_Jour_" & jour & "_" & Mois & "_" & Année).Range("D9") = Nommois
    Worksheets("Agenda_Jour_" & jour & "_" & Mois & "_" & Année).Range("B10") = Année
    Worksheets("Agenda_Jour_" & jour & "_" & Mois & "_" & Année).Activate
End If
End Function





PS: mon commentaire concernant les IF est quand même valable pour tes listbox... essaye de passer par du Select CAse

1
EnguerrandP Messages postés 295 Date d'inscription vendredi 26 avril 2013 Statut Membre Dernière intervention 15 juillet 2015 1
8 août 2013 à 09:25
Merci ,
je ferait plus attention a l'avenir lorsque je poserait une question dans quel partie je suis.
Pour en revenir a ta réponce je croyait que "controls" ne servait cas faire référence a un userform et pas a un worksheet.

bonne journée
0
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
8 août 2013 à 09:27
bonjour

Pour la premiere partie les boutons

Dim ctl As Control
For Each ctl In Cmd_Registre.Controls
If TypeOf ctl Is CommandButton Then
If InStr(1, LCase(ctl.Name), "cmd") Then

End If
End If
Next

par contre impossible pour Excel VBA de faire une boucle sur les boutons, il faudra faire autant de routines que de boutons et d'événements
Private Sub Cmd1_Change()
End sub
...
Private Sub Cmd9_Change()
End sub
0
EnguerrandP Messages postés 295 Date d'inscription vendredi 26 avril 2013 Statut Membre Dernière intervention 15 juillet 2015 1
Modifié par EnguerrandP le 8/08/2013 à 09:36
Je ne comprend pas ton code, tu pourait me l'expliqué si tu a le temps merci.
If InStr(1, LCase(ctl.Name), "cmd") Then
0

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

Posez votre question
EnguerrandP Messages postés 295 Date d'inscription vendredi 26 avril 2013 Statut Membre Dernière intervention 15 juillet 2015 1
8 août 2013 à 09:30
Merci ,
j'ai donc de quoi m'occuper pour la matiné .
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 344
Modifié par jordane45 le 8/08/2013 à 09:50
par contre, en effet, si c'est dans une feuille excel (déolé j'avais mal lu),
il faut utiliser les shapes

Sub test()
'boucle sur les controls d'une feuille
For Each s In Worksheets(1).Shapes
    If s.Type = 8 or s.Type = 12 Then 'si c'est un bouton
      Debug.Print s.Name
    End If
Next

End Sub



Pour la deuxième partie... boucle sur tes 46 boutons pour réduire le code..... et bien tout dépend de ce que tu veux faire ?
- Pour chaque bouton de ta feuille tu veux créer automatiquement la sub qui lui correspond ?
- ou, chaque bouton doit réaliser le même code ?
bref, c'est quoi ton ln1 par rapport à tes Cmd ?

Cordialement,
Jordane
____________________________________________
0
EnguerrandP Messages postés 295 Date d'inscription vendredi 26 avril 2013 Statut Membre Dernière intervention 15 juillet 2015 1
8 août 2013 à 11:22
je vais tenter de transformer mon code pour le calendrier en function sa devrait me faire reduir le code d'un bon bout.
0
EnguerrandP Messages postés 295 Date d'inscription vendredi 26 avril 2013 Statut Membre Dernière intervention 15 juillet 2015 1
8 août 2013 à 10:16
Rebonjour ,

Je me suis tromper E1...E4 et Ln1 ...Ln42 non rein a voir avec les Cmdboutton se sont des listbox. Ou lorsque l'on modifi le text de la listbox la couleur de la ligne ou je l'ai mis change.

Voila le code des CmdBoutton qui sont F3 a F8, G3 a G8, H3 a H8, I3 a I8, ..., L3 a L8.

Private Sub I3_Click()
If (I3.Caption <> "") Then
Jour = Range("I3")
Mois = Range("I9")
Année = Range("I10")
Nommois = MonthsBox.Value

If FeuilleExiste("Agenda_Jour_" & Jour & "_" & Mois & "_" & Année) Then
   Worksheets("Agenda_Jour_" & Jour & "_" & Mois & "_" & Année).Visible = True
   Worksheets("Agenda_Jour_" & Jour & "_" & Mois & "_" & Année).Activate
ElseIf Not FeuilleExiste("Agenda_Jour_" & "Jour" & "_" & Mois & "_" & Année) Then
    Worksheets("Agenda_Jour_vide").Copy After:=Sheets("Feuil 3")
    Worksheets("Agenda_Jour_vide (2)").Name = "Agenda_Jour_" & Jour & "_" & Mois & "_" & Année
    Worksheets("Agenda_Jour_" & Jour & "_" & Mois & "_" & Année).Range("B2") = Jour
    Worksheets("Agenda_Jour_" & Jour & "_" & Mois & "_" & Année).Range("B9") = "jeudi"
    Worksheets("Agenda_Jour_" & Jour & "_" & Mois & "_" & Année).Range("C9") = Jour
    Worksheets("Agenda_Jour_" & Jour & "_" & Mois & "_" & Année).Range("D9") = Nommois
    Worksheets("Agenda_Jour_" & Jour & "_" & Mois & "_" & Année).Range("B10") = Année
    Worksheets("Agenda_Jour_" & Jour & "_" & Mois & "_" & Année).Activate
    End If
End If
End Sub


Désole pour l'érreur
0
EnguerrandP Messages postés 295 Date d'inscription vendredi 26 avril 2013 Statut Membre Dernière intervention 15 juillet 2015 1
8 août 2013 à 10:33
Ok merci ,
Je ne comprend pas encor très bien les fonction en vba je vais voir si je trouve un tuto.
Et oui mes boutton on une grosse parti qui dit la meme chose il y a juste Jour qui change, il prend la valeur d'une cellule différent par boutton mais facil a trouver pour I3 -> range I3 pour I4 -> range I4 ainsi de suite.

Et je regarde pour mes listbox
0
EnguerrandP Messages postés 295 Date d'inscription vendredi 26 avril 2013 Statut Membre Dernière intervention 15 juillet 2015 1
8 août 2013 à 10:44
Salut,
Je vient de tester ta fonction
J'ai fais une petite modification pour qu'elle soit global:
j'ai pris
Nommois = MonthsBox.Value
et je l'ai enlever de la fonction puis je l'ai mis dans le boutton comme sa , sa evite de recrée la fonction avec chaque nouvel page .
Es que c'est intéréssant ou il vaut mieux que je laisse tel que tu ma donnée le code ? merci
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 344
8 août 2013 à 11:45
nan c'est très bien.
Ce n'était qu'un exemple que je te donnais. A toi ensuite de l'adapter au mieux à tes besoins.
0
EnguerrandP Messages postés 295 Date d'inscription vendredi 26 avril 2013 Statut Membre Dernière intervention 15 juillet 2015 1
8 août 2013 à 12:31
J'ai fais une autre modification car sinon touts les jour que l'on crée s'appeler jeudi:
Private Sub J3_Clic()
If (J3.Caption <> "") Then
B9 = "vendredi"
jour = Range("J3")
Mois = Range("J9")
Année = Range("J10")
A = action(Année, Mois, jour)
End If
End Sub



Function action(Année, Mois, jour)
Nommois = MonthsBox.Value
If FeuilleExiste("Agenda_Jour_" & jour & "_" & Mois & "_" & Année) Then
   Worksheets("Agenda_Jour_" & jour & "_" & Mois & "_" & Année).Visible = True
   Worksheets("Agenda_Jour_" & jour & "_" & Mois & "_" & Année).Activate
ElseIf Not FeuilleExiste("Agenda_Jour_" & "Jour" & "_" & Mois & "_" & Année) Then
    Worksheets("Agenda_Jour_vide").Copy After:=Sheets("Feuil 3")
    Worksheets("Agenda_Jour_vide (2)").Name = "Agenda_Jour_" & jour & "_" & Mois & "_" & Année
    Worksheets("Agenda_Jour_" & jour & "_" & Mois & "_" & Année).Range("B2") = jour
    Worksheets("Agenda_Jour_" & jour & "_" & Mois & "_" & Année).Range("B9") = "vendredi"
    Worksheets("Agenda_Jour_" & jour & "_" & Mois & "_" & Année).Range("C9") = jour
    Worksheets("Agenda_Jour_" & jour & "_" & Mois & "_" & Année).Range("D9") = Nommois
    Worksheets("Agenda_Jour_" & jour & "_" & Mois & "_" & Année).Range("B10") = Année
    Worksheets("Agenda_Jour_" & jour & "_" & Mois & "_" & Année).Activate
End If
End Function

0
Rejoignez-nous