IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Problème avec Names.Add


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur après-vente
    Inscrit en
    Novembre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur après-vente
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2016
    Messages : 39
    Par défaut Problème avec Names.Add
    Bonjour

    Description
    (J'utilise Windows 10 et la dernière version Office pour Familles et Petites Entreprises)
    La liste ci-dessous se trouve sur une feuille Excel nommée ‘ParametersList ’ et comportant env. 30 Catégories différentes, chacune comporte un nombre différent de Sous-Catégories :

    ParametersInfoList (Extrait)
    Lignes/Colonnes A B

    Catégorie Sous-Catégorie
    21 Alarme Prot.One
    22 Assurance Dégâts d'eau
    23 Assurance Immeuble
    24 Assurance Mobilier
    25 etc...


    Dans le Gestionnaire des Noms, J’ai d'abord saisi (Add) les deux entrées suivantes dans la ligne 21:
    Nom : AlarmeInfoList
    Valeur : {« Alarme » \« Prot.One »}
    Fait référence à : ParametersList !$A$21:$B$21
    Étendue 1 : Classeur
    Étendue 2 : ParametersList ?(était déjà présente)

    Mon but :
    Modifier les ‘Valeurs’ ci-dessus en gardant les mêmes références, p. ex. comme suit :
    Nouvelle Valeur : {« AlarmeX » \« Prot.OneY »}
    Fait référence à : ParametersList !$A$21 :$B$21 (= même référence)
    Étendue 1 : Classeur
    Étendue 2 : ParametersList ?

    Pour cela j’ai procèdé ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim RangeName, Cat, CatRange As String
    Dim InitRow, EndRow as Integer
    ActiveCell=”Alarme”
    Cat = ActiveCell
    RangeName = Cat & "InfoList"
    CatRange = "$A21": "$B21"
    Delete old Name
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ActiveWorkbook.Names(Cat & "InfoList").Delete
    Add new Name
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     ActiveWorkbook.Names.Add _
        Name:=RangeName, RefersTo:="=ParametersInfoList!" & CatRange
    [QUOTE]  Ceci ajoute le nouveau Nom avec la Valeur {}, c’est-à-dire nulle ! Étendue : Classeur


    Problèmes :
    1. L’ancien Nom est bien effacé (avec Delete) dans le Classeur du Gestionnaire de Noms, quand j’ai les deux ‘Étendues’ présentes, la première est effacée. Peut-on choisir d’effacer plutôt l’autre ou les deux?

    2. Le nouveau Nom est ajouté (avec ADD) mais avec la valeur nulle {…} donc ne s’intégre pas dans la liste PatrametersInfoList. Comment faire pour que le code modifie le nom de la catégorie sans modifier sa Référence ?

    3. Peux-tu me renseigner sur les impliquations exactes de:
    Étendue: ParametersList et de Étendue: Classeur

    Pour modifier une Catégorie devrai-je d’abord supprimer les deux ‘Étendues’ ? si oui, est-il possible de le faire avec une seule ligne de code ?

    4. Existe-t-il un code pour tester la présence ou non d’un Nom ?
    J’ai déjà passé des heures sur ce problème sans en trouver de solution…

    Merci.
    Jacksun

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 194
    Par défaut
    Bonjour,

    bon alors déjà pour commencer, quand tu déclares tes variables comme tu le fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim RangeName, Cat, CatRange As String
    seule CatRange est dimensionnée en String les autres sont dimensionnées en Variant !

    Pour bien dimensionnée sur une ligne on spécifie le dimensionnement de chaque variable comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim RangeName As String, Cat As String, CatRange As String
    On n'a pas tout ton code mais quand même ce qui suis m'interpelle !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ActiveCell=”Alarme”
    Cat = ActiveCell
    cette ligne me surprend aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CatRange = "$A21": "$B21"
    les 2 points hors guillemet ne doivent rien donner de bon!
    Ce qui suit me parait mieux

    Pour répondre à tes questions :

    1) la j'ai pas compris !!! les étendues disponibles ne sont pas définies par l'utilisateur mais sont par défaut : le classeur et les feuilles présentes dans le classeur.
    Une fois que tu as définit une étendue pour une plage nommée ce n'est plus modifiable.

    2) je ne comprend pas le rapport entre :
    Le nouveau Nom est ajouté (avec ADD) mais avec la valeur nulle {…} donc ne s’intégre pas dans la liste PatrametersInfoList.
    et
    Comment faire pour que le code modifie le nom de la catégorie sans modifier sa Référence ?

    Pour ce qui est de modifier la référence d'une plage nommée pas de problème par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CatRange = "$A21": "$B50"
    ActiveWorkbook.Names(Cat & "InfoList").ReferTo="=ParametersInfoList!" & CatRange"
    3) si l’étendue d'une plage Nommée est définie à "Classeur" cela veut dire que cette plage nommée sera utilisable dans tout le classeur à contrario de l’étendue définit avec le nom d'une feuille qui sera par conséquent limitée à la dite feuille.

    4)oui voici ma méthode :

    supposons que tu veuille tester l'existance d'une plage nommée "PlageTest"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim NomDePlage As String
     
    NomDePlage = "PlageTest"
    On Error Resume Next 'ici on gere l'erreur qui pourrait se produire sur la ligne suivante
    Debug.Print Range(NomDePlage).Parent.Name 'doit renvoyer le nom de la feuille qui contient cette supposée plage nommée "PlageTest"
    If Not Err = 0 Then MsgBox "La plage nommée : '" & NomDePlage & "' n'existe pas !", vbExclamation + vbOKOnly, "Erreur de Nom de plage..."
    On Error goto 0 ' annule l'effet du on error goto 0 pour l'eventuel suite de code

    mais pour eviter de copier ce code à chaque test d’existence de plage nommée tu peux te créer une fonction qui renvois vrais ou faux. Exemple


    Code de la fonction : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function VerifierExistancePlageNommee(ByVal NomDePlage As String) As Boolean
     
        VerifierExistancePlageNommee = False 'par defaut on est à False
        if NomDePlage="" then exit sub
     
        On Error Resume Next 'ici on gere l'erreur qui pourrait se produire sur la ligne suivante
        Debug.Print Range(NomDePlage).Parent.Name 'doit renvoyer le nom de la feuille qui contient cette la supposée plage nommée testée par cette fonction
        If Err = 0 Then VerifierExistancePlageNommee = True 'tout vas bien !
        'ici pas besoin de On Error goto 0 car la porté du On error resume next sera limitée à cette fonction
    End Function

    Code de la demo d'utilisation de la fonction ci-dessus : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Sub Demo()
    Dim NomDePlageATester As String
     
    NomDePlageATester = "Cuillère"
     
    'pour la demo si la Cuillère n'existe pas on renvois un message d'erreur
    If VerifierExistancePlageNommee(NomDePlageATester) = False Then MsgBox "La plage nommée : '" & NomDePlageATester & "' n'existe pas !", vbExclamation + vbOKOnly, "Erreur de Nom de plage..."
     
    End Sub

    Voila

    A+

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur après-vente
    Inscrit en
    Novembre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur après-vente
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2016
    Messages : 39
    Par défaut Problème avec ‘NamesAdd’
    Bonjour Phil

    J'ai bien apprécié tes réponses claires et utiles et revu mon code en conséquence.

    Pour la définition du Range (au début) j'utilise des variables et non des chiffres, en voulant simplifier l'exemple ceal a donné cette expression curieuse avec ces signes $. Le code utilisé est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       CatRange = "$A" & "$" & initRow & ":$B" & "$" & EndRow
    Sorry.

    J'ai pris bonne note de tes suggestions et mon code fonctionne maintenant parfaitement.
    (je ne le cite pas ici car cela serait trop compliqué pour moi).

    J'ai aussi découvert une erreur d'orthographie (Problème 2) qui a provoqué qu'un nom ajouté avec "ADD" avait une valeur nulle...

    L'important est que cela marche, encore merci.

    Jacksun

Discussions similaires

  1. [XL-2003] problème méthode Names.add
    Par Johakr dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/02/2011, 11h52
  2. [OL-2007] Problème avec un Add-in Outlook
    Par seb49 dans le forum Outlook
    Réponses: 0
    Dernier message: 24/08/2009, 18h26
  3. [1.2.9] problème avec [ActionErrors].add()
    Par H-bil dans le forum Struts 1
    Réponses: 5
    Dernier message: 31/07/2008, 19h51
  4. problème avec named
    Par tenderstoune dans le forum Réseau
    Réponses: 4
    Dernier message: 05/04/2008, 03h58
  5. Problème avec Eclipse : add jars
    Par Faiche dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 07/01/2008, 15h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo