Tester l'existance d'une cellule nommée

Lu K

XLDnaute Occasionnel
Bonjour à toutes et à tous,

Me revoilà de nouveau chez vous car je n'arrive pas à trouver un code qui me pourrait me permettre de tester l’existence d'une cellule nommée dans un autre classeur.

Je voudrait seulement savoir si une cellule nommée 'longueur' (par exemple) existe dans un autre classeur ?

Merci d'avance pour vos réponse.
 

tototiti2008

XLDnaute Barbatruc
Re : Tester l'existance d'une cellule nommée

Bonjour Lu_K,

à tester

Code:
Function NomExist(Nom As String, Classeur As String) As Boolean
Dim Adr As String
    NomExist = False
    On Error GoTo ErrExist
    Adr = Workbooks(Classeur).Names(Nom).RefersTo
    NomExist = True
    On Error GoTo 0
ErrExist:
End Function

Sub test1()
    MsgBox NomExist("longueur", "classeur2")
End Sub
 

job75

XLDnaute Barbatruc
Re : Tester l'existance d'une cellule nommée

Bonjour Lu K, salut Marc :)

Une solution voisine :

Code:
Sub Test()
Dim nom As String, txt As String, ref As Range
nom = "longueur" 'nom recherché, à adapter
On Error Resume Next
txt = Mid(ActiveWorkbook.Names(nom).RefersTo, 2)
Set ref = Range(txt)
If Err Then
  MsgBox "Pas de cellule ou plage nommée '" & nom & "'"
Else
  MsgBox "Adresse de '" & nom & "' : " & txt
End If
End Sub
Comme vous le demandez, le nom recherché est celui d'une cellule ou d'une plage de cellules.

La recherche se fait bien sûr dans le classeur actif.

A+
 

tototiti2008

XLDnaute Barbatruc
Re : Tester l'existance d'une cellule nommée

Bonjour Paritec :), Bonjour job75 :)
Re,

Pour préciser :
la solution de job cherche dans le classeur actif
la mienne cherche dans le classeur dont on fournit le nom, mais celui-ci doit être ouvert
pour les noms qui sont spécifiques à une feuille, je pense que ça ne fonctionne pas
 

job75

XLDnaute Barbatruc
Re : Tester l'existance d'une cellule nommée

Re, salut Papou :)

pour les noms qui sont spécifiques à une feuille, je pense que ça ne fonctionne pas

Si ça fonctionne, lancez successivement les macros :

Code:
Sub Nomme()
ActiveSheet.Names.Add "longueur", ActiveCell 'défini dans la feuille active
End Sub

Sub Test()
Dim nom As String, txt As String, ref As Range
nom = "longueur" 'nom recherché
On Error Resume Next
txt = Mid(ActiveWorkbook.Names(nom).RefersTo, 2)
Set ref = Range(txt)
If Err Then
  MsgBox "Pas de cellule ou plage nommée '" & nom & "'"
Else
  MsgBox "Adresse de '" & nom & "' : " & txt
End If
End Sub
A+
 

Lu K

XLDnaute Occasionnel
Re : Tester l'existance d'une cellule nommée

Bonjour à tous,

Merci pour vos réponses, je choisit la solutions de tototiti2008. Elle fonctionne très bien.

Encore un grand MERCI à tous, cela me fait gagner un temps précieux.
 

job75

XLDnaute Barbatruc
Re : Tester l'existance d'une cellule nommée

Re Marc,

Bizarrement, pas chez moi..... ni avec ma version, ni avec la tienne :eek:

Bizarre en effet... J'ai testé sans problème (sur Excel 2003) ta solution et la mienne.

Fichier joint.

Edit : j'ai modifié le 2ème argument sur ta macro pour que ça marche en ligne.

A+
 

Pièces jointes

  • Test(1).xls
    38 KB · Affichages: 73
  • Test(1).xls
    38 KB · Affichages: 91
  • Test(1).xls
    38 KB · Affichages: 92
Dernière édition:

tototiti2008

XLDnaute Barbatruc
Re : Tester l'existance d'une cellule nommée

Bonjour à tous,

Tout à fait exact, eh bien on en apprend tous les jours.

C'est tout l'intérêt du forum ;)
On pourrait envisager un code qui recherche aussi dans les noms spécifiques à une feuille, je crois que ça n'intéresse pas Lu_K, mais pour le sport... :), sur la base de ton code

Code:
Sub Test()
Dim nom As String, txt As String, ref As Range, Ws As Worksheet
nom = "longueur" 'nom recherché
txt = ""
On Error Resume Next
txt = Mid(ActiveWorkbook.Names(nom).RefersTo, 2)
If txt = "" Then
    For Each Ws In ActiveWorkbook.Worksheets
        txt = Mid(Ws.Names(nom).RefersTo, 2)
        If txt <> "" Then Exit For
    Next Ws
End If
Set ref = Range(txt)
If txt = "" Then
  MsgBox "Pas de cellule ou plage nommée '" & nom & "'"
Else
  MsgBox "Adresse de '" & nom & "' : " & txt
End If
End Sub

Evidement s'il y a plusieurs noms "longueur" dans les feuilles, il s'arrête au premier trouvé...
 

Guy_M

XLDnaute Occasionnel
Re : Tester l'existance d'une cellule nommée

Bonjour,

Ci-dessous la solution que j'ai écrite, avec détournement du traitement des erreurs :-(

Code:
'Détermine si la chaine AdressePlage passée en paramètre est une adresse valide pour une plage de cellules de style A1 et R1C1
'Par défaut si la formule est de style R1C1, les adresses relatives comme R[1]C1 ne sont pas considérées comme valides
'Un nom de plage nommées n'est pas une adresse valide de plage
Function AdressePlageValide(AdressePlage As String, Optional RelatifAutorise As Boolean = False) As Boolean
Dim Classeur As Workbook
Dim Feuille As Worksheet
Dim AdrPourTest As String 'Chaine contenant l'adresse qui sera testée

'Détorunement de la gestion des erreurs car il est plus simple et plus rapide de prouver qu'une adresse est valide en testant l'existence d'une cellule à l'adresse testée (sinon il faut utiliser les regexp)
'Range a besoion d'une feuille de calcul (Worksheet) pour fonctionner, il doit y avoir au moins une feuille de calcul (Worksheet) disponible, si ce n'est pas le cas AdressePlageValide retourne faux
'Range ne fonctionne qu'avec le style A1, L'utilisation de Application.ConvertFormula permet de tester les références avec le style R1C1
'Application.ConvertFormula n'a pas besoin d'une feuille de calcul (Worksheet) pour fonctionner
'Application.ConvertFormula ne génère pas d'erreur et ne convertit pas quand il se sait pas convertir
'Application.ConvertFormula avec le paramètre xlR1C1 vers xlA1 retourne une adresse de style A1 sous la forme 'A1'
'Application.ConvertFormula avec le paramètre xlR1C1 vers xlA1 interprète Rn (R1, R2...) et Cn comme étant de la notation R1C1 valide et les convertit, cela ne pose pas de problèmes car il ne converti pas si c'est hors intervalle autorisé.

AdressePlageValide = False
On Error Resume Next

If AdressePlage = "" Then Exit Function 'Une adresse vide n'est pas valide
If Not RelatifAutorise And InStr(AdressePlage, "[") Then Exit Function 'Les adresses relatives ne sont pas autorisées, le caractère '[' est le marqueur d'une adresse relative

AdrPourTest = Replace(Application.ConvertFormula(AdressePlage, xlR1C1, xlA1), "'", "") 'On testera l'adresse convertie

If ActiveSheet.Type = xlWorksheet Then
    If NomExiste(ActiveWorkbook, AdrPourTest) Then Exit Function 'Une plage nommée n'est pas une adresse valide de plage
    AdressePlageValide = Not (Range(AdrPourTest) Is Nothing)
Else
    For Each Classeur In Workbooks
        For Each Feuille In Classeur.Worksheets
            If NomExiste(Classeur, AdrPourTest) Then Exit Function 'Une plage nommée n'est pas une adresse valide de plage
            AdressePlageValide = Not (Feuille.Range(AdrPourTest) Is Nothing)
            Exit Function
        Next Feuille
    Next Classeur
'Si on arrive ici, on ne sait toujours pas si l'adresse est valide
End If

End Function

'Teste l'existence d'un nom dans l'objet passé en paramètre
'Inspiré par ça http://www.developpez.net/forums/archive/index.php/t-935375.html
'Préférer un workbook comme objet passé en paramètre
Function NomExiste(ObjetATester As Object, NomDePlage As String) As Boolean
    Dim PlageNommee As Name
 
    NomExiste = False
    For Each PlageNommee In ObjetATester.Names
        If PlageNommee.Name = NomDePlage Then
            NomExiste = True
            Exit Function
        End If
    Next PlageNommee

End Function

En espérant que cela sera utile a quelqu'un
Guy
PS: si vous avez un endroit qui explique clairement la relation entre plages nommées et feuilles de calcul : j'ai eu des difficultés avec activesheet.names(NomDePlage)
 

Staple1600

XLDnaute Barbatruc
Re : Tester l'existance d'une cellule nommée

Bonsoir à tous

Une autre fonction personnalisée
(j'ai emprunté la gestion d'erreur à tototiti2008 ;))
Code:
Function estnom(n$) As Boolean
Dim r As Range: estnom = False
On Error GoTo ErrExist
Set r = Range(n)
estnom = (TypeName(r) = "Range")
ErrExist:
End Function
Pour tester
Code:
Sub Test()
Msgbox estnom("longueur")
End Sub

EDITION: Cela fonctionne pour les noms dans le classeur actif, mais je viens de relire le post et je m’aperçois que la cellule nommée semble se trouver sur un autre classeur donc il faudra modifier le code en conséquence ;)
(en s'inspirant du code (encore une fois ;) du code de tototiti2008.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 198
Messages
2 086 107
Membres
103 120
dernier inscrit
83400ren