Boucle for [Résolu]

Messages postés
295
Date d'inscription
vendredi 26 avril 2013
Statut
Membre
Dernière intervention
15 juillet 2015
- - Dernière réponse : 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 .
Afficher la suite 

9 réponses

Meilleure réponse
Messages postés
26560
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 octobre 2019
316
1
Merci
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
____________________________________________

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 201 internautes nous ont dit merci ce mois-ci

jordane45
Messages postés
26560
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 octobre 2019
316 -
Pas switch... SELECT.
(c'est ça de faire plusieurs langages en même temps...on s'y perd... ^^ )
Messages postés
26560
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 octobre 2019
316
1
Merci
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

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 201 internautes nous ont dit merci ce mois-ci

Messages postés
295
Date d'inscription
vendredi 26 avril 2013
Statut
Membre
Dernière intervention
15 juillet 2015
0
Merci
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
Messages postés
672
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
2 juin 2016
1
0
Merci
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
EnguerrandP
Messages postés
295
Date d'inscription
vendredi 26 avril 2013
Statut
Membre
Dernière intervention
15 juillet 2015
-
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
Messages postés
295
Date d'inscription
vendredi 26 avril 2013
Statut
Membre
Dernière intervention
15 juillet 2015
0
Merci
Merci ,
j'ai donc de quoi m'occuper pour la matiné .
Messages postés
26560
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 octobre 2019
316
0
Merci
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
____________________________________________
EnguerrandP
Messages postés
295
Date d'inscription
vendredi 26 avril 2013
Statut
Membre
Dernière intervention
15 juillet 2015
-
je vais tenter de transformer mon code pour le calendrier en function sa devrait me faire reduir le code d'un bon bout.
Messages postés
295
Date d'inscription
vendredi 26 avril 2013
Statut
Membre
Dernière intervention
15 juillet 2015
0
Merci
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
Messages postés
295
Date d'inscription
vendredi 26 avril 2013
Statut
Membre
Dernière intervention
15 juillet 2015
0
Merci
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
Messages postés
295
Date d'inscription
vendredi 26 avril 2013
Statut
Membre
Dernière intervention
15 juillet 2015
0
Merci
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
jordane45
Messages postés
26560
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 octobre 2019
316 -
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.
EnguerrandP
Messages postés
295
Date d'inscription
vendredi 26 avril 2013
Statut
Membre
Dernière intervention
15 juillet 2015
-
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