boucle infinie sur événement Worksheet_Change

M

m0j0man_fr

Guest
Bonjour à tous, voilà mon problème:

feuille "code postaux" de mon classeur:
colonne A : il y a une liste de noms de villes (tous en majuscules)
colonne B : il y a les codes postaux des villes

feuille "Liste clientèle" de mon classeur:
lorsque l'utilisateur tape dans la colonne E un nom de ville une macro va chercher le code postal correspondant dans la feuille "code postaux" et l'insere automatiquement dans la colonne F de la feuille travail.
cette macro se trouve dans le code de la feuille travail, c'est la procédure evenementielle Worksheet_Change(ByVal Target As Range) avec un test pour savoir si target.column=5 (colonne des villes)

jusque là impeccable :)

là ou ca se corse c'est que je veux que les noms de ville que l'utilisateur entre dans la colonne F soient toujours en majuscules.
J'ai donc ajouté au code de la procédure événementielle (qui jusque là se contentait d'aller chercher le code postal) deux lignes de code avec la fonction Ucase qui change le contenu de la cellule en majuscules.

Malheureusement , cela a pour effet de reboucler infiniment sur l'événement change. en effet:
l'utilisateur entre un nom -> événement change
donc convertion du nom en majuscule
donc re événement change
donc reconversion en majuscules
donc re re événement change
etc...

et voilà, c'est en vrac !

donc ma question est simple:
je veux :
1-convertir le contenu de la cellule en majuscules quand on entre du texte dans la cellule
2-utiliser le texte convertit pour une recherche
et éviter cette p.... de boucle infinie !

merci pour vos propositions
je joins le code de ma macro:

*************************************************
*************************************************
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ville As String
'
If Target.Column = 5 Then
'
ville = UCase(Target.Value)
Target.Value = ville
'
derligne = Sheets("code postaux").Range("A1").End(xlDown).Row
For ligne = 2 To derligne
If Sheets("code postaux").Cells(ligne, 1) = ville Then
Target.Offset(0, 1).Value = Sheets("code postaux").Cells(ligne, 2)
Exit Sub
End If
Next ligne
End If
'
End Sub
 
M

myDearFriend

Guest
Bonsoir m0j0man_fr,


Je n'ai pas testé mais ceci conviendra peut être :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim ville As String
'
If Target.Column = 5 Then
'
Application.EnableEvents = False
ville = UCase(Target.Value)
Target.Value = ville
'
derligne = Sheets("code postaux").Range("A1").End(xlDown).Row
For ligne = 2 To derligne
If Sheets("code postaux").Cells(ligne, 1) = ville Then
Target.Offset(0, 1).Value = Sheets("code postaux").Cells(ligne, 2)
Exit Sub
End If
Next ligne
Application.EnableEvents = True
End If
'
End Sub



Cordialement,
Didier_mDF
 
L

Lord Nelson

Guest
Salut à tous,

Tu pourrais éviter la cascade d'évènements en plaçant un Flag, de cette manière :

Public Flag As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
Dim ville As String
If Flag = True Then Exit Sub
If Target.Column = 5 Then
If Target.Rows.Count > 1 Then Exit Sub
If Not IsNumeric(Target) Then
Flag = True
ville = UCase(Target.Value)
Target.Value = ville
Flag = False

derligne = Sheets("code postaux").Range("A1").End(xlDown).Row
For ligne = 2 To derligne
If Sheets("code postaux").Cells(ligne, 1) = ville Then
Target.Offset(0, 1).Value = Sheets("code postaux").Cells(ligne, 2)
Exit For
End If
Next ligne
End If
End If
End Sub

A+
Horatio
 
M

Michel_M

Guest
Bonjour à tous,

Pourquoi ne pas utiliser l'évènement selectionchange au lieu de change ?

a voir cependant: prise en compte des touches curseurs si l'utilisateur se sert des flèches de déplacement sans valider par "enter"

Michel
 

Discussions similaires

Statistiques des forums

Discussions
312 330
Messages
2 087 349
Membres
103 526
dernier inscrit
HEC