Comportement étrange de Vba
Bonjour,
J'ai un programme que j'ai fait en Vba et qui fonctionne depuis des années. Tout à coup, ça plante. En y allant de pas à pas, je finis par trouver exactement où. C'est la méthode « replace » qui, vous ne le croirez pas, fait changer la feuille active. (!!!!)
Voici le code :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
With Rg
.Replace What:=" ", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, _
MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
.Replace What:="'", Replacement:=""
.Replace What:="-", Replacement:=""
.Replace What:="é", Replacement:="e"
.Replace What:="ê", Replacement:="e"
[...............ici on saute une douzaine de remplacements]
.Replace What:="ù", Replacement:="u"
End With |
Il s'agit de remplacer les espaces et les caractères accentués d'une chaîne qui est dans une cellule. Rg est une variable de type « range » qui pointe sur cette cellule.
Aussitôt que le programme arrive au premier « replace », le focus passe de la feuille 1 à la feuille 2. Comme je suis en pas à pas, je peux cliquer pour redonner le focus à la page 1 et alors, au deuxième « replace », de nouveau c'est la feuille 2 qui est activée. Si je clique sur une autre feuille, 3, 4, 5, c'est toujours la feuille 2 qui est réactivée si je fais avancer le programme d'une ligne.
Je travail avec une version Office 2007 qui a toujours bien fonctionné. J'ai fait rouler les diagnostiques dans l'option « Ressources » de mon Excel et tout semble en ordre. Sauf qu'à la fin, on m'envoie sur le Net chez Microsoft sur une page qui n'existe plus.
Pierre Cloutier
---
Comportement étrange de Vba
Bonjour et merci de votre réponse,
Voici la fonction qui appelle le code en question :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| Function SaS(a As String, f As Boolean) As String
' Enlève les accents à une Chaîne '''' si f est vrai, force en minuscules
' Fait un Range avec la chaîne puis appelle Sa
Dim Rg As Range
Application.ScreenUpdating = False
Range(TrouveChrCol("XX") & "2").Select ' la fonction TrouveChrCol trouve le caractère de la colonne qui a "XX" en cellule 1
Selection.Value = a ' a est la chaîne à modifier
Set Rg = Selection
Sa Rg ' enlève les accents
If f Then
SaS = LCase(Rg.Value)
Else
SaS = Rg.Value
End If
End Function |
Et voici la procédure « Sa » (Sans Accent) complète.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
Sub Sa(Rg As Range) ' Sa = Sans Accent
' Enlève les accents ; ô devient o
Application.ScreenUpdating = False
With Rg
.Replace What:=" ", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, _
MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
.Replace What:="'", Replacement:=""
.Replace What:="-", Replacement:=""
.Replace What:="é", Replacement:="e"
.Replace What:="ê", Replacement:="e"
.Replace What:="è", Replacement:="e"
.Replace What:="ë", Replacement:="e"
.Replace What:="ï", Replacement:="i"
.Replace What:="î", Replacement:="i"
.Replace What:="à", Replacement:="a"
.Replace What:="â", Replacement:="a"
.Replace What:="á", Replacement:="a"
.Replace What:="ç", Replacement:="c"
.Replace What:="ô", Replacement:="o"
.Replace What:="ó", Replacement:="o"
.Replace What:="ö", Replacement:="o"
.Replace What:="û", Replacement:="u"
.Replace What:="ù", Replacement:="u"
End With
End Sub |
En Vba, je suis un inculte. J'ai tout appris par moi-même et donc il me manque beaucoup de base. Mais je suis débrouillard et je réussis quand même à parvenir à mes buts. Dans ce cas-ci, j'ai vu que le « Chercher/Remplacer » ne fonctionne qu'avec un Range. J'utilise donc une cellule en dehors de mon tableau, j'y place ma chaîne et cette cellule devient Rg. Ensuite la méthode « replace » peut-être utilisée.
Explication :
La fonction principale s'appelle SaS et elle appelle Sa. À l'aide de ma fonction TrouveChrCol() elle trouve le caractère de la colonne qui a "XX" en rangée 1. C'est que mon tableau (une liste de membres) augmente d'une colonne à chaque événement auquel ces membres sont invités. Donc la colonne "XX" change de nom régulièrement. Aujourd'hui : KL ou 298.
---
Comportement étrange de Vba
Bonjour,
Citation:
Pourquoi utilises-tu la Méthode Range.Replace alors que tu ne veux finalement travailler que sur une chaîne de caractères (la valeur d'une seule cellule) ?
Comme je vous ai dit, ça fait 8 ou 9 ans que j'ai écris ce code. Je débutais en Vba Excel et j'utilisais l'enregistreur de macros pour m'indiquer les bonnes (??) méthodes à utiliser. Ce n'est que beaucoup plus tard que j'ai découvert qu'il y avait aussi une fonction « Replace » et je m'en suis servi à d'autres occasions par la suite.
Comme je vous ai dit aussi, ce code fonctionnait depuis des années. Pourquoi, tout à coup, cette commande fait-elle flippé la feuille Excel ?
Que s'est-il passé ? Serait-ce une de ces mises à jour de Microsoft ?
Bon, étant pro-actif, j'ai fait quelques tests :
Peu importe quelle est la feuille active, le passage du curseur (surlignement jaune) sur cette ligne de code
Code:
.Replace What:="'", Replacement:=""
fait passer à la feuille 2. Toujours la feuille 2 peu importe quelle feuille est active à ce moment-là.
J'ai essayé de changer de colonne. Pour cela, sans modifier le code, j'ai changé la valeur de la variable pointeur à la main dans la fenêtre Exécution. Et là, plus de problème. Mais un autre test m'a montré que ce n'est pas le numéro de la colonne qui cause le problème. Tout laisse croire que c'est le code lui-même où est déterminé l'adresse de la cellule à traiter. Le voici :
Code:
1 2 3 4 5 6 7
| Dim Rg As Range
Range(TrouveChrCol("XX") & "2").Select ' la fonction TrouveChrCol trouve le caractère de la colonne qui a "XX" en cellule 1
Selection.Value = a ' a est la chaîne à modifier
Set Rg = Selection
Sa Rg ' enlève les accents |
J'ai donc essayé une toute petite modification qui semble être absolument la même chose. Voici le nouveau code :
Code:
1 2 3 4 5 6
| Dim Rg As Range
Set Rg = Range(TrouveChrCol("XX") & "2") ' la fonction TrouveChrCol trouve le caractère de la colonne qui a "XX" en cellule 1
Rg.Value = a ' a est la chaîne à modifier
Sa Rg ' enlève les accents |
La différence : 2 lignes au lieu de 3 (plus élégant) et je n'utilise plus le mot clé Selection. Et là, le problème est résolu !
Y a-t-il quelque chose à comprendre là-dedans ? J'ai souvent lu, sur des forums, des critiques sur l'utilisation du mot clé Selection. Mais au point de faire planter les programmes... non. Et, de toutes façons, l'enregistreur de macros d'Excel utilise Selection à profusion.
Pierre Cloutier
---