Comment faire une boucle sur macro qui se repete

  • Initiateur de la discussion Initiateur de la discussion yves03
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

yves03

XLDnaute Occasionnel
Bonsoir à tous,

J'utilise actuellement ce code pour ouvrir un USF lorsque je clique sur la cellule correspondante, par contre je ne voudrais qu'une cellule sur 3, alors j'ai ecrit plusieurs fois la meme macro, n'y a t'il pas la possibilite de faire une boucle car en plus je voudrais aller jusqu'a la cellule 50.
et je voudrais aussi repeter ça sur la colonne K , N , R.
Je voudrais eviter d'ecrire un nombre de fois important la meme macro.
Merci de votre aide.
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("H4:H4")) Is Nothing Then
Saisie.TextBox10.Value = Range("H2").Value
Saisie.Show
End If
If Not Intersect(Target, Range("H7:H7")) Is Nothing Then
Saisie.TextBox10.Value = Range("H2").Value
Saisie.Show
End If
If Not Intersect(Target, Range("H10:H10")) Is Nothing Then
Saisie.TextBox10.Value = Range("H2").Value
Saisie.Show
End If

End Sub
 
Re : Comment faire une boucle sur macro qui se repete

Bonsoir

Essayes ce code
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim plage As Range

Set plage = _
Union(Range("H4:H50"), _
        Range("K4:K50"), _
        Range("N4:N50"), _
        Range("R4:R50"))
        
If Not Intersect(Target, plage) Is Nothing Then
If Not IsEmpty(Target) And Target.Row Mod 3 = 1 Then
    With UserForm1
        .TextBox1.Value = Target
        .Show
    End With
End If
End If
End Sub

A+
 
Dernière édition:
Re : Comment faire une boucle sur macro qui se repete

Bonsoir Yves03,

Oui, on peut faire une boucle, il suffit de trouver le point commun.

Si j'ai bien suivi, tu veux que la macro se déclenche quand tu clic sur H4 ou H7 ou H10 ou ...?

Si oui, le point commun est vite trouvé, en partant de la cellule H4, il faut descendre de 3 lignes à chaque fois!

Proposition de boucle - méthode 1 :

Code:
For i=[COLOR="Blue"][B]4[/B][/COLOR] to [COLOR="Red"][B]10[/B][/COLOR] step 3 'la variable i prend les valeurs 4, 7 et 10
'... ta partie de macro à répéter
Next i

i -> représentant le numéro de la ligne : avantage, tu peux réutiliser cette variable dans ta macro!

Exemple concret :
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim i as Integer

  For i=4 to 10 step 3 

      If Not Intersect(Target, Range("H" & i)) Is Nothing Then
           Saisie.TextBox10.Value = Range("H2").Value
           Saisie.Show
      End If

  Next i

End Sub

Sinon tu peux aussi utiliser une boucle en comptant le nombre de répétition. Cela t'oblige à rajouter une variable pour gérer le numéro de ta ligne, mais tu sais plus facilement le nombre de fois que ta macro est répété.

Proposition de boucle - méthode 2 :

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim i as Integer
Dim NumLigne as Integer

NumLigne = 4

  For i=1 to 3

      If Not Intersect(Target, Range("H" & NumLigne)) Is Nothing Then
           Saisie.TextBox10.Value = Range("H2").Value
           Saisie.Show
      End If
      NumLigne = NumLigne + 3

  Next i

End Sub


A mon avis, dans ton cas, le plus intéressant est la méthode 1.

Après tu peux compliquer légèrement la chose pour gérer plusieurs colonnes en imbriquant des boucles.

Pour information, le point commun entre : H, K , N , R
c'est que tu te déplace de 3 colonnes vers la droite à chaque fois!

Je te laisse essayé et si tu as besoin d'aide, dis le.

Bonne fin de soirée

yves03 à dit:
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("H4[COLOR="Gray"][B]:H4[/B][/COLOR]")) Is Nothing Then
Saisie.TextBox10.Value = Range("H2").Value
Saisie.Show
End If
If Not Intersect(Target, Range("H7[COLOR="Gray"][B]:H7[/B][/COLOR]")) Is Nothing Then
Saisie.TextBox10.Value = Range("H2").Value
Saisie.Show
End If
If Not Intersect(Target, Range("H10[COLOR="Gray"][B]:H10[/B][/COLOR]")) Is Nothing Then
Saisie.TextBox10.Value = Range("H2").Value
Saisie.Show
End If

End Sub
Code inutile

PS. : pour l'écriture de ton code, penses à la mise en page (saut de ligne, décalage vers la gauche de la ligne, ...) pour rendre ton code plus clair 😉

Edition : Bonsoir Vbacrumble, pas vu!
 
Re : Comment faire une boucle sur macro qui se repete

Bonsoir,
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Row > 3 And Target.Row < 51 Then
    Select Case Target.Column
    Case 8, 11, 14, 18
        Saisie.TextBox10.Value = Range("H2").Value
        Saisie.Show
    End Select
End If
End Sub
A+
kjin
 
Re : Comment faire une boucle sur macro qui se repete

Bonsoir Yves03,

Oui, on peut faire une boucle, il suffit de trouver le point commun.

Si j'ai bien suivi, tu veux que la macro se déclenche quand tu clic sur H4 ou H7 ou H10 ou ...?

Si oui, le point commun est vite trouvé, en partant de la cellule H4, il faut descendre de 3 lignes à chaque fois!

Proposition de boucle - méthode 1 :

Code:
For i=[COLOR="Blue"][B]4[/B][/COLOR] to [COLOR="Red"][B]10[/B][/COLOR] step 3 'la variable i prend les valeurs 4, 7 et 10
'... ta partie de macro à répéter
Next i

i -> représentant le numéro de la ligne : avantage, tu peux réutiliser cette variable dans ta macro!

Exemple concret :
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim i as Integer

  For i=4 to 10 step 3 

      If Not Intersect(Target, Range("H" & i)) Is Nothing Then
           Saisie.TextBox10.Value = Range("H2").Value
           Saisie.Show
      End If

  Next i

End Sub

Sinon tu peux aussi utiliser une boucle en comptant le nombre de répétition. Cela t'oblige à rajouter une variable pour gérer le numéro de ta ligne, mais tu sais plus facilement le nombre de fois que ta macro est répété.

Proposition de boucle - méthode 2 :

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim i as Integer
Dim NumLigne as Integer

NumLigne = 4

  For i=1 to 3

      If Not Intersect(Target, Range("H" & NumLigne)) Is Nothing Then
           Saisie.TextBox10.Value = Range("H2").Value
           Saisie.Show
      End If
      NumLigne = NumLigne + 3

  Next i

End Sub


A mon avis, dans ton cas, le plus intéressant est la méthode 1.

Après tu peux compliquer légèrement la chose pour gérer plusieurs colonnes en imbriquant des boucles.

Pour information, le point commun entre : H, K , N , R
c'est que tu te déplace de 3 colonnes vers la droite à chaque fois!

Je te laisse essayé et si tu as besoin d'aide, dis le.

Bonne fin de soirée



PS. : pour l'écriture de ton code, penses à la mise en page (saut de ligne, décalage vers la gauche de la ligne, ...) pour rendre ton code plus clair 😉

Edition : Bonsoir Vbacrumble, pas vu!


J'ai suivi tes conseils, j'utilise la methode 1.
ça fonctionne parfaitement, mais je voudrais inclure une autre boucle pour pouvoir decaler les colonnes de 3 en 3 vers la droite.
J'ai essaye de l'inclure, en suivant l'exemple de la boucle pour les lignes, mais sans succes.
Si tu pouvais m'indiquer le chemin a suivre.
Merci d'avance
 
Re : Comment faire une boucle sur macro qui se repete

Bonsoir Yves03,

yves03 à dit:
J'ai suivi tes conseils, j'utilise la methode 1.
ça fonctionne parfaitement, mais je voudrais inclure une autre boucle pour pouvoir decaler les colonnes de 3 en 3 vers la droite.
J'ai essaye de l'inclure, en suivant l'exemple de la boucle pour les lignes, mais sans succes.
Si tu pouvais m'indiquer le chemin a suivre.
Merci d'avance

Pour rendre le code plus clair, j'ai remplacé i par Ligne

J'ai rajouter la boucle bleu pour les numéro de colonnes.

Pour plus de facilité, j'ai remplacé la fonction Range() par la fonction Cells(), plus simple d'utilisation car les lettres correspondants aux noms des colonnes sont remplacées par des chiffres. Plus facile à incrémenter! 😉

1 = Colonne A
2 = Colonne B
...
8 = Colonne H
11 = Colonne K (=8+3)
14 = Colonne N (=11+3)
18 = Colonne R (=14+4)

Message de 00H07
Yves03 à dit:
je voudrais aussi repeter ça sur la colonne K , N , R

Message de 09H02
Yves03 à dit:
mais je voudrais inclure une autre boucle pour pouvoir decaler les colonnes de 3 en 3 vers la droite.

Remarque :
* Pour se déplacer de la colonne H à K, on se déplace de 3 colonnes vers la droite.
* Pour se déplacer de la colonne K à N, on se déplace de 3 colonnes vers la droite.
* Pour se déplacer de la colonne N à R, on se déplace de 4 colonnes vers la droite!?!?!?

Tu es sûr pour la lettre R? Ca ne serait pas plutôt Q?

Dans le code, ci-dessous, j'ai fais comme si c'était la colonne Q. Si c'est bien la colonne R, il faudra corriger la macro!

Proposition :
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim [COLOR="Red"][I]Ligne[/I][/COLOR] As Integer
Dim Colonne As Integer

   [COLOR="Blue"][B]For Colonne[/B][/COLOR] = 8 [COLOR="Blue"][B]To[/B][/COLOR] 17 [COLOR="Blue"][B]Step[/B][/COLOR] 3
      For [COLOR="Red"][B]Ligne[/B][/COLOR] = 4 To 10 Step 3

          If Not Intersect(Target, [COLOR="DimGray"][B]Cells([/B][/COLOR][COLOR="Red"][B]Ligne[/B][/COLOR], Colonne[COLOR="DimGray"][B])[/B][/COLOR]) Is Nothing Then
               Saisie.TextBox10.Value = Range("H2").Value
               Saisie.Show
          End If

      Next [COLOR="Red"][B]Ligne[/B][/COLOR]
   [COLOR="Blue"][B]Next Colonne[/B][/COLOR]
End Sub

Nous en sommes donc à deux boucles imbriquées pour l'instant, mais reconnait que présenté ainsi (retrait de lignes et saut de lignes) c'est quand même plus clair 😉

Bonne soirée
 
Dernière édition:
Re : Comment faire une boucle sur macro qui se repete

Merci beaucoup Excel Lent
Tes explications sont vraiment TOP
Explique comme ça je comprend le principe, je vais tacher de mettre en aplication tes conseils pour la lisibilite du code;
Merci encore.
A bientot
😉
 
Re : Comment faire une boucle sur macro qui se repete

Re-bonsoir,

Yves03 à dit:
mettre en aplication tes conseils pour la lisibilite du code

Ils étaient très succint! Voici plus de détails ci-dessous

Les principes de bases pour bien présenter sont :
-> ne pas hésiter à sauter des lignes pour séparer les différents blocs
-> aligner à l'aide des retraits ce qui va ensemble
-> ne pas hésiter à rajouter des commentaires dans le code (mettre un guillemet simple juste avant le commentaire.

Exemple ci-dessous avec de la couleur pour mieux visualiser :
Code:
[COLOR="Red"][B]Private Sub[/B][/COLOR] Worksheet_SelectionChange(ByVal Target As Range)
Dim Ligne As Integer     [COLOR="Green"][B]'La variable "Ligne" contient le numéro de la ligne[/B][/COLOR]
Dim Colonne As Integer   [B][COLOR="Green"]'La variable "Colonne" contient le numéro de la colonne
[/COLOR][/B]
   [COLOR="Blue"][B]For[/B][/COLOR] Colonne = 8 [COLOR="Blue"][B]To[/B][/COLOR] 17 [B][COLOR="Blue"]Step[/COLOR][/B] 3
      [COLOR="DimGray"][B]For[/B][/COLOR] Ligne = 4 [COLOR="DimGray"][B]To[/B][/COLOR] 10 [COLOR="DimGray"][B]Step[/B][/COLOR] 3

          [B][U]If[/U][/B] Not Intersect(Target, Cells(Ligne, Colonne)) Is Nothing [B][U]Then[/U][/B]
               Saisie.TextBox10.Value = Range("H2").Value
               Saisie.Show
          [U][B]End If[/B][/U]

      [COLOR="DimGray"][B]Next[/B][/COLOR] Ligne
   [COLOR="Blue"][B]Next[/B][/COLOR] Colonne
[COLOR="Red"][B]End Sub[/B][/COLOR]

Lorsqu'on met "Private Sub" au début de la macro, il faut mettre à la fin : End Sub

Une boucle For - To (step) fini par Next
Une condition IF - Then (Else) fini normalement par End If

Pour tout ces éléments, il faut choisir un retrait et prendre le même pour l'élément de début et de fin. Ainsi tu es sûr de ne pas l'oublier, mais en plus de VOIR où il se termine

Surtout lorsque plusieurs éléments sont imbriqués.

Par contre, si tes éléments ne sont pas imbriqués. C'est à dire que l'élément 2 s'ouvre seulement APRES que le premier élément soit fermé, alors tu peux les aligner TOUT LES DEUX sur la même colonne.

Exemple :
Code:
[COLOR="Red"][B]Private Sub[/B][/COLOR] Worksheet_SelectionChange(ByVal Target As Range)
   [COLOR="Blue"][B]For[/B][/COLOR] Colonne = 8 [COLOR="Blue"][B]To[/B][/COLOR] 17 [B][COLOR="Blue"]Step[/COLOR][/B] 3
          [B][U]If[/U][/B] ... [B][U]Then[/U][/B]
               ...
          [U][B]End If[/B][/U]
   [COLOR="Blue"][B]Next[/B][/COLOR] Colonne

   [COLOR="DimGray"][B]For[/B][/COLOR] Ligne = 4 [COLOR="DimGray"][B]To[/B][/COLOR] 10 [COLOR="DimGray"][B]Step[/B][/COLOR] 3
          [B][U]If[/U][/B] ... [B][U]Then[/U][/B]
               ...
          [U][B]End If[/B][/U]
      [COLOR="DimGray"][B]Next[/B][/COLOR] Ligne
[COLOR="Red"][B]End Sub[/B][/COLOR]

Alors? La dernière colonne, c'est Q ou R?

Bonne fin de soirée

(explications non exhaustive)
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
9
Affichages
511
  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
1 K
Réponses
4
Affichages
743
Retour