Modifier nom avec un USF dans colonnes masquées

0

Bonjour le forum,

Je me suis créé un fichier pour modifier les noms des personnes avec un USF sur certaines feuilles.

Le fichier fonctionne correctement.

J’ai un 2ème fichier identique qui lui a les colonnes à modifier masquées, et mon code actuel ne fonctionne pas avec les colonnes masquées.

J’ai beau chercher, mais je n’ai pas trouvé de code me permettant de faire fonctionner mon 2ème fichier

Les colonnes masquées sont :

Feuille Mois : colonne BK

Toutes les feuilles semaine : DJ à EK

Un petit coup de main serait le bienvenu.

D’avance merci

Marco

Modif_Nom
    Marco Posté le 15 décembre 2025, 17:30
    par Marco
    Répondre
    0

    Bonjour,

    Test un truc comme ça Voir ICI

    Cordialement

    Posté le 16 décembre 2025, 14:17
    0

    Bonjour le Forum,

    Merci pour ton code, mais celui-ci fonctionne seulement pour la feuille Mois.

    Pour les feuilles semaine aucun changement, il manquerait un bout de code.

    J'ai testé mais sans succès.

    Marco

    Marco Posté le 16 décembre 2025, 18:00
    par Marco
    0

    Bonjour Marco,

    ton fichier en retour : Modif Nom

    * à l'ouverture du fichier, tu es sur la feuille "Mois".

    * fais Ctrl m (ou clique sur le bouton "MODIFIER").

    * appuie sur la touche Echap : ça ferme le formulaire ; c'est bien pratique
    pour quitter rapidement le formulaire, surtout si tu avais fait Ctrl m par
    erreur ou si tu te ravises après-coup.

    * fais Ctrl m ; choisis un nom de la liste, par exemple "Cédric" ; comme
    Nouveau Nom, mets par exemple "Céline" ; clique sur "VALIDER" puis
    sur "Oui" ; vérifie la modif en BK9 et sur les feuilles "semaine".

    si besoin, tu peux demander une adaptation.
    à te lire pour avoir ton avis.  :)

    rhodo

    rhodo Posté le 18 décembre 2025, 08:20
    par rhodo
    0

    Bonjour rhodo et le forum,

    Merci pour ton fichier, mais au départ les colonnes dans mon fichier sur les différentes feuilles sont masquées.

    Et dans ton fichier celle-ci ne le sont pas.

    Aurais-tu une autre solution.

    Merci

    Marco


    Posté le 18 décembre 2025, 09:23
    0

    Bonsoir Marco,

    désolé pour le très gros retard, mais j'avais des affaires persos à résoudre.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    quand j'ai lu ton message, je me suis dit : « ??? ben il suffit juste que tu masques les colonnes ;
    ne me dis pas que tu ne sais pas faire ça !  ;) »

    mais au temps pour moi, je me suis trompé : tu as parfaitement raison, car quand les colonnes
    sont masquées, le .Find() que j'ai utilisé ne trouve pas une valeur dans une colonne qui est
    masquée !  :(

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    la première idée qui vient, c'est d'afficher les colonnes juste avant le .Find() puis de les masquer
    de nouveau après le .Find() ; avec Application.ScreenUpdating = 0 qui est bien avant et qui gèle
    la mise à jour de l'écran, l'affichage / masquage (même sur plusieurs feuilles) est visuellement
    non perceptible pour l'utilisateur.

    mais pour corriger le problème en cause, j'ai trouvé un moyen bien plus simple qui évite de devoir
    afficher / masquer les colonnes juste pour une exécution du Find() : au lieu de chercher une valeur
    (xlValues = -4163), il suffit de faire la recherche sur une formule (xlFormulas = -4123) ; donc pour
    les 2 Find(), il m'a suffit de remplacer le -4163 par -4123 pour que ça marche.  :)  je n'ai fait aucun
    autre changement dans mon code VBA.  :)

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    perso, je préfère utiliser les constantes VBA -4163 ou -4123 qui sont plus courtes à écrire et à lire
    que xlValues et xlFormulas ; pour la même raison de concision, j'ai mis 52 pour mon MsgBox ;
    c'est 48 (vbExclamation) + 4 (vbYesNo) ; le test de la réponse est avec 7 = vbNo.

    mais évidemment, c'est une question de goût : si tu préfères mettre à la place les valeurs littéraires,
    fais-le (même si ça allongera la longueur des lignes de code VBA).

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    voici le fichier corrigé, avec aussi les colonnes masquées, tout comme dans ton fichier transmis
    avant : Modif Nom (corrigé) ; désolé pour mon erreur ; si tu as des questions, n'hésite pas.  :)

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    juste pour info, j'ai compris pourquoi la solution de l'autre contributeur n'a pas marché pour les
    feuilles "semaine" : avec son Find() qui utilise xlValues, il a oublié d'afficher les colonnes avant
    le Find() puis les masquer après ; donc en fait, le code pour les feuilles "semaine" était bien là,
    mais il manquait cette "manip" VBA, qu'il avait pourtant bien utilisée pour la feuille "Mois".

    merci à vous deux car en me penchant sur le problème, j'ai découvert l'astuce de la recherche
    avec xlFormulas au lieu de xlValues quand y'a des colonnes (ou des lignes) masquées ; c'est
    tellement pratique de ne plus devoir afficher / masquer les plages de cellules juste pour faire
    une recherche dans des plages de cellules masquées !  :)

    rhodo

    rhodo Posté le 18 décembre 2025, 21:56
    par rhodo
    0

    Bonjour rhodo et le forum,

    Merci pour tes codes et tes explications.

    Mais je suis débutant et je n'ai pas tout compris, aux niveaux des Find et 4123 ??
    afficher / masquer les colonnes juste pour une exécution du Find() : au lieu de chercher une valeur
    (xlValues = -4163), il suffit de faire la recherche sur une formule (xlFormulas = -4123) ; donc pour
    les 2 Find(), il m'a suffit de remplacer le -4163 par -4123 pour que ça marche.  :) 

    Marco
    Marco Posté le 19 décembre 2025, 14:22
    par Marco
    0

    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

    rhodo Posté le 19 décembre 2025, 17:36
    par rhodo
    0

    Bonjour rhodo et le forum,

    Merci pour toutes ces explications.

    Je vais faire une copie et les garder précieusement.

    Bon week-end et bonnes fêtes à toi et au forum.

    Marco 


    Marco Posté le 20 décembre 2025, 09:12
    par Marco

    Si vous n'êtes pas inscrit sur le site, vous pouvez poster librement (en tant qu'invité).
    Pour cela, indiquez un pseudonyme (nom d'utilisateur) et une adresse email :