Le serpent qui se mord la queue !

BenHarber

XLDnaute Occasionnel
Bonsoir à tous,
Voici mon pb : chaque cellule de A1 à A20 contient une valeur : disons 'toto', 'tata' ou 'tutu'. Je souhaite que la saisie faite dans l'une des cellules B1 à B20 (disons à côté du mot 'toto') se recopie automatiquement sur la zone B1 à B20 en face de tous les mots 'toto' qu'il peut y avoir.
J'ai donc saisi le code suivant :

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim znSaisie As Range
Set znSaisie = Range('B1:B20')
If Not Application.Intersect(znSaisie, Range(Target.Address)) Is Nothing Then
maSaisie = Range(Target.Address).Value
maRef = Range(Target.Address).Offset(0, -1).Value
For Each c In znSaisie.Offset(0, -1)
If c = maRef Then
c.Offset(0, 1) = maSaisie
End If
Next c
End If
End Sub

L'ennui, c'est que cette macro 'boucle' sans jamais s'arrêter !

Quelqu'un aurait-t-il une idée ?
Merci d'avance pour vos conseils !
BenHarber
 

Jam

XLDnaute Accro
Salut Ben,

Tu utilises un événement qui va systématiquement ce produire. Donc ça boucle indéfiniment.

Par contre je ne vois pas quel autre événement te proposer. Quelqu'un aura bien une idée à te proposer.

Bon courage.
 

Excel_lent

XLDnaute Impliqué
Bonsoir BenHarber, Bonsoir à tous,

Je viens de prendre connaissance de ton post.

J'ai eu ce genre de problème et j'ai trouvé iune solution qui pourrait te convenir : il suffit de rajouter 2 lignes à ton code.

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim znSaisie As Range
Set znSaisie = Range('B1:B20')
If Not Application.Intersect(znSaisie, Range(Target.Address)) Is Nothing Then
maSaisie = Range(Target.Address).Value
maRef = Range(Target.Address).Offset(0, -1).Value
Application.EnableEvents = False
For Each c In znSaisie.Offset(0, -1)
If c = maRef Then c.Offset(0, 1) = maSaisie
Next c
Application.EnableEvents = True
End If
End Sub

En souhaitant que cela te convienne,
+
 

BenHarber

XLDnaute Occasionnel
OK : ta solution fonctionne très bien ; Elle est bien pratique puisqu'aucune variable n'est à déclarer !
Je vais donc me documenter sur 'EnableEvents' dont j'ignorais l'existence et dont j'entrevois l'utilité sur d'autres 'appli.'

Merci bcp Excel_lent (certainement pas si lent que ça !)
 

BenHarber

XLDnaute Occasionnel
Effectivement, c'est une question de choix !
J'entrevois donc cette solution : pour les travaux personnels / professionnels que je suis moi-même le seul à piloter personnellement tout seul (...), l'utilisation de 'EnableEvents' me semble appropriée.
Par contre, pour les applications mises entre les mains d'utilisateurs qui n'ont de cesse d'inventer des manip auxquelles on n'avait même pas conscience que ça pouvait exister, la déclaration de variables 'drapeaux' me semble être un sage réflexe.

Merci à vous pour vos conseil.

BenHarber
 

_Thierry

XLDnaute Barbatruc
Bonjour BenHarber, Cher José, Pascal, Excel_Lent, le Forum

Ayant participé au Fil que Pascal a mis en ligne (et à d'autres), je confirme que l'usage de 'EnableEvents' ne doit être réservé à un usage précis si l'on veut pûrement et simplement éradiquer cette fonctionnalité d'actions sur évènements pendant un traitement sur une application pouvant faire appel à des macros évènementielles et absolument pas pour un simple blocage temporaire pendant l'éxécution d'autre évènementielles.

Je m'explique, par exemple vous avez un Classeur Maître de mise à jour de différents Classeurs Secondaires, ceux-ci étant susceptibles de contenir des macros évènementielles pouvant interférer et interagir de manière non-attendue... Alors là oui, EnableEvents à False permettra l'inhibition même des 'WorkBook_Open' et autres... Il a été prévu en ce sens par VB.

Mais sinon à l'intérieur d'un même Private Module pour controller les Inter-Actions des évènementielles entre elles, c'est un peu mettre un éléphant pour boucher un trou de souri, alors qu'une toute petite Boolean suffit amplement et les risques déjà décrits ici et dans le fil mis en lien sont réduits à zéro.

Bonne Fin de Dimanche
[ol]@+Thierry[/ol]
 

Statistiques des forums

Discussions
300 717
Messages
1 986 642
Membres
209 555
dernier inscrit
Cookone