Test un nom avec les noms des cellules nommées d'1 classeur

Bonjour,

ci-dessous une fonction qui renvoie True si "Le_Nom" (loureed pour l'exemple) choisi est valide.

Je cherche à tester "Le_nom" avec toutes les étiquettes du classeur :

Function vérif_validitée_nom(Le_nom As String) As Boolean

    ' mis à "bon" en début de fonction
    vérif_validitée_nom = True
    Dim Cmp As Name
    For Each Cmp In ActiveWorkbook.Names
        If Cmp.Name = Le_nom Then
            vérif_validitée_nom = False
            Exit For
        End If
    Next

End Function

Quand je fais le "F8" le code passe bien les noms des étiquettes, mais il ne reconnaît pas deux valeurs qui me semble identiques :

une étiquette qui s'appelle LouReeD et qui fait référence à une cellule d'une feuille 'A lire'!$A$3

"Le_nom" lors du test est égal à : loureed

Alors oui il y a les majuscules, donc j'ai essayé avec :

        If Ucase(Cmp.Name) = Ucase(Le_nom) Then

mais rien y fait, pour le code Le_nom est valide...

Hors si Le_nom existe déjà dans le classeur, lors de la création d'un tableau qui doit avoir pour nom Le_nom, Excel lui ajoute un "_1" car il y a déjà un nom d'étiquette égal à Le_nom (LouReeD celle de la cellule nommée...) d'où le fait que pour moi LouReeD = loureed... et je me retrouve avec loureed_1 !

Là je cale...

Merci au grand d'Excel de bien vouloir m'aider...

@ bientôt

LouReeD

Loureed,

Je n'ai pas tout compris. Est-ce que l'appel de fonction contient dans le paramètre un texte entre guillemets ?

Bonjour,

pas plus sûr que ça mais,

Function vérif_validitée_nom(Le_nom As String) As Boolean

' mis à "bon" en début de fonction

vérif_validitée_nom = False

Dim Cmp As Name

For Each Cmp In ActiveWorkbook.Names

If UCase(Cmp.Name) = UCase(Le_nom) Then

vérif_validitée_nom = True

Exit For

End If

Next

End Function

Salut LouReeD!!

Tu es toujours valide ! et tu te plains !!

As-tu vérifié que le nom était bien un nom dans le classeur (et pas dans la feuille).

Courage, tu es valide....

edit : Et pas d'ambiguïté sur ActiveWorkbook ?

Bonjour à tous les "répondeurs" !

et merci @ vous de vous penchez sur ma validitée...

ce qui appel la function est une inputbox

    Le_nom = InputBox("Veuillez donner un nom à cette nouvelle feuille. Attention ! Pas d'espace, pas de caractères spéciaux, merci.", "Ajout d'un suivi de compte")
    If vérif_validitée_nom(Le_nom) = False Then

la cellule nommée LouReeD est bien une cellule d'une des feuilles du classeur.

Pour moi la valeur de la variable Le_nom est sans guillemet, au vu du code, non ?

Pour ce qui est de l'ambiguïté je ne travail qu'avec un seul classeur ouvert...

Je vais finir par laisser Excel gérer les noms de tableau tout seul....

Comment faire référence à un tableau d'une feuille quelconque en VBA sans connaître son nom ?

C'est juste pour faire un tri par date croissante sur une de ses colonnes...

Je crois savoir, mais l'idée de mettre un nom "valable" pour un tableau fraichement créé me paraissais plus propre et plus pro...

Merci encore @ vous et @ bientôt

LouReeD


En fait dans le code l'égalité n'est pas trouvée entre LouReeD et loureed, la feuille se créée, le tableau avec, et Excel renome automatiquement le tableau en loureed_1 car il existe déjà l'étiquette LouReeD.

Dans le code Excel, en fait VBA n'arrive pas à identifier l'égalité...

Le rajout de "_1" n'intervient pas si je met en nom : "pouette"

la feuille pouette est créée, le tableau avec et le nom du tableau est bien pouette....

@ bientôt

LouReeD


Ci-dessous le code de création de feuille:

Sub Ajouter_un_compte()
    Dim Der_colonne As Long
    Dim Nom_du_tableau
    Dim Le_nom As String
    Application.ScreenUpdating = False
    Le_nom = InputBox("Veuillez donner un nom à cette nouvelle feuille. Attention ! Pas d'espaces, pas de caractère spéciaux, merci.", "Ajout d'un suivi de compte")
    If vérif_validitée_nom(Le_nom) = False Then
        MsgBox ("Erreur dans le nom. Pas d'espaces, pas de caractères spéciaux, pas plus de 28 caractères ou bien la feuille existe déjà.")
        Exit Sub
    End If
    On Error Resume Next
    Sheets(Le_nom).Activate
    If Err <> 0 Then
        Application.EnableEvents = False
        Sheets("Livret_Vierge").Visible = True
        Sheets("Livret_Vierge").Select
        Sheets("Livret_Vierge").Copy after:=Sheets(12)
        ActiveSheet.Name = Le_nom
Nom_du_tableau = ActiveCell.Offset(-1, 0).ListObject.Name
        ActiveSheet.ListObjects(Nom_du_tableau).Name = Le_nom        Sheets("Livret_Vierge").Visible = False
        Sheets("BD").Select
        Der_colonne = Sheets("BD").Cells(4, Cells.Columns.Count).End(xlToLeft).Column
        Sheets("BD").Cells(4, Der_colonne + 1).Value = Le_nom
        Sheets("Système").Activate
        Application.EnableEvents = True
    Else
        MsgBox ("Ce nom est déjà utilisé...")
    End If
    Application.ScreenUpdating = True
End Sub

je commence à avoir un doute sur la partie surlignée... Pauvre de moi

Bonjour @ tous,

en fait la partie surlignée était à modifiée et puis j'ai pris l'option de "modifier" le nom donné par l'utilisateur : en effet, je voulais prendre le nom donné pour renommer" un tableau sur une feuille, mais avant je vérifie si le nom n'existe pas. Avec l'option de modifier le nom alors il y a de grande chance pour que le nom ne se répète pas.... D'où la modification du code comme ceci :

Sub Ajouter_un_compte()
    Dim Der_colonne As Long
    Dim Nom_du_tableau
    Dim Le_nom As String
    Application.ScreenUpdating = False
    Le_nom = InputBox("Veuillez donner un nom à cette nouvelle feuille. Attention ! Pas d'espaces, pas de caractères spéciaux, merci.", "Ajout d'un suivi de compte")
    If vérif_validitée_nom(Le_nom) = False Then
        MsgBox ("Erreur dans le non ! Pas d'espaces, pas de caractères spéciaux, pas plus de 28 caractères ou bien la feuille existe déjà.")
        Exit Sub
    End If
    On Error Resume Next
    Sheets(Le_nom).Activate
    If Err <> 0 Then
        Application.EnableEvents = False
        Sheets("Livret_Vierge").Visible = True
        Sheets("Livret_Vierge").Select
        Sheets("Livret_Vierge").Copy after:=Sheets(12)
        ActiveSheet.Name = Le_nom
ActiveSheet.ListObjects(1).Name = "Tab_" & Le_nom
        Sheets("Livret_Vierge").Visible = False
        Sheets("BD").Select
        Der_colonne = Sheets("BD").Cells(4, Cells.Columns.Count).End(xlToLeft).Column
        Sheets("BD").Cells(4, Der_colonne + 1).Value = Le_nom
        Sheets("Système").Activate
        Application.EnableEvents = True
    End If
    On Error GoTo 0
    Application.ScreenUpdating = True
End Sub

En fait si je comprend bien le fait de mettre (1) désigne le premier objet de la feuille ?

Toujours est-il que cela fonctionne.

Merci encore à vous

Je ne comprend toujours pas pourquoi l'égalité ne marchait pas, ceci dit...

@ bientôt

LouReeD

Salut du samedi !

Ah oui ! La manière classique d'accéder à un objet c'est : NomCollection(index)

C'est un raccourci de : NomCollection.Item(index) ou NomCollection.Item(nom)

(Le nom et le numéro d'index étant interchangeable pour pointer un objet, c'est pourquoi quand tu as un nom inexact l'erreur qui tombe c'est : Indice en dehors de la plage...)

Je devais être fatigué hier soir. Mais il y a autre chose qui m'avait chagriné dans tes substitutions : il me semblait que tu activais une feuille par son nom, la copiait pour renommer la copie avec le même nom... Je ne suis pas replongé pour aller revoir... si tu sors sans dommage de ta problématique, c'est que c'est OK !

Bonne journée.

Bonjour,

en fait non, je copie colle la feuille, la nouvelle créée est sélectionnée automatiquement puis je la renomme avec Le_nom

        Sheets("Livret_Vierge").Copy after:=Sheets(12)
        ActiveSheet.Name = Le_nom

A priori une fois copier et coller après la feuille 12 c'est bien la nouvelle feuille qui est active...

Mais Est-ce un coup de chance devrais-je pour plus de sécurité mettre

Sheets(13).name = Le_nom

?

Merci encore et @ bientôt

LouReeD

C'est (Le_nom).Activate qui m'avait perturbé... Je n'avais pas connecté qu'il s'agissait d'un test d'erreur (mais je devais être fatigué, hihi !

Bonjour,

en plus je ne fais plus la gestion d'erreur car la fonction "validé" le fait déjà mon code se résume donc maintenant (en ayant en plus enlever toutes les sélections inutiles) :

Sub Ajouter_un_compte()
    Dim Der_colonne As Long
    Dim Nom_du_tableau
    Dim Le_nom As String
    Application.ScreenUpdating = False
    Le_nom = InputBox("Veuillez donner un nom à cette nouvelle feuille. Attention ! Pas d'espaces, pas de caractères spéciaux, merci.", "Ajout d'un suivi de compte")
    If vérif_validitée_nom(Le_nom) = False Then
        MsgBox ("Erreur dans le non ! Pas d'espaces, pas de caractères spéciaux, pas plus de 28 caractères ou bien la feuille existe déjà.")
        Exit Sub
    End If
    Application.EnableEvents = False
    Sheets("Livret_Vierge").Visible = True
    Sheets("Livret_Vierge").Copy after:=Sheets(12)
    ActiveSheet.Name = Le_nom
    ActiveSheet.ListObjects(1).Name = "Tab_" & Le_nom
    Sheets("Livret_Vierge").Visible = False
    Der_colonne = Sheets("BD").Cells(4, Cells.Columns.Count).End(xlToLeft).Column
    Sheets("BD").Cells(4, Der_colonne + 1).Value = Le_nom
    Sheets("Système").Activate
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub

J'ai gardé les events à false car il y a des macros sur les feuilles copiées dont "l'activate"...

Et puis je ne pense pas que vous étiez fatigué, je pense seulement que ce niveau de code est trop bas pour vous ! non ?

Une dernière question : la gestion de la fermeture de l'inputbox par la croix...

un If Le_nom="" then exit sub ?

@ bientôt

LouReeD

Bonjour à tous !

Tu as pu résoudre ton souci autrement mais je donne quand même une petite précision en fonction de la portée (étendue) d'un champ nommé :

Si le champ nommé LouReeD a une étendue sur tout le classeur, alors cmp.Name = LouReeD

Mais :

Si le champ nommé LouReeD a une étendue seulement sur un onglet ('A lire' par exemple), alors cmp.Name = 'A lire'!LouReeD

Ceci explique probablement le problème que tu rencontres...

Bonjour,

j'avais vu cela également, dans "formules" "Gestions des noms" il y a bien la colonne "étendue".

Je me suis aperçu alors que LouReeD était en feuille : 'A lire'!$A$235

J'ai donc supprimer le nom LouReeD.

J'ai fait "nouveau" avec comme nom LouReeD et fait référence à 'A lire'!$A$235

retour sur la fenêtre des "formules" et ô surprise LouReeD est étendue "au classeur".

Je relance mon code de création avec le test de validité et patatra, le même cinéma !

J'ai une étiquette nommée qui s'appelle "_1" (sans les guillemets) faisant référence à Système!$B$2 avec une étendu "classeur".

je donne comme nom dans l'inputbox _1,

lors du test le code trouve l'égalité et me met le message d'erreur...

C'est à rien y comprendre...

Merci tout de même et @ bientôt

LouReeD


pour qu'il trouve l'égalité il faut que je mette : LouReeD, respecter la casse...

C'est pourquoi avec Ucase je pensais m'en sortir.... et je vois que ça marche....

Je n'avais pas du faire les tests dans le bon ordre !!!!

Une fois avec Ucase, puis retour en arrière, une fois avec étendu en classeur, sans réessayer avec Ucase !!!!

Donc je confirme :

vba-new la porté des cellule nommée avait à voir quelque chose dans mon problème !

merci à vous, à voir maintenant si je vais faire la modification du code dans ce sens....

Mais comme l'appli est pour le retour de la section téléchargement, j'ai encore un peu de temps devant moi...

@ bientôt

LouReeD

Fermer par la croix une InputBox équivaut à annuler. La valeur renvoyée est False.

Il y a d'ailleurs une ambiguïté sur laquelle je suis tombé récemment en testant si la valeur saisie = False ; si tu demandes de saisir un nombre, l'utilisateur saisit 0, le test sur saisie = False renvoie True !

Sinon, sur Le_nom ton test est valide a-priori.

Merci,

@ bientôt

LouReeD

Ah oui ! La casse a son importance. Excel compare par défaut en mode Texte (ne tient pas compte de la casse) mais VBA par défaut en mode binaire...

La solution serait peut-être d'utiliser la fonction StrComp, dont un paramètre définit le mode de comparaison (consulte l'aide VBA sur cette fonction).

Bonne soirée

@MFerrand

Pour gérer la saisie d'une inputbox, il ne faut pas tester la valeur False mais utiliser :

If VarType(Le_Nom) = vbBoolean Then
   'Instructions si clic sur Croix de fermeture
Else
   'Autres instructions
End If

Pour pouvoir gérer le type de variable, il faut alors déclarer la variable Le_Nom en variant :

Dim Le_Nom as Variant

Lorsque tu saisis 0, ton test renvoie True simplement parce que False = 0 ! Et True = -1...


2ème remarque, je vois que LouReed utilise la fonction InputBox.

Pour arriver à choper l'action du clic sur la croix de fermeture, il faut utiliser la méthode Application.InputBox.

Dans le cas de LouReed, un clic sur la croix (ou Annuler) te retournera une chaîne vide "".

Merci pour vbBoolean, je le note en mémoire !

Tu as toujours intérêt à une variable Variant pour recueillir une InputBox si tu veux tester (sinon l'erreur 13 est reste suspendue au-dessus de ta tête).

Hey !!!

A vous écouter je vois que je suis encore loin de votre niveau !

Donc si je ne change pas mon code je fais un test du genre :

If Le_nom = "" then exit sub

Si je change mon code pour mettre Application.InputBox je fais un test du genre :

If VarType(Le_Nom) = vbBoolean Then exit sub

Ai-je bien compris ?

Le test ="" est fait dans la fonction "validité" mais du coup sur une annulation il y a le messagebox, c'est pourquoi l'idée de la gestion de la croix et du bouton annuler...

@ bientôt

LouReeD

Voilà ce que j'aurais fait jeune padawan...

Sub Ajouter_un_compte()
    Dim Der_colonne As Long
    Dim Nom_du_tableau
    Dim Le_nom As Variant

    Application.ScreenUpdating = False
    Le_nom = Application.InputBox("Veuillez donner un nom à cette nouvelle feuille. Attention ! Pas d'espaces, pas de caractère spéciaux, merci.", _
                                  "Ajout d'un suivi de compte", _
                                  Type:=2) 'le paramètre Type permet de spécifier le type des données renvoyées. 2 => Texte

    'l'utilisateur clique sur Annuler ou la croix de fermeture
    'la variable 'Le_nom' retourne un False qui est un booléen
    If VarType(Le_nom) = vbBoolean Then Exit Sub

    If vérif_validitée_nom(Le_nom) = False Then
        MsgBox "Erreur dans le nom. Pas d'espaces, pas de caractères spéciaux, pas plus de 28 caractères ou bien la feuille existe déjà.", vbExclamation
        Exit Sub
    End If

Merci !

Cette fois le post est VALIDE !

Pas facile d'apprendre tout seul ou en scrutant ce forum... Mais bon chat petit va loin, non ?

Merci @ vous deux et @ très bientôt sur ce site !

LouReeD

Rechercher des sujets similaires à "test nom noms nommees classeur"