Plages nettoyées pour pouvoir nommer

Daniel38

XLDnaute Occasionnel
Bonjour les Excellents :)
Le sujet a été abordé mais je n'ai pas trouvé comment adapter à ce tableau : :mad:

En colonne B est écrit le nom du lot qui apparait en titre dans chaque feuille (1 feuille par lot)
dans cette colonne il peut y avoir des options pour le lot qui peut avoir un autre nom que option mais tout se copie en colonne D (option, variante, solution alternative, ...)
En colonne C et D la formule SUBSTITUE supprime une grande partie des caractères non compatibles pour pouvoir nommer. (pas tous :mad:)

Ma crainte et de ne pas avoir tout nettoyer ces caractères incompatibles (je pense au " par exemple) avec cette formule SUBSTITUE que je fais écrire en VBA dans la cellule.

Y aurait -t-il un moyen + rapide et sûr pour obtenir le résultat sur les plages en colonnes C et D ?

Le fichier joint montre la présentation qui sert de référence (nom par cellule) pour nommer les cellules concernées dans les tableaux ...

merci pour vos suggestions et exemples :)
@+
 

Pièces jointes

  • Référence pour pouvoir nommer.xlsm
    10.8 KB · Affichages: 6

xUpsilon

XLDnaute Accro
Bonjour,

Sinon tu pourrais tester chaque caractère par macro et regarder si la valeur ASCII de chaque caractère correspond effectivement à une lettre ou à un chiffre. Mais boucler là dessus bonjour la lenteur de la macro ... Je suis pas sûr que ce soit la meilleure solution.

Bonne continuation
 

Daniel38

XLDnaute Occasionnel
En glanant :) j'ai trouvé une fonction mais je ne sais pas comment faire pour supprimer le " au cas ou il y'en a ...

Function RemoveSpecial(Str As String) As String
Dim xChars As String
Dim I As Long
xChars = " #$%°à@^()^&~{}.?,:;µ¤£²+-=*/\!'<>[]&"
For I = 1 To Len(xChars)
Str = Replace$(Str, Mid$(xChars, I, 1), "")
Next
RemoveSpecial = Str
'copier la formule dans la cellule = RemoveSpecial(A2) si réf. de la cellule = range("A2")
End Function
 

Pièces jointes

  • Référence pour pouvoir nommer.xlsm
    17.5 KB · Affichages: 3

Daniel38

XLDnaute Occasionnel
Voila le problème du guillemet est résolu, maintenant c'est propre ... :)
pour info :

xChars = " #&$%°à@^()^&~{}.?,:;µ¤£²+-=*/\!'<>[]&"""""

donc plus de signes refusés ou cabalistiques pour nommer selon la valeur de la cellule :p:p:p
 

eriiic

XLDnaute Barbatruc
Bonjour,

tu as aussi des noms interdits comme C, L FIN1 etc, et j'ai l'impression que tu as oublié l'espace insécable (160)

Une fonction que j'avais faite pour retourner un nom valide. Ca peut te servir de base si ça t'intéresse :
VB:
Function validerNom(nom As String, InitialeMaj As Boolean, Optional carRemplacement As String = "_") As String
    ' Caractères valides    Le premier caractère d'un nom doit être
    ' une lettre, un trait de soulignement (_) ou une barre oblique inversée (\).
    '
    ' Remarque   Vous ne pouvez pas utiliser les lettres « C », « c », « R » ou « r » comme nom défini car ces lettres sont utilisées comme abréviations pour sélectionner une ligne ou une colonne pour la cellule sélectionnée lorsqu'elles sont entrées dans une zone de texte Nom ou Atteindre.
    '                                                      "L" "C" en français
    ' Les références de cellules ne sont pas autorisées    Les noms ne peuvent pas être une référence de cellule, telle que Z$100 ou R1C1.
    ' Les espaces ne sont pas valides     Les espaces ne sont pas autorisés. Utilisez le trait de soulignement (_) et le point (.) comme séparateurs de mots, par exemple Taxe_Vente ou Premier.Trimestre.
    ' Longueur des noms    Un nom peut contenir jusqu'à 255 caractères.

    Dim car1 As String, s As String, test As Range
    If carRemplacement = " " Or carRemplacement = Chr(160) Then carRemplacement = "_"
    validerNom = nom
    ' initiales en majuscule
    If InitialeMaj Then validerNom = Application.Proper(validerNom)
    ' remplacer ou supprimer espaces
    validerNom = Replace(validerNom, " ", carRemplacement)
    validerNom = Replace(validerNom, Chr(160), carRemplacement)
    ' 1er caratère valide
    car1 = UCase(Left(validerNom, 1))
    If Not (car1 Like "[A-Z]" Or car1 Like "_" Or car1 Like "\") Then validerNom = "_" & validerNom
 
    '***************************************************************
    'nom=référence valide ? L1C1, L1C(-4)
'    On Error Resume Next
'    Set test = Range(validerNom)
    If Len(validerNom) = 1 And (car1 = "L" Or car1 = "C" Or car1 = "R") Then validerNom = "_" & validerNom

    On Error Resume Next
    ' supprimer si nom existant
    Names(validerNom).Delete
    On Error GoTo 0
    ' test si nom = référence valide
    On Error Resume Next
    s = ""
    s = Range("" & validerNom & "").Address
    If Err = 0 Or Len(s) <> 0 Then
        ' si pas d'erreur, c'est une référence A1 ou R1C1, non valide
        validerNom = "_" & validerNom
    End If
    On Error GoTo 0
    ' 255 car max
    If Len(validerNom) > 255 Then nom = Mid(validerNom, 1, 253) & Format(Rnd() * 100, "00")
End Function

Je la complèterai avec ta liste de caractères.
Tu l'as contrôlée cette liste ? Car le . et le à par exemple sont autorisés dans les noms.
eric
 
Dernière édition:

Daniel38

XLDnaute Occasionnel
Hello Eric
Ouch ta fonction !!!
Quand tu dis espace insécable, j'ai lu ta fonction, si tu regardes le "blanc" est au début juste avant #, xChars = " #&$%°à@^()^&~{}.?,:;µ¤£²+-=*/\!'<>[]&""""" et ça supprime bien tous les espaces ... :) d'alleurs le dernier fichier le prouve.
là j'ai testé dans tous les sens et ça nomme propre et bien sûr que le . et le à sont autorisés mais je n'en veux pas j'essaye de contracter les noms car ils sont déjà longs

merci Eric pour ta variante :p
 
Dernière édition:

xUpsilon

XLDnaute Accro
Bonjour,

Plutôt que de te casser la tête sur comment insérer " dans ta chaine de caractère à exclure, tu aurais pu utiliser la référence à chr qui est toujours très pratique ;) Ne jamais négliger la base : les tables ASCII

Bonne continuation
 

Discussions similaires

Réponses
8
Affichages
291
Réponses
12
Affichages
561

Statistiques des forums

Discussions
312 198
Messages
2 086 137
Membres
103 129
dernier inscrit
Atruc81500