Microsoft 365 Copie de "noms" intenpestive lors d'une copie de feuille.

Carnould

XLDnaute Junior
Bonjour à tous,
Lors d'une copie de feuille, que ce soit manuellement ou par VBA, si cette feuille possède des listes déroulantes alimentées par des tableaux nommés (avec étendue "classeur"), le gestionnaire des noms fait apparaître une duplication de ces tableaux nommés avec à chaque fois une étendue correspondant aux nouvelles feuilles créées.
Cela n'empèche nullement le fonctionnement des listes déroulantes sur ces nouvelles feuilles mais je me retrouve avec beaucoup de noms identiques dans le gestionnaire des noms ce qui nuit à la clareté. Si je supprime manuellement ces nouveaux noms créés, le fonctionnement des listes déroulantes reste normal.

Etant donnée que je fais ces duplications (nombreuses) par VBA, existe-t-il un moyen d'éviter ces duplications de noms qui ne servent à rien du tout.

Il semblerait que ce phénomène n'existe pas si la liste déroulante est alimentée par un tableau NON nommé mais ce n'est pas ce que je souhaite.

Merci d'avance pour votre aide.

Christian
 

eriiic

XLDnaute Barbatruc
Bonjour,

vu que c'est le fonctionnement normal d'excel, pas d'autre choix que de les supprimer après.
Pour ne pas compliquer inutilement, j'ai considéré que tu n'avais aucun nom niveau feuille à garder dans tout le classeur. Sinon précise.
A mettre dans le module de la feuille que tu copies :
Code:
Private Sub Worksheet_Deactivate()
    Dim nom As Name, ok As Boolean
    For Each nom In ActiveWorkbook.Names
        If InStr(nom.Name, "!") > 0 Then nom.Delete
    Next nom
End Sub
eric
 

Carnould

XLDnaute Junior
Bonjour,

vu que c'est le fonctionnement normal d'excel, pas d'autre choix que de les supprimer après.
Pour ne pas compliquer inutilement, j'ai considéré que tu n'avais aucun nom niveau feuille à garder dans tout le classeur. Sinon précise.
A mettre dans le module de la feuille que tu copies :
Code:
Private Sub Worksheet_Deactivate()
    Dim nom As Name, ok As Boolean
    For Each nom In ActiveWorkbook.Names
        If InStr(nom.Name, "!") > 0 Then nom.Delete
    Next nom
End Sub
eric
Merci eriiic pour la rapidité de ta réponse.

Effectivement, actuellement je n'ai aucun nom au niveau "feuille" (mais j'en ai niveau classeur) et ta procédure fonctionne parfaitement. J'ai créé quelques noms niveau feuille et tous ces noms disparaissent avec cette procédure. Dans l'état actuel du développement, ça ne me pose pas de problème mais c'est sans présumé de l'avenir.

Etant donné que je connais les "noms" qui sont intempestivements générés par ma procédure de duplication, comment adapter ton code pour l'inclure en fin de ma procédure de duplication.
J'ai 4 noms qui se dupliquent :
LstAppareils
LstInsructeurs
LstBanques
LstModePaiement
Et je connais dans ma procédure de duplication le nom de la nouvelle feuille (qu'on va appeler ici "NomPilote").
Ne serait-il pas plus simple de supprimer alors en fin de ma procédure ces 4 suppressions ? Pour l'instant ça dépasse mes compétences.

Questions subsidiaires ,
1-dans ta procédure je n'ai pas compris pourquoi sa portée se limitait aux "noms" du niveau "feuilles" uniquement. C'est peut-etre cette compréhension qui m'empèche de modifier ma procédure de duplication.
2-dans ta procédure la variable ok a-t-elle une utilité ?

Merci par avance eriiic
Cordialement
Christian
 

Dranreb

XLDnaute Barbatruc
Bonjour.
je n'ai pas compris pourquoi sa portée se limitait aux "noms" du niveau "feuilles" uniquement
C'est parce que lorsqu'on duplique une feuille définissant des noms au niveau classeur cela en entraine la création d'homonymes forcément au niveau feuille.

Je pense que la procédure de @eriiiic peut être simplifiée comme ceci :
VB:
Private Sub Worksheet_Deactivate()
   Dim Nom As Name
   For Each Nom In Me.Names
      Nom.Delete
      Next Nom
   End Sub
Mais il vaudrait mieux l'effectuer lors de la création de la feuille à mon avis.
 

eriiic

XLDnaute Barbatruc
Bonjour,
Bonjour Dranreb,

ok est un résidu.
Un nom niveau feuille est formé ainsi : nomFeuille!ref
C'est donc la présence du ! qui nous le signale.
Pour limiter à ta liste :
VB:
    Const nomDup = "LstAppareils,LstInsructeurs,LstBanques,LstModePaiement"
    Dim Nom As Name
    For Each Nom In ActiveWorkbook.Names
        If InStr(Nom.Name, "!") > 0 Then
            If InStr(nomDup, Split(Nom.Name, "!")(1)) > 0 Then Nom.Delete
        End If
    Next Nom
 

eriiic

XLDnaute Barbatruc
Si tu veux, mais dans ce cas remplace Me par ActiveSheet (Edit : ce qu'on peut faire aussi dans la mienne).
Et il voulait restreindre à une liste bien définie. Il anticipe peut-être un éventuel futur besoin de nom niveaux feuille.
eric
 

Dranreb

XLDnaute Barbatruc
C'est ce qu'il faudra faire probablement pour les supprimer à la copie de la feuille, à moins de s'arranger pour l'avoir dans une variable As Worksheet. Sinon dans un module d'objet Worksheet, Me désigne bien cet objet.
 

Dranreb

XLDnaute Barbatruc
Ah, je n'avais pas compris que ça devais s'exécuter à la désactivation de la feuille modèle, étant donné que la feuille copiée est munie aussi de cette procédure.
De toute façon je pense qu'il vaut mieux l'effectuer seulement une fois, lors de la copie de la feuille et pour celle créée seulement.
 

Carnould

XLDnaute Junior
Je vais essayer de tout comprendre de vos échanges. Effectivement je préférerais que l'action de suppression se fasse à la copie de la feuille et seulement pour les noms créés par rapport à cette nouvelle feuille. Je vous joints une photos des noms. Faut-il utiliser le nom (ex : LstAppareils) ou "fait référence à" (ex: Tableau7[Appareils])
 

Pièces jointes

  • Noms.jpg
    Noms.jpg
    432.1 KB · Affichages: 23

Dranreb

XLDnaute Barbatruc
Quand est-ce que vous vous déciderez à joindre un classeur ??
Et pourquoi mettez vous des noms sur des tableaux qui en ont déjà un ?
(bien qu'il ne soit dans aucune collection Names)
Et pourquoi reproduisez vous des tableaux sur les feuilles ? S'ils sont pour des validations de données, mettez les donc sur une feuille à part.
 
Dernière édition:

eriiic

XLDnaute Barbatruc
Nonobstant les remarques pertinentes de Dranreb, as-tu seulement testé ce que je te proposais ?
Et ça ne se fera qu'à la copie de la feuille puisque tu la fais par macro et tu as dit le mettre en suivant.
Si tu veux boucler sur les noms de la feuille ça fait gagner un test oui :
VB:
    Const nomDup = "LstAppareils,LstInsructeurs,LstBanques,LstModePaiement"
    Dim Nom As Name, sh As Worksheet
    ' sh = feuille crée (ou ActiveSheet possible si elle vient juste d'être crée)
    For Each Nom In sh.Names
        If InStr(nomDup, Split(Nom.Name, "!")(1)) > 0 Then Nom.Delete
    Next Nom
eric
 

Dranreb

XLDnaute Barbatruc
Comme dit au poste #6 le nom dans la collection Name du Worksheet est certes repris de celle du Workbook, mais sans le préfixe de feuille. Le nom ne peut donc y exister avec ce préfixe. Donc Nom.Delete suffit, sans test, ou bien sh.Names("LstAppareil").Delete etc.
Ou bien For N = 1 to 4: sh.Names(Choose(N, "LstAppareils", "LstInsructeurs", "LstBanques", "LstModePaiement")).Delete: Next N
 
Dernière édition:

eriiic

XLDnaute Barbatruc
Je dois avoir un excel particulier :

2020-04-13_14-02-42.png

de toute façon le demandeur a assez d'éléments pour prendre la syntaxe qui lui va bien.
eric
 

Discussions similaires

Réponses
12
Affichages
449