Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2021 Comment supprimer des noms du gestionnaire de noms dans un classeur

jeff1494

XLDnaute Occasionnel
Bonsoir à toutes et tous;

J'ai créé un petit outil me permettant de suivre mes ventes dans un vide-grenier permanent.
Ce classeur est composé de plusieurs feuilles qui contiennent la liste des objets mis en vente, la liste des catégories et types d'objets, les marques de ces objets, ....
Dans ce classeur je gère des noms soit pour les tableaux structurés que j'utilise soit pour des cellules contenant des paramètres permettant l'évolution de compteurs.

Comme je fais des mises en vente espacées dans le temps, je veux reprendre dans un nouveau classeur ayant la même structure de feuilles des données provenant d'anciennes ventes. Par exemple j'ai un classeur contenant les résultats d'une vente du mois de septembre avec des objets qui n'ont pas été vendus, et je voudrais récupérer certaines feuilles de ce classeur dans un nouveau classeur pour une vente en Janvier.

Cette partie ne me pose pas de problèmes, j'arrive à récupérer les feuilles que je veux, grâce à une macro que se lance à l'ouverture du classeur. Pour ne pas importer à chaque ouverture des feuilles j'ai un flag (feuille params) que je positionne à la valeur 1 après avoir importé les feuilles.

Lors de l'importation des feuilles du fait que les classeurs ont la même structure j'ai le problème suivant :
Comme on peut le voir sur la capture d'écran suivante, j'ai plusieurs fois le même nom mais qui fait référence à des classeurs différents (Cf par exemple "NumObj".



Je cherche donc à pouvoir supprimer par une macro ces noms qui sont inutiles.
J'ai pensé passer par une macro qui me liste les noms (Voir dans mon fichier le module "List_Names") dans une nouvelle feuille "Liste_Noms", pensant que cela pourrait résoudre mon problème.
Voici le code de cette macro :

VB:
Public Sub List_Names()
Dim nm As Name, i As Long
    Worksheets.Add After:=Sheets(Sheets.Count)
    ActiveSheet.Name = "Liste_Noms"
    
    i = 1
    'On Error Resume Next
    For Each nm In ActiveWorkbook.Names
        i = i + 1
        
        With ActiveSheet
            .Cells(1, 1).Value = "Nom"
            .Cells(1, 2).Value = "Se réfère à"
            
            .Cells(i, 1).Value = nm.Name
            .Cells(i, 2).Value = "'" & nm.RefersTo
        End With
    Next
    With Range("A:B")
        .EntireColumn.AutoFit
    End With
    MsgBox "Nombre de nom(s) : " & i, 64, "Information"
End Sub

La ligne contenant ".Cells(i, 2).Value = "'" & nm.RefersTo" est celle qui est intéressante. En effet je dois concaténer un guillemet simple à la valeur "nm.RefersTo" car sinon il me manque des noms qui sont en double dans la liste. Pourquoi? Aucune idée.

Maintenant que j'ai la liste des noms dans ce nouveau classeur je voudrais pouvoir supprimer tous les noms qui font référence à un autre classeur que celui qui est actif.
Je ne sais pas comment faire, et c'est pour cela que je me tourne vers vous

Vous avez en pièce jointe mon classeur, de manière à visualiser où j'en suis.

Remarques :
1) - L'onglet du ruban "Outils de saisie" n'est pas actif, donc ne pas l'utiliser.
2) - Les noms barrés en rouge sur la feuille "Infos" n'existent pas encore et seront mises en place plus tard.

Donc si une personne (ou plusieurs) avait la gentillesse de m'aider je leur en serait reconnaissant.

En attendant je vous souhaite à toutes et tous une bonne soirée.
 

Pièces jointes

  • Vente-Vide-Grenier-V00.xlsm
    75.4 KB · Affichages: 6

cathodique

XLDnaute Barbatruc
Bonsoir,

Si j'ai bien compris code à tester.
VB:
Sub SupprimerNomsDéfinis()
    Dim nom As Name
    Dim classeurActif As Workbook
    Set classeurActif = ThisWorkbook

    ' Parcourir les noms définis
    For Each nom In Application.Names
        On Error Resume Next
        If Not nom.RefersToRange Is Nothing Then
            If Not nom.RefersToRange.Worksheet.Parent Is classeurActif Then
                nom.Delete
            End If
        End If
        On Error GoTo 0
    Next nom

    MsgBox "Tous les noms définis qui font référence à un autre classeur ont été supprimés."
End Sub
 

vgendron

XLDnaute Barbatruc
hello

essaie ceci
VB:
Option Explicit

Public Sub List_Names()
Dim nm As Name, i As Long
    Worksheets.Add After:=Sheets(Sheets.Count)
    With ActiveSheet
        .Name = "Liste_Noms"
        .Range("A1") = "Nom"
        .Range("B1") = "Se réfère à"
        For Each nm In ActiveWorkbook.Names
            .Range("A" & .Rows.Count).End(xlUp).Offset(1, 0) = nm.Name
            .Range("B" & .Rows.Count).End(xlUp).Offset(1, 0) = "'" & nm.RefersTo
            If nm.RefersTo Like "='C:*" Then nm.Delete
        Next nm
        .Range("A:B").EntireColumn.AutoFit
        MsgBox "Nombre de nom(s) : " & .Range("A" & .Rows.Count).End(xlUp).Row, 64, "Information"
    End With
End Sub
 

vgendron

XLDnaute Barbatruc
et meme ceci pour connaitre le nombre de noms qui ont été supprimés directement
Code:
Option Explicit

Public Sub List_Names()
Dim nm As Name, i As Long
Dim NbSup As Integer
    Worksheets.Add After:=Sheets(Sheets.Count)
    NbSup = 0
    With ActiveSheet
        .Name = "Liste_Noms"
        .Range("A1") = "Nom"
        .Range("B1") = "Se réfère à"
        For Each nm In ActiveWorkbook.Names
            .Range("A" & .Rows.Count).End(xlUp).Offset(1, 0) = nm.Name
            .Range("B" & .Rows.Count).End(xlUp).Offset(1, 0) = "'" & nm.RefersTo
            If nm.RefersTo Like "='C:*" Then nm.Delete: NbSup = NbSup + 1
        Next nm
        .Range("A:B").EntireColumn.AutoFit
        MsgBox "Nombre de nom(s) : " & .Range("A" & .Rows.Count).End(xlUp).Row & Chr(10) & "dont " & NbSup & " ont été supprimés", 64, "Information"
        
    End With
End Sub
 

crocrocro

XLDnaute Impliqué
Bonjour le fil
@jeff1494 , concernant vos noms en double dans le gestionnaire des noms, voici quelques remarques :

L'attribution d'un Nom à une Plage peut être fait :

- Par le Gestionnaire de Noms -> Dans ce Cas on définit également sa portée (Classeur ou Feuille)

- Par la Zone de Nom (en haut à Gauche de la Feuille) -> sa Portée est définie automatiquement à Classeur
Si le nom que l'on cherche à attribuer :
existe déjà sur la feuille courante -> Sélection de la Plage portant ce nom
existe déjà sur une autre feuille avec une portée Classeur -> Sélection de la Plage portant ce nom
existe déjà sur une autre feuille avec une portée Feuille -> Création de Plage avec une portée Classeur

La Copie d'une feuille comportant des plages nommées

génère dans la nouvelle feuille autant de plages nommées que la feuille Source avec
Les Plages de Portée Classeur sont redéfinies avec une portée Feuille dans la nouvelle Feuille
Les Plages de Portée Feuille conservent leur portée Feuille dans la nouvelle Feuille

Dans votre liste, regardez la portée de chaque nom dans la colonne Étendue

Pour votre analyse des noms vous pouvez également regarder cette discussion Retrouver les dépendants de cellules nommées
 

Discussions similaires

Réponses
12
Affichages
357
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…