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 :

Variables de document (Names) effacés après création [XL-365]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Sans activité
    Inscrit en
    Décembre 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Sans activité
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2020
    Messages : 7
    Par défaut Variables de document (Names) effacés après création
    Bonsoir,

    Déjà... Vraiment désolé si mon message n'est pas posté au bon endroit.

    Pour enregistrer des valeurs avec mon document, même après fermeture du classeur, j'ai vu qu'on peut utiliser des variables de document.
    Je les ai déjà utilisé avec succès en utilisant le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ThisWorkbook.Names.Add "nomVariable", valeur
    .
    Le problème c'est qu'en créant encore de nouveaux 'Names', après je reçois un message d'erreur montrant que ces variables n'existent plus. Je le sais car j'ai passé en revue tous les 'Names' du document. A la création, elles sont là. Mais quelques temps après, elles ne sont plus là. Je ne comprends pas ce qui peut se passer d'autant que je n'ai pas rencontré ce problème avant.
    Ou alors, y aurait-il une limite dans le nombre de 'Names' qu'on peut créer? Quelqu'un voit-il une solution svp?
    Désolé si je ne suis pas assez clair...

  2. #2
    Invité
    Invité(e)
    Par défaut Variable de document
    Citation Envoyé par gtsjcs Voir le message
    Bonjour,

    Sauf erreur de ma part, une variable de document, c'est plutôt dans Word qu'on l'a trouve : https://www.developpez.net/forums/bl...document-word/

  3. #3
    Membre habitué
    Homme Profil pro
    Sans activité
    Inscrit en
    Décembre 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Sans activité
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2020
    Messages : 7
    Par défaut
    Citation Envoyé par Eric KERGRESSE Voir le message
    Bonjour,

    Sauf erreur de ma part, une variable de document, c'est plutôt dans Word qu'on l'a trouve : https://www.developpez.net/forums/bl...document-word/
    Merci Eric,
    C'est ce que je pensais au vu de mes recherches, mais on peut également utiliser des Names dans Excel. Teste le code que j'ai mis dans mon précédent. Tu verras qu'il n'y a pas d'erreur! Et même que ça marche! Essaie le code suivant tu verras que ça fonctionne: tu retrouveras le Names appelé mois1!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    Sub test()
        Dim nm As Name
        ThisWorkbook.Names.Add "mois1", 0
        For Each nm In ThisWorkbook.Names
            MsgBox nm.Name
        Next nm
    End Sub

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut

    Citation Envoyé par gtsjcs Voir le message
    [...]
    Pour enregistrer des valeurs avec mon document, même après fermeture du classeur, j'ai vu qu'on peut utiliser des variables de document.[...]
    Que veux-tu dire par "même après fermeture du classeur"... Si ton classeur est fermé, tu ne peux pas y ajouter des Names. Dans ton code, tu montres que tu utilises ThisWorkbook qui est le classeur qui contient la macro en train de s'exécuter => ThisWorkbook ne saurait pas être fermé... Si tu ajoutes des Names à un classeur (ouvert) puis que tu le fermes en l'enregistrant, tu vas retrouver les Names à l'ouverture suivante, forcément. Tu peux vérifier l'existence des Names au départ d'Excel via Formules/Noms définis/Gestionnaire de noms, sauf si tu les rends invisibles à la création. Je ne comprends pas bien le contexte dans lequel tu te trouves et tu ne montres pas le code qui "après" dit que les variables n'existent plus.


    Ne serait-il pas plus simple que tu stockes ces valeurs dans une feuille, éventuellement xlSheetVeryHidden? Que cherches-tu à réaliser?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Membre habitué
    Homme Profil pro
    Sans activité
    Inscrit en
    Décembre 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Sans activité
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2020
    Messages : 7
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Que veux-tu dire par "même après fermeture du classeur"... Si ton classeur est fermé, tu ne peux pas y ajouter des Names.
    Désolé! Si mon message prêtait à confusion. L'idée, c'est d'enregistrer des valeurs qui seront sauvegardées même après fermeture du classeur et non d'enregistrer des Names dans un classeur fermé! Désolé!

    Citation Envoyé par Pierre Fauconnier Voir le message
    Ne serait-il pas plus simple que tu stockes ces valeurs dans une feuille, éventuellement xlSheetVeryHidden? Que cherches-tu à réaliser?
    Je ne préfère pas enregistrer ces valeurs dans des cellules, parce que c'est assez lent alors qu'avec les Names, c'est plus beaucoup plus rapide! Je peux les cacher ailleurs sur une feuille (c'est assez facile) ou les mettre sur une autre feuille qui sera caché (c'est aussi facile)! Le problème est que l'écriture dans une feuille Excel via VBA est très lent surtout que je gère plus d'une centaine de variables à la fois!

    Citation Envoyé par Pierre Fauconnier Voir le message
    Que cherches-tu à réaliser?
    J'aimerais bien poster mon code, mais il est très long... Je vais essayer d'expliquer... Je crée des Names dans la procédure d'un module.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub procedure1()
        Dim nm As Name
     
        ThisWorkbook.Names.Add "mois1", 0
        ThisWorkbook.Names.Add "mois2", 0
        ThisWorkbook.Names.Add "mois3", 0
        ThisWorkbook.Names.Add "mois4", 0
        ThisWorkbook.Names.Add "mois5", 0
        ThisWorkbook.Names.Add "mois6", 0
     
    End Sub
    Jusqu'ici pas de problème: je fais une vérification avec une deuxième procédure dans le même module et je m'assure que les Names existent bien.
    J'ai créé ensuite un userform dans lequel je manipule les valeurs des Names. Voici un extrait de ces codes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    'Extrait de code 1
        If nTab = 0 Then
            If test_name("mois1") = False Then
                'ThisWorkbook.Names.Add "mois1", chaine
                ThisWorkbook.Names("mois1").Value = chaine
            Else
                ThisWorkbook.Names("mois1").Value = chaine
            End If
        End If
     
    'Extrait de code 2
        If a = 1 Then chaine = ThisWorkbook.Names("mois1").Value
        If a = 2 Then chaine = ThisWorkbook.Names("mois2").Value
        If a = 3 Then chaine = ThisWorkbook.Names("mois3").Value
    Et c'est là que le drame arrive! Quand je vérifie l'ensemble des Names du classeur, celles que je viens de créer ont toutes disparu. Il n'y a pas de Delete dans mon code, alors je ne comprends pas. J'ai d'autres Names dans le document qui ne sont pas affectés et que j'ai utilisé de la même façon sans rencontrer ce problème.

    J'espère que c'est un peu plus clair...

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Donne les codes réels que tu utilises, ce sera plus simple et plus sûr pour t'aider.

    tu n'as pas besoin de tester un nom pour en modifier la valeur, si tu ajoutes un nom qui existe déjà, l'ancien est remplacé par le nouveau. Ton bloc suivant ne sert à rien puisque tu peux réaliser le .Add directement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        If nTab = 0 Then
            If test_name("mois1") = False Then
                'ThisWorkbook.Names.Add "mois1", chaine
                ThisWorkbook.Names("mois1").Value = chaine
            Else
                ThisWorkbook.Names("mois1").Value = chaine
            End If
        End If
    Plutôt que de tester la valeur de a, tu peux utiliser de suite Chaine = ThisWorkbook.Names("Mois" & a).Value.

    je ne comprends toujours pas le contexte parce que lorsque tes noms sont créés, il sont pérennisés dans le classeur. Je ne comprends donc pas le test que tu réalises. A priori, le fait de récupérer les noms dans un userform n'a pas d'incidence sur l'existence des noms créés, et dans les codes dont tu donnes des extraits, je ne vois pas trace de userform.

    T'aider dans ces conditions est malaisé.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Cela dit, je ne vois pas bien en quoi la gestion d'une centaine de "variables de document" enregistrées dans un tableau structuré (une plage, donc) prendrait à ce point du temps qu'il soit préférable de passer par des noms de classeur. Selon mes critères, il est plus simple de récupérer la "vraie" valeur d'une cellule d'un tableau plutôt que la valeur d'un nom qu'il faut traiter en VBA puisque la valeur "brute" n'est pas accessible directement.

    Je me pose aussi la question de la légitimité d'une centaine de variables de document... ^^

    Perso, j'utilise un tableau structuré de deux colonnes "paire Clé/Valeur" nommé t_Paramètres et je n'ai jamais été confronté à une lenteur dans la manipulation de ce tableau de "variables de document"... Je pense sincèrement que tu te compliques la tâche pour rien...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Membre habitué
    Homme Profil pro
    Sans activité
    Inscrit en
    Décembre 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Sans activité
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2020
    Messages : 7
    Par défaut
    Désolé, Pierre, de répondre aussi tard.

    Donne les codes réels que tu utilises, ce sera plus simple et plus sûr pour t'aider.
    Mon programme a 5 modules et 5 userform. Le dernier useform, sur lequel je suis en train de travailler, a des centaines de lignes de code (peut-être même plus de 1.000). Si tu tiens toujours à avoir mes codes, il n'y a pas de soucis!

    tu n'as pas besoin de tester un nom pour en modifier la valeur, si tu ajoutes un nom qui existe déjà, l'ancien est remplacé par le nouveau. Ton bloc suivant ne sert à rien puisque tu peux réaliser le .Add directement:
    Tu as effectivement raison! En fait, mon classeur sera un modèle. Cela veut donc dire que les Names n'existeront pas à la base dans chaque nouveau classeur. C'est pour cela qu'avant de modifier la variables Names, je teste son existence. Je peux me tromper, mais c'est la raison pour laquelle j'ai pensé procédé ainsi... (Sinon, je risque un message d'erreur)

    je ne comprends toujours pas le contexte parce que lorsque tes noms sont créés, il sont pérennisés dans le classeur. Je ne comprends donc pas le test que tu réalises. A priori, le fait de récupérer les noms dans un userform n'a pas d'incidence sur l'existence des noms créés, et dans les codes dont tu donnes des extraits, je ne vois pas trace de userform.

    T'aider dans ces conditions est malaisé.
    Désolé, Pierre! Tu as raison! Et je t'assure que tes commentaires m'aident beaucoup! Grâce à ce que tu m'as dit, j'ai testé mon code autrement et j'ai peut-être entrevu une raison pour laquelle mes variables Names sont supprimés: apparemment si elles reçoivent une variable vide, elles sont supprimées. C'est-à-dire, si j'écris ça par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ThisWorkbook.Names.Add "maVariable", 0
    ThisWorkbook.Names("maVariable").Value = ""
    La variable maVariable sera supprimée. Et c'est là que se situe mon problème! Mon programme envoie des variables vides dans les Names et c'est pour cela qu'elles "disparaissaient"! Je dois donc réécrire le programme de telle sorte qu'il enregistre bien des données non vides dans les Names. Je ne suis pas encore au point dans la façon de sauvegarder les données de ce tableau de façon optimal.

    Cela dit, je ne vois pas bien en quoi la gestion d'une centaine de "variables de document" enregistrées dans un tableau structuré (une plage, donc) prendrait à ce point du temps qu'il soit préférable de passer par des noms de classeur. Selon mes critères, il est plus simple de récupérer la "vraie" valeur d'une cellule d'un tableau plutôt que la valeur d'un nom qu'il faut traiter en VBA puisque la valeur "brute" n'est pas accessible directement.
    Mon programme ne fait pas que lire les "centaines de variables", il les enregistre aussi. C'est au niveau de l'enregistrement que ça devient lent (pour moi^^: quelques secondes). Et je n'ai pas envie que cela soit perceptible!

    Je me pose aussi la question de la légitimité d'une centaine de variables de document... ^^
    Je te rassure: je n'ai pas une centaine de variables (que ce soit de type variant ou string ou Names ou autre). Pendant l'exécution du programme, j'utilise un tableau tridimensionnel. Pour sauvegarder les valeurs, j'utilise 6 Names. En fait, mon userform comporte 106 Textbox, et ces données doivent être sauvegardées pour être réutilisé même si le classeur est fermé puis réouvert par la suite (d'où les Names). Maintenant, je n'utilise pas une centaines de Names: j'en utilise 6. Dans chacun, je range les valeurs d'une quinzaine de TextBox en ayant soin de les structurer. Des centaines de Names: je deviendrai fou!!!

    Je sais que je ne suis pas très clair, mais tu y vois mieux maintenant, Pierre?

  9. #9
    Membre habitué
    Homme Profil pro
    Sans activité
    Inscrit en
    Décembre 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Sans activité
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2020
    Messages : 7
    Par défaut
    J'ai finalement compris quel était le problème! les variables Names sont supprimées lorsqu'elles reçoivent une chaine vide.
    C'est pour cela qu'elle étaient supprimées. Je marque le sujet comme résolu!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/03/2006, 14h54
  2. Validation d'un document XML avant sa création??
    Par mardona dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 27/01/2006, 15h33
  3. Variable nombre : arrondir à 5 chiffres après la virgule
    Par micatmidog dans le forum Général Python
    Réponses: 7
    Dernier message: 21/12/2005, 10h03
  4. Réponses: 5
    Dernier message: 20/11/2005, 11h15
  5. Réponses: 3
    Dernier message: 18/11/2005, 13h37

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