Plusieurs target.adress dans une boucle for

bonjour,

Encore un petit souci. Voilà j'ai écrit une macro (Finish) qui permet de rajouter des éléments dans une ligne quand ma target cell vaut Yes et qui les efface (No_finish) quand elle vaut Non. Jusque là je suis content mais je voudrais le faire pour une dizaine cellules. J'ai donc fait une boucle for mais là ça ne marche plus.. Voilà mon code:

Private Sub Worksheet_Change(ByVal Target As Range)
For i = 15 To 27
    If Target.Address = "$G$i" Then
        If Target = "Yes" Then
            Finish (i)
        Else
            No_finish (i)
        End If
    End If
  Next

je vous remercie d'avance.


Et il y a bien End Sub pardon.

Bonjour,

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count = 1 And Not Application.Intersect(Target, Range("$G$15:$G$27")) Is Nothing Then
        If Target = "Yes" Then
            Finish (Target.Row)
        Else
            No_finish (Target.Row)
        End If
    End If
End Sub

A+

Bonjour,

Alors tout d'abord un grand merci, effectivement ça marche.

Ensuite je suis du genre absolument novice mais curieux... Est-ce que vous pourriez m'expliquer pourquoi ce que je faisais était faux et pourquoi il fallait faire ce que vous avez fait?? (C'est pas dans le cours de VBA...)

C'est quoi target.count, et Not application.intersect is nothing????

Merci beaucoup pour ces précieux renseignements.

Bonjour,

Target.count = 1 : l'argument Target de votre procédure est un range et peut donc contenir plusieurs cellules. Si ce nombre est ici <> 1, la condition if ne sera pas respectée.

Not application.intersect(...) is nothing : "pas l'intersection de votre target et du range choisi n'est rien", autrement dit, l'intersection de votre target et du range est quelque chose. Si votre target est dans le range choisi, la condition if est respectée.

Cdt,

Darzou

Ok merci bcp, c'est la conclusion que j'avais tiré aussi, mais la double négation me semblait bien étrange...

Est-ce que vous pourriez m'expliquer pourquoi ce que je faisais était faux et pourquoi il fallait faire ce que vous avez fait ?

En complément des explications données par Darzou, je te soumets deux observations sur ton code :

1) Pour balayer les cellules G15 à G27, il aurait fallu écrire

If Target.Address = "$G$" & i Then

2) La procédure évènementielle Worksheet_Change est lancée à chaque modification d’une cellule. Avec ton code, tu vas effectuer inutilement 13 fois le test sur Target.Address.

De plus, si la cellule modifiée est dans la plage G1:G17, tu vas lancer Finish ou No_finish qui vont modifier une cellule. Cette modification de cellule va relancer la procédure Worksheet_Change . Et c’est reparti pour 13 tours de manège !

Pour te faire une idée, tu peux comparer l’effet produit par les 2 procédures suivantes (exécution en mode pas à pas).

Private Sub Worksheet_Change(ByVal Target As Range)
For i = 15 To 27
    If Target.Address = "$G$" & i Then
        If Target = "Yes" Then
            Finish (i)
        Else
            No_finish (i)
        End If
    End If
  Next
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count = 1 And Not Application.Intersect(Target, Range("$G$15:$G$27")) Is Nothing Then
        Application.EnableEvents = False
        If Target = "Yes" Then
            Finish (Target.Row)
        Else
            No_finish (Target.Row)
        End If
        Application.EnableEvents = True
    End If
End Sub

A+

Mille mercis ! J'avais conscience de faire des "tours de manège" mais je ne voyais pas comment faire autrement, la syntaxe n'est pas super intuitive, pour moi en tout cas =)

Bye.

Rechercher des sujets similaires à "target adress boucle"