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 :

Unload UserForm incompatible avec mes variables publiques ? Non !


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 20
    Points : 11
    Points
    11
    Par défaut Unload UserForm incompatible avec mes variables publiques ? Non !
    Bonjour ...

    Vba et Excel 03
    Je bute toujours sur le même problème :

    Toute instruction de "déchargement" d'un UserForm du genre :
    vide toutes les variables "publiques" du projet et donc : bug assuré ...

    Je suis assez tenté de contourner le problème en écrivant à la place :
    Ca résoud le problème mais n'est ce pas contraire au principe d'économiser au maximum , l'espace mémoire ?…


    Merci beaucoup ...

  2. #2
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour.

    As-tu du code sur l'évènement Terminate de l'userform?

    PGZ

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 491
    Points : 542
    Points
    542
    Par défaut
    bonjour,

    Toute instruction de "déchargement" d'un UserForm du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Unload MonUserForm
    vide toutes les variables "publiques" du projet et donc : bug assuré ...
    Et tu sûre que tes variables sont publiques ?
    Regarde si ces variables sont modifiées par un évenement du userform
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    Private Sub UserForm_Deactivate()
     
    End Sub
     
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
     
    End Sub
     
    Private Sub UserForm_Terminate()
     
    End Sub

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Bonjour Patbou, bonjour Pgz

    en bref :

    je suis sur que ma variable est bien "publique"
    elle est déclarée en tête du seul module standard que contient mon projet de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Option Explicit
    Public ZoneVierge as range
    Par ailleurs cette variable n'est pas modifiée par mon UserForm ... le mot "ZoneVierge" n'apparaît d'ailleurs nul par dans le code associé à l'UserForm

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub UserForm_Deactivate()
     
    End Sub
     
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
     
    End Sub
     
    Private Sub UserForm_Terminate()
     
    End Sub
    en fouinant sur le web , je suis tombé sur un message d'un gars ayant eu le même problème ... je vous retransmets sa supposition :

    "cela veut dire que l'interpréteur arrete l'exécution et détecte une anomalie... mais laquelle ? puisque je n'ai aucun message d'erreur !"

    plus loin , il indique avoir résolu le problème un peu au pif , et sans comprendre pourquoi ça marche ! en écrivant "option explicit" en entête de tous les modules . J'ai bien sur fait la même chose mais chez moi , ça ne change rien ...

    En tous cas , merci beaucoup de vous pencher sur mon problème et à plus tard ...... RV

  5. #5
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    A ce stade...

    As-tu fais sous VBE Debugage/Compiler? Sans erreur?

    Sinon, tu vois comment que c'est à la fermeture d'un usf que ta variable publique est réinitialisée?

    Tu as un seul usf?

    Quand tu fais une recherche sur tout le projet de 'ZoneVierge', tu trouves quelles lignes?

    PGZ

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Alors ton problème est ailleurs.
    Comment lis-tu ton range pour savoir que la variable globale s'est évaporée ?
    Teste ça :
    - Place des données de A1 à A10
    - Dans un module standard, ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Plage As Range
     
    Sub Test()
    Dim cell As Range
    Set Plage = Range("A1:A10")
        Load UserForm1
        UserForm1.Show
        For Each cell In Plage
            MsgBox cell
        Next
    End Sub
    Dans l'userform, un seul bouton et ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CommandButton1_Click()
        Unload UserForm1
    End Sub
    Bonne soirée

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Re bonjour Pgz et Ouskel'nord

    Pour vous répondre à tous 2 : je sais à quel moment ma variable est réinitialisée en faisant du pas à pas et en interrogeant à chaque fois ma variable grace au volet "Exécution" de VBA ....

    Par ailleurs , le mystère s'épaissit :
    j'ai commencé par faire scrupuleusement ce que tu me conseillait Ouskel'n'or ... et miracle ! la variable publique "Plage" restait stable !!!

    comme ce n'était pas très éloigné de ce que j'avais moi même testé en tous sens , j'ai mis en parrallèle dans le même projet les 2 formes de test en les simplifiant au maximum , c'est à dire en créant 2 UserForm... et bien l'un détruit la variable , l'autre la laisse intact !!! ... pour preuve , voici le code ... si quelqu'un peut m'expliquer , j'lui paye un coup crénom !

    voici la description :
    - 1 feuille Excel avec 3 boutons , affectés àux 3 macros suivantes :
    - 1 seul module standard dont voici l'intégralité du code et qui contient les macros en question

    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
    16
    Option Explicit
    Public Plage As Range
     
    Sub Assigne()
        Set Plage = Range("A1:A10")
    End Sub
     
    Sub Test()
        Load UserForm1
        UserForm1.Show
    End Sub
     
    Sub TEST2()
        Load USERFORM2
        USERFORM2.Show    
    End Sub
    - les 2 UserForms rigoureusement identiques aux codes rigoureusement identiques (voir ci dessous) contenant chacun 1 seul CommandButton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Option Explicit
     
    Private Sub CommandButton1_Click()
        Unload Me
    End Sub
    et bien l'appel de la macro TEST2 laisse intact la variable publique "Plage" , alors que l'appel de la macro Test la désinitialise !!! c'est quand même dingue , non ?

    Merci encore et bonne nuit ...

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Je ne vois rien là que de très normal.
    Chaque fois que tu lances une macro placée dans un module standard tu ré-initialises la variable.
    Par contre, si tu mets bien ce code dans un module standard, dis-moi ce que ça fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Option Explicit
    Public Plage As Range
     
    Sub Assigne()
    Dim cell As Range
    Set Plage = Range("A1:A10")
        Load UserForm1
        UserForm1.Show
        Load USERFORM2
        USERFORM2.Show
        For Each cell In Plage
            MsgBox cell
        Next
    End Sub
    et dans les deux userforms, un simple bouton avec Unload.me

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Bonjour Ouskel'n'or

    ton test fonctionne comme dans le meilleur des mondes :
    les 2 userforms apparaissent / puis les 10 msgbox successives / la macro se termine et en vérifiant par le volet "éxecution" , ma variable est toujours "vivante" ....

    Tu vas penser: Youppi ... mais j'ai continué le test ...

    comme j'ai effectué ton test en collant ta macro "Assigne" dans le module que je t'ai envoyé hier soir ( en renommant ma propre macro "Assigne" afin d'éviter les conflits ) , j'ai enchainé ton test , avec le mien ( celui décrit hier ) ...

    et bien plus aucun des 2 UserForms ne provoque de bug !

    ... je poursuis :

    je reviens , toujours dans le même fichier , intégralement au code d'hier ... c'est à dire que j'efface ta macro "Assigne" , je rétablis le nom de ma propre macro "Assigne" ... enfin bref , je reviens exactement à hier soir ...: Résultal :

    et bien plus aucun des 2 UserForms ne provoque de bug !

    estomaqué , j'enregistre ce fichier "réparé" sous un autre nom ... et rouvre en parralèle le fichier d'hier soir , et bien , l'un bug , l'autre fonctionne !!!


    désolé , toutes ces explications sont assez laborieuses mais pour résumer , j'ai 2 fichiers distincts , mais identiques , aux codes rigoureusement identiques mais l'un bug et l'autre fonctionne ( celui où est "passé" ton test ...) Je n'ai rien contre les baguettes magiques , mais comment s'y fier ?

    et pour précision : aucun évènement du genre "Workbook_open" ou autre " n'est programmé : seulement le module standard et les 2 codes des UserForms

    A plus tard

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Je n'ai rien compris à tes tests mais c'est normal, je n'ai pas cherché à comprendre vu que ce que je t'ai mis fonctionne. Bref, si ça ne fonctionne pas dans un de tes fichiers, Quelque soit la raison x, c'est que ton fichier est vérolé. Tu le jettes et tu gardes celui qui fonctionne. Mais "normalement", les variables globales déclarées dans un module standard sont ré-initialisées chaque fois que tu appelles directement une macro dans le module standard... tout comme le sont les variables locales déclarées dans une macro le sont quand tu relances la macro.
    Il y a une exception à cela mais le cas de figure n'a rien à voir avec ton pb, ne concerne pas les userforms, et est trop tordu pour qu'il en soit question ici.
    Bonne lecture

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Bonjour Ouskel'n'or

    Je ne veux pas abuser de ta disponibilité et te remercie de toutes tes réponses précédentes mais comme ne me dépatouille toujours pas de ce problème , je te propose quand même d'effectuer , de ton coté , le test suivant ... ce sera bref , et ça me paraît très très étrange ..

    tu crée un fichier Excel tout neuf
    tu insères un seul UserForm avec 1 seul CommandButton dont le code est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Option Explicit
     
    Private Sub CommandButton1_Click()
        Unload Me
    End Sub
    tu insères un seul module standard dont l'intégralité du code est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Option Explicit
     
    Public Plage As Range
     
    Sub A()
    Set Plage = Range("A1:A10")
            UserForm1.Show       
    End Sub
    Après execution de cette macro , tu testes : ?Plage.Address dans la fenètre "Execution" .... et si c'est comme chez moi , tu obtiens l'erreur 91 ...
    Première anomalie , je crois ...

    et plus étrange encore : tu modifies la macro en rajoutant simplement un msgbox , autrement dit , la macro devient ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub A()
    Set Plage = Range("A1:A10")
            UserForm1.Show
            MsgBox Plage.Address
    End Sub
    et alors , l'éxécution de la macro ne provoque plus d'erreur et la variable "Plage" est stabilisée ... seconde étrangeté ...

    et pour finir , tu mets en commentaire la ligne MsgBox Plage.Address , autrement dit tu reviens à la macro d'origine ... et bien l'éxécution de cette macro ne provoque plus l'erreur 91 , alors qu'elle la provoquait au début de ce test , ce qui , du coup me rend complètement dingue ...

    Voilà , très probablement il y a une explication logique mais personellement , je sèche complétement ...

  12. #12
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Si tu utilises "?" c'est comme si tu mettais
    Print Plage.Address
    Remplace "?" par debug.print
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    debug.print Plage.Address
    Et ferme les yeux si tu persistes à trouver une erreur là où il n'y en a pas
    Une variable publique avant l'affichage d'un userform reste publique après sa fermeture.
    Bonne soirée

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Bonsoir ...
    Oui t'as raison , c'est plus pratique avec debug.print ...
    Mais je viens à nouveau de vérifier : ça ne change rien au fond de mon problème ... : Juste avant "End Sub" ... débug.print Plage.address me renvoit l'adresse de ma variable publique , et juste après "End Sub" , débug.print Plage.address me renvoit "erreur 91" ...

    Comme en effet , j'avais cru comprendre que
    Une variable publique avant l'affichage d'un userform reste publique après sa fermeture.
    je persiste à penser qu'il y a là un problème .... je racontes des conneries ou ça ne fait ça que chez moi ?

    A plus tard et bonne soirée RV

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Si tu mets débug à la place de Debug, c'est normal que tu aies une erreur.
    Mais je suppose que l'erreur ne serait pas la même.
    Citation Envoyé par Jabveneau
    je racontes des conneries ou ça ne fait ça que chez moi ?
    J'opte pour la première proposition

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 20
    Points : 11
    Points
    11
    Par défaut Ironie .... quand tu nous tiens .....
    Bonjour Ouskel'n'or

    ça a l'air d'être la grande forme ce matin ....

    Alors débug à la place de Debug :
    simple faute de frappe dans le message ... mais ça ,tu le sais déja puisqu'en effet "l'erreur ne serait pas la même" ....

    Pour le reste ,tu as probablement raison de parier sur une connerie de ma part ... mais où est elle ? c'est précisément la question ...
    Alors sur le fond : as tu fais le test ? et la question légèrement reformulée est :

    " Où se situe la probable connerie que j'ai faite ? ... , est ce que ça ne fait ça que chez moi ? "

    A plus tard RV

  16. #16
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    La mémorisation "hors procédure" de la valeur d'une variable est un avatar... Si tu préfères, en dehors de toute procédure, la variable n'existe plus. Sauf que, si rien ne s'est passé entre le moment ou elle est initialisé et le moment où tu lis sa valeur, "il arrive" que la variable conserve sa valeur mais ceci n'a rien de systématique ni de fiable. C'est une anomalie !
    Hors de toute procédure liée d'une façon ou d'une autre à celle contenant l'initiation de ta variable déclarée comme tu veux, ce que tu lis dans ta variable n'a pas de sens. S'il paraît y en avoir un c'est un hasard.
    Un test ?

    Fais tourner ton appli après avoir déclaré une variable "V" en public
    Hors procédure, lis la valeur de ta variable "V".

    Fais tourner une autre application qui utilise des variables différentes.
    Puis relis la variable "V".

    Bref, relis la phrase en bleu.

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    D'accord , je commence à piger … J'espérais qu'une fois ma variable déclarée publique puis définie dans la macro A , je pouvais, tant que mon fichier était ouvert, récupérer cette définition dans toutes les autres macros à n'importe quel moment , …
    Apparemment c'est pas le cas , alors je vais retourner bricoler du coté des variables statiques , a moins que ça se termine avec la méthode paléolithique d'une cellule "gardienne" où je dépose l'information …
    En tous cas , merci pour ces explications … RV

Discussions similaires

  1. Un souci avec mes variables
    Par arobaskette dans le forum Android
    Réponses: 5
    Dernier message: 23/11/2013, 14h19
  2. [MySQL] Problème avec mes variables de session
    Par mademoizel dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 07/04/2011, 22h40
  3. Variable type UserForm à initialiser avec nom variable
    Par dalmasma dans le forum Général VBA
    Réponses: 2
    Dernier message: 28/04/2009, 14h03
  4. VB.NET Problème avec mes variables
    Par forsay1 dans le forum VB.NET
    Réponses: 3
    Dernier message: 28/10/2008, 20h52
  5. erreur divers avec mes variables
    Par TheBlackReverand dans le forum MFC
    Réponses: 11
    Dernier message: 21/03/2006, 22h40

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