Bonjour Marco,
pour trouver un nom, j'ai utilisé Find() ; d'anglais en français : find = trouver.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
en utilisant les constantes "xl" du VBA, j'aurais écrit pour le 1er Find() :
Set cel = [BK1].Resize(d).Find(OldName, , xlFormulas, xlWhole, xlByRows)
en utilisant directement les nombres, c'est un peu plus court :
Set cel = [BK1].Resize(d).Find(OldName, , -4123, 1, 1)
ça fait exactement la même chose ; mais attention : tu as écris « 4123 »
au lieu de « -4123 » : ici, le nombre doit être négatif.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pour le 2ème Find(), c'est pareil ; avec les constantes "xl" du VBA, j'aurais écrit :
Set cel = .Range("DJ13:DJ21, EI13:EK21").Find(OldName, , xlFormulas, xlWhole, xlByRows)
au lieu de :
Set cel = .Range("DJ13:DJ21, EI13:EK21").Find(OldName, , -4123, 1, 1)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
au début, quand j'utilisais « -4163, 1, 1 », c'était équivalent à :
Set cel = [BK1].Resize(d).Find(OldName, , xlValues, xlWhole, xlByRows)
Set cel = .Range("DJ13:DJ21, EI13:EK21").Find(OldName, , xlValues, xlWhole, xlByRows)
en plus court, ça donne :
Set cel = [BK1].Resize(d).Find(OldName, , -4163, 1, 1)
Set cel = .Range("DJ13:DJ21, EI13:EK21").Find(OldName, , -4163, 1, 1)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
donc pour passer de xlValues à xlFormulas, il m'a suffit de changer 6 en 2 :
-4163 est devenu -4123.
ce qu'il faut retenir, c'est qu'on peut utiliser xlValues (= -4163) quand il n'y a pas
de cellules masquées ; sinon, on est obligé d'utiliser xlFormulas (= -4123) même
si on cherche une simple valeur (un nom dans ton exo) et non pas une formule.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
tu as vu qu'avec xlValues, .Find() ne trouve pas le nom dans la colonne BK car
elle est masquée ; donc si je n'avais pas trouvé l'astuce du xlFormulas, j'aurais
été obligé d'utiliser ces étapes :
1) afficher la colonne BK (la rendre visible) pour que .Find() avec xlvalues
puisse trouver un nom (s'il existe) : Columns("BK").Hidden = False
2) faire la recherche : Set cel = [BK1].Resize(d).Find(OldName, , -4163, 1, 1)
3) masquer la colonne BK juste pour remettre comme c'était avant, dans
ton fichier initial : Columns("BK").Hidden = True
de plus, par rapport à la feuille "Mois" qui est protégée, j'aurais dû déplacer
le ActiveSheet.Unprotect avant Columns("BK").Hidden = False ; pour le
ActiveSheet.Protect : emplacement inchangé car en étant après le
cel.Value = NewName il est aussi après Columns("BK").Hidden = True
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
évidemment : même système d'étapes pour les feuilles "semaine" :
1) afficher les colonnes DJ:EK pour que le .Find() avec xlValues puisse trouver
un nom (s'il existe) : Columns("DJ:EK").Hidden = False
2) faire la recherche :
Set cel = .Range("DJ13:DJ21, EI13:EK21").Resize(d).Find(OldName, , -4163, 1, 1)
3) masquer les colonnes DJ:EK juste pour remettre comme c'était avant, dans
ton fichier initial : Columns("DJ:EK").Hidden = True
par rapport à la protection des feuilles "semaine", il faudrait déplacer le .Unprotect
avant Columns("DJ:EK").Hidden = False ; pour le .Protect : emplacement inchangé
car en étant
après le cel.Value = NewName il est
aussi après
Columns("DJ:EK").Hidden = True
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
dans ton exo, j'ai supposé qu'on remplace l'ancien nom par un nouveau nom
uniquement pour le premier ancien nom trouvé ; car j'ai eu l'impression que de
toutes façons, un ancien nom n'apparaît qu'une seule fois dans les plages de
cellules de recherche ; si dans ton fichier réel il y a plusieurs "ancien nom"
dans les plages de recherche :
1) si tu veux faire un remplacement uniquement pour le premier ancien nom
trouvé, ça sera ok : tu pourras utiliser le même code VBA.
2) si tu veux faire un remplacement pour TOUS les anciens noms trouvés,
ça ne marchera pas ; il faudra modifier le code VBA pour utiliser aussi
FindNext(), en plus du Find().
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pour voir la syntaxe de Find(), tu peux faire une recherche google avec ce texte :
« vba range.find » (ne tape pas les guillemets) ; en haut de la liste des résultats,
clique sur le cadre de "Microsoft Learn" qui contient ce lien bleu :
Range.Find, méthode (Excel) | Microsoft Learn
s'il y a le mot "méthode", c'est car .Find est une des très nombreuses méthodes
du VBA Excel ; tu trouveras sur ce lien plein d'infos utiles. :) il y a même deux
exemples de codes VBA avec .Find() et .FindNext(). :)
lien direct sur l'article Microsoft du Range.Find : ICI
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
au cas où tu as besoin de faire un remplacement pour plusieurs anciens noms
trouvés, essaye d'abord de faire toi-même les modifs nécessaires de mon
code VBA, en t'aidant du 2ème exemple de code VBA (du lien précédent).
si tu y arrives : parfait ! :) sinon, tu pourras me demander de le faire pour toi ;
mais dans ce cas, envoie-moi un autre fichier exemple où il y aura plusieurs
anciens noms à remplacer par NewName dans ces plages de recherche :
colonne BK de la feuille "Mois", et sur les feuilles "semaine" : DJ13:DJ21
et EI13:EK21 ; ainsi, ça me permettra de vérifier que mon nouveau code
VBA marchera, car s'il n'y a rien à remplacer, c'est pas terrible ! ;)
rhodo