Je recherche une macro qui permette de savoir si une cellule porte déjà un nom
J’ai trouvé cette macro sur ne Net
Mais elle n’est parfaite :
1) Si il existe un seul nom qui renvoi à rien, elle plante obligatoirement
Exemple : 1 ligne supprimée qui comportait une cellule nommée et dont le nom serait resté dans le gestionnaire des noms.
2) Si il existe un seul nom qui renvoi à des cellules non contigües,
Elle plante également irrémédiablement.
3) Il y a d’autre cas, ou elle plante également (Dans des fichiers comportant un grand nombre de noms, sans que je sois parvenu à trouver la cause exacte ??
4) Si une cellule qui comporte deux noms, voir plus
Elle donnera seulement le dernier nom dans l’ordre alphanumérique
5) Une cellule comportant un nom, elle-même dans un groupe de cellules nommées
Elle donnera seulement le nom du groupe de cellules
Exemple : Cellule A1 nommée « Case »
Cellules A1 : D5 nommées « Zone »
A1 renvoie « Zone »
Si quelqu’un connait ou a déjà programmé une autre macro sans ces inconvénients …
Merci d’avance
Code:
Sub Nom_de_Cellule()
'déclarations
Dim nms As Names
Dim Ok As Boolean
Dim i As Integer
Dim Indice As Integer
Dim Nom_Cell As String
'initialisations
Ok = False
Set nms = ActiveWorkbook.Names
'teste si la cellule active correspond à un des noms
For i = 1 To nms.Count
'If nms(i).RefersToRange.Address = ActiveCell.Address Then Ok = True
If Not Intersect(ActiveCell, nms(i).RefersToRange) Is Nothing Then
Ok = True
Indice = i
End If
Next
'si oui
If Ok = True Then
Nom_Cell = nms(Indice).Name
MsgBox Nom_Cell
'sinon
Else
MsgBox "Sans nom défini"
End If
End Sub
Re : Macro permettant se savoir si une cellule porte déjà un nom
Bonjour Chebe,
Si l'on recherche les noms qui ont pu être donnés à une seule cellule (la cellule active), pourquoi ne pas utiliser simplement :
Code:
Sub ChercheNom()
Dim a$, n As Name
a = "=" & ActiveSheet.Name & "!" & ActiveCell.Address
For Each n In ThisWorkbook.Names
If n.RefersTo = a Then MsgBox n.Name, , "Nom"
Next
End Sub
Re : Macro permettant se savoir si une cellule porte déjà un nom
Re,
Si l'on préfère :
Code:
Sub ChercheNom()
Dim a$, n As Name, flag As Boolean
a = "=" & ActiveSheet.Name & "!" & ActiveCell.Address
For Each n In ThisWorkbook.Names
If n.RefersTo = a Then MsgBox n.Name, , "Nom": flag = True
Next
If Not flag Then MsgBox "Aucun nom..."
End Sub
Et bien je répond à ta question initiale, à moins que je l'ai mal comprise...
Si tu veux savoir si la cellule A1 a un nom ces 2 lignes de code te donnent le nom s'il existe (vide sinon) sans avoir besoin de boucler sur tous les noms.
Il suffit de tester...
Et pour une plage :
Code:
On Error Resume Next
nom = [A1:A5].Name.Name
Maintenant pour savoir si une cellule appartient à une plage nommée tu n'échapperas pas à une boucle.
Re : Macro permettant se savoir si une cellule porte déjà un nom
Bonsoir Chebe, le forum,
Pour le fun, une petite variation pour essayer de trouver les noms qui dans leur définition aboutissent à une zone dont la cellule active pourrait faire partie. Les noms dynamiques empêchent à mon avis d'affirmer qu'on a trouvé tous les cas.
VB:
Sub Nom_de_Cellule()
Dim test, OK As Boolean
Dim xN As Name, sh As Worksheet
Dim Niv, Nom, Formul, Plage, RgPlage As Range
On Error Resume Next
For Each xN In ThisWorkbook.Names
Niv = "": Nom = "": Formul = "": Plage = "": Set RgPlage = Nothing
Niv = xN.Parent.Name
Nom = xN.Name
Formul = xN.RefersTo
Set RgPlage = xN.RefersToRange
'cas où la plage n'existe pas (nom dynamique ?)
If RgPlage Is Nothing Then
'on tente d'évaluer le nom et sa plage
Set RgPlage = Application.Evaluate(xN.RefersTo)
End If
If Not Intersect(ActiveCell, RgPlage) Is Nothing Then
MsgBox " Pour la cellule => " & ActiveCell.Address(0, 0) & " <=" & vbLf & vbLf & _
"Niveau: " & Niv & vbLf & vbLf & "Nom: " & Nom & vbLf & vbLf & _
"Formule: " & Formul & vbLf & vbLf & "Plage: " & RgPlage.Address(-1, -1, xlA1, True)
End If
Next xN
Exit Sub
End Sub
Re : Macro permettant se savoir si une cellule porte déjà un nom
Re,
Si l'on veut aussi repérer les cellules (ou plages) définies par des formules du genre :
Code:
=DECALER(Feuil1!$A$3;;3)
=DECALER(Feuil1!$D$1;2;)
on peut utiliser cette macro :
Code:
Sub ChercheNom()
Dim n As Name, cel As Range
On Error Resume Next
For Each n In ThisWorkbook.Names
Set cel = Nothing
Set cel = Intersect(ActiveCell, Evaluate(n.Name))
If Not cel Is Nothing Then
MsgBox n.Name & n.RefersToLocal, , "Nom"
flag = True
End If
Next
If Not flag Then MsgBox "Aucun nom..."
End Sub
Elle liste tous les noms de plages où la cellule active se trouve.
Re : Macro permettant se savoir si une cellule porte déjà un nom
Bonjour le fil, le forum,
Il peut y avoir des noms définis dans la feuille, comme par exemple Zone_d_impression.
Si l'on veut les distinguer de ceux définis dans le classeur :
Code:
Sub ChercheNom()
Dim n As Name, cel As Range, titre$
On Error Resume Next
For Each n In ThisWorkbook.Names
Set cel = Nothing
Set cel = Intersect(ActiveCell, Evaluate(n.Name))
If Not cel Is Nothing Then
titre = "Nom dans la feuille"
If IsError(ActiveSheet.Names(n.Name).Name) Then titre = "Nom dans le classeur"
MsgBox n.Name & n.RefersToLocal & String(20, " "), , titre
flag = True
End If
Next
If Not flag Then MsgBox "Aucun nom..."
End Sub
Edit : c'est un peu superflu car le nom défini dans une feuille est restitué avec le nom de la feuille => Feuil1!LeNom, ce qui permet d'ailleurs de simplifier :
Code:
Sub ChercheNom()
Dim n As Name, cel As Range
On Error Resume Next
For Each n In ThisWorkbook.Names
Set cel = Nothing
Set cel = Intersect(ActiveCell, Evaluate(n.Name))
If Not cel Is Nothing Then
MsgBox n.Name & n.RefersToLocal & String(20, " "), , _
"Nom dans " & IIf(InStr(n.Name, "!"), "la feuille", "le classeur")
flag = True
End If
Next
If Not flag Then MsgBox "Aucun nom..."
End Sub
Re : Macro permettant se savoir si une cellule porte déjà un nom
Bonjour Mapomme
C’est bien plus que j'en n’attendais !
Tu sembles avoir tout prévu
La perfection
- Une petite question ?
Tu utilise le terme « Niveau » pour lister le nom du classeur
Est-ce que ce terme s'utilise pour désigner habituellement un classeur ?
Ou il y a une autre raison ?
- Juste un petit regret
Il n’y a rien de prévu pour indiquer quand la cellule n’a pas de nom
J’ai bien essayé de mettre une MsgBox « Pas de nom » avec succès
Mais comme je ne suis pas doué, elle s’affiche aussi s’il y a un nom !
- Je suis quand même arrivé à la prendre en défaut
Dans le cas, peut courant, il est vrai, que l’on utilise un même nom pour plusieurs cellules dans 2 feuilles du classeur
Exemple « Total » pour Feul1 :A20 et Feuil2 : A30
- Une autre question :
Je vois que dans ton exemple, tu as mis un nom de formule « Pi_2 »
Mais les noms de formules ne sont pas rattachés à une cellule
Donc ta macro n’apporte rien dans ce cas, non ??
Merci beaucoup pour ta solution
Et bravo pour la présentation
J'ai pas bien compris ce que tu voulais dire ?
Et je ne vois pas vraiment de différence avec la première solution
J'avais pensé un instant que tu faisais référence à des noms communs à plusieurs cellules dans plusieurs feuille du même classeur, (voir mon post précédant) ?
Mais il ne sont pas listés non plus
Re : Macro permettant se savoir si une cellule porte déjà un nom
Bonjour Chebe, Job75,
Tu utilise le terme « Niveau » pour lister le nom du classeur
Est-ce que ce terme s'utilise pour désigner habituellement un classeur ?
Ou il y a une autre raison ?
Comme l'a précisé Job75, le "niveau" désigne le nom du classeur si le nom retenu pour la cellule est défini pour tout le classeur. Si le nom est seulement défini pour une feuille, "niveau" indique le nom de cette feuille.
Il n’y a rien de prévu pour indiquer quand la cellule n’a pas de nom
Je suis quand même arrivé à la prendre en défaut. Dans le cas, peut courant, il est vrai, que l’on utilise un même nom pour plusieurs cellules dans 2 feuilles du classeur
Je vois que dans ton exemple, tu as mis un nom de formule « Pi_2 »
Mais les noms de formules ne sont pas rattachés à une cellule
Donc ta macro n’apporte rien dans ce cas, non ??
Re : Macro permettant se savoir si une cellule porte déjà un nom
Bonjour Job75
Merci pour ce renseignement.
Je n’avais jamais fait attention à ce que l’on pouvait mettre un nom dans une feuille plutôt que dans la classeur.
En plus d’une macro, j’aurais appris une chose de plus sur Excel.
Du coup plutôt que de mettre un même nom dans le classeur pour des cellules différentes sur plusieurs feuilles du classeur, on peut nommer ces cellules avec le même nom mais dans chaque feuille concernée.
Cela évite de prendre à défaut la macro, qui ne voit pas les cellules nommées dans le classeur avec le même nom sur plusieurs feuilles.
Après coup, j’avais trouvé quelques bugs dans ta première version, mais dans celle-ci, mis à part le cas des noms dans le classeur pour plusieurs cellules sur plusieurs feuilles, cela me semble parfait.