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 FunctionQuand 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) Thenmais 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"
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 Thenla 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 Subje 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 SubEn 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_nomA 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 SubJ'ai gardé les events à false car il y a des macros sur les feuilles copiées dont "l'activate"...
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 IfPour pouvoir gérer le type de variable, il faut alors déclarer la variable Le_Nom en variant :
Dim Le_Nom as VariantLorsque 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 IfMerci !
Cette fois le post est VALIDE !
Pas facile d'apprendre tout seul ou en scrutant ce forum...
Merci @ vous deux et @ très bientôt sur ce site !
LouReeD