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

VBA Discussion :

Variable super globale au projet


Sujet :

VBA

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 68
    Points : 24
    Points
    24
    Par défaut Variable super globale au projet
    Bonjour!

    J'aurais besoin dans mon projet Vba d'une variable (un entier) accessible a toutes les procedures et modifiable a tout moment.
    Je l'ai declaré de cette facon dans la partie "General" d'un module standard:

    Et je l'initialise a l'ouverture du workbook:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Private Sub Workbook_open()
    i=16
    End sub

    Ensuite dans des boutons d'userforms, j'ai des incrementations du type i = i + 1

    Je lance ce userform, je clique sur le bouton, c'est bon la valeur de i a bien ete incrementee de 1. Jusque la je suis heureux. C'est ensuite que ca se corse. Je relance le userform, je reclique sur le bouton, et pouf! le i s'est mis a zero, comme ca tout seul, sans qu'on lui aie rien dit. En regardant la valeur de i a chaque etape, j'ai vu que c'est sur la ligne " Private Sub Userform_initialize() " que i se met a 0, alors qu'il n'y a aucune action de realisee!
    Etant loin d'etre une superstar du Vba, je fais appel a votre experience et vos competences pour m'aider.
    Merci d'avance et bon week end!

    PS: n'ayant pas Internet le we je ne pourrais vous repondre avant Lundi...

    --
    Flo

    [Edit] bbil : Penser à rajouter les balises de codes, utiliser le bouton

  2. #2
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    rajout une ligne

    en haut de tes modules... cela t'obligeras à déclarer les variables.. et évitera des erreurs à des endroits ou tu crois avoir déclaré une variable et celle ci est hors de portée...

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 68
    Points : 24
    Points
    24
    Par défaut
    Oui mais je veux que cette variable soit utilisable dans tout le projet donc il faut que la declare qu'une seule fois non? Parce que le Option explicit il sert a quoi exactement? Moi je croyais qu'il rendait une variable utilisable dans toute une procedure.

  4. #4
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Option explicit, "t'oblige" à déclarer toutes tes variables.. donc si tu en utilise une dans un endroit ou elle n'est pas accessible ... tu as un message d'erreur ... et VB.. ne te "génére" pas tout seul cette variable (sans aucun lien avec une autre variable de même nom)

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 68
    Points : 24
    Points
    24
    Par défaut
    Alors j'ai essayé de mettre "Option Explicit" dans les modules ou j'utilisais mon i mais cela ne change rien. Penses tu que je m'y prend correctement pour declarer cette variable globale?

  6. #6
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 151
    Points : 83
    Points
    83
    Par défaut
    j'ai vu que c'est sur la ligne " Private Sub Userform_initialize() " que i se met a 0
    Tu n'utilise pas la variable i dans la phase d'initialisation? t'es sûr?
    Peux etre que tu fais appel a une fonction qui met i à 0?
    Tu utilise peux etre le i dans une boucle for d'une fonction appelé dans " Private Sub Userform_initialize() "?

    Vérifie tous ça!!

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 68
    Points : 24
    Points
    24
    Par défaut
    Sorry mais je n'ai nulle part dans mon projet l'instruction "i=0". Voici ce qu'il y a dans mon Userform_Initialize() :

    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
    17
    18
    19
    20
    Private Sub UserForm_Initialize()
     
    'initialize the values of the 3 togglebuttons
    tb0.Value = True
    tb45.Value = False
    tb90.Value = False
     
    Dim L As Integer
     
            'memorize the array of dimensions on the data sheet (UB,UC,UBP...) with an additional column, which
            'will be used to store the supply levels to a combobox
            With Sheets("ASB")
                L = .Range("A65000").End(xlUp).Row
                TabTemp = .Range(.Cells(6, 1), .Cells(L, 3)).Value
     
            End With
            UPDCombo cmbDepth, 0
     
     
    End Sub
    Il s'agit d'une procedure pour remplir une combobox en cascade, enfin bref rien a voir avec mon i...
    Donc je ne sais vraiment pas quoi penser.

  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 543
    Points
    15 543
    Par défaut
    Pour déclarer une variable globale, ce n'est pas "Globale" mais "Public"
    Ne change rien à ton premier code et mets donc Public à la place de globale

  9. #9
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 68
    Points : 24
    Points
    24
    Par défaut
    Merci c'est ce que j'avais fait au debut, et voyant que ca ne marchait pas j'ai essayé "Global"...La je viens de reessayer avec Public, et c'est pareil, il y a toujours ce satané i qui retombe a 0 comme une bouse!

  10. #10
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 151
    Points : 83
    Points
    83
    Par défaut
    dans tes "togglebuttons" tu n'as pas de fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub ToggleButtonX_Change()
    là ou il y aurait évantuellement ton "i" remis à 0?

  11. #11
    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 543
    Points
    15 543
    Par défaut
    Oui, alors j'ignore dans quelle version de VBA tu es mais pour ce qui me concerne, je mets toujours (VBA97)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public i as integer
     
    Private Sub Workbook_Open()
       ActiveWorkbook.RunAutoMacros Which:=xlAutoOpen
    End Sub
     
    Sub Auto_open()
    i = 16
    'c'est là que j'affecte les valeurs aux variables et je n'ai pas de pb (!?)
    end sub
    Tu dis

  12. #12
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 68
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par gootsu
    dans tes "togglebuttons" tu n'as pas de fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub ToggleButtonX_Change()
    là ou il y aurait évantuellement ton "i" remis à 0?

    J'ai lance une recherche dans tout mon projet de la variable i et elle n'est que la ou je pensais qu'elle etait!

  13. #13
    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 543
    Points
    15 543
    Par défaut
    Tu as essayé mon code ?

  14. #14
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 68
    Points : 24
    Points
    24
    Par défaut
    Merci Ouskel'n'or pour ton code j'ai essaye mais le i que j'utilise dans le bouton de mon userform est "non declare". Il semblerait que le "Public i As Integer" a cet endroit la ne soit pas valable pour tout le projet... Et je voulais te demander ca sert a quoi la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveWorkbook.RunAutoMacros Which:=xlAutoOpen
    Mais le code que tu m'a propose il faut le mettre dans ThisWorkbook ou ailleurs?

    Merci de votre aide

  15. #15
    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 543
    Points
    15 543
    Par défaut
    Je le mets dans un module du classeur (Insertion -> Module) non dans thisworkbook

    Quant à ActiveWorkbook.RunAutoMacros Which:=xlAutoOpen, ça sert à la compatibilité des versions mais ne nuit pas si ce n'est pas nécessaire

    A+

  16. #16
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 68
    Points : 24
    Points
    24
    Par défaut
    Mais c'est juste le "Public i As Integer" que tu mets dans un module ou tout ton code? Parce que j'imagine que le "Private Sub Workbook_open()" il va dans "ThisWorkbook" non?

  17. #17
    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 543
    Points
    15 543
    Par défaut
    Non ! Je le mets dans le même module, après la déclaration.
    L'ouverture du classeur entraîne l'exécution de la macro Workbook_Open
    Si tu as un userform à ouvrir, tu mets le code dans "Sub Auto_open()"
    Tu dis

  18. #18
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 68
    Points : 24
    Points
    24
    Par défaut
    Rhaaaaaaa..... Toujours une remise a 0 incomprehensible apres le premier lancement du userform en question...

  19. #19
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 151
    Points : 83
    Points
    83
    Par défaut
    fait des point d'arret dans chaque ligne et chaque fonction utilisé dans le fonction "Private Sub UserForm_Initialize()" et tu mets des espions un peu partout surtout sur "i" et tu tape 'F5' ligne après ligne!

    si il n'y a que ça à faire! fais ça!
    c'est long mais au moin tu poura voir à quel moment et où il passe à 0!

    bon courrage! lol!

    en [Vba-E] c'est "F5"!!

    au passsage je m'excuse !
    je me suis trompé "F8" pas à pas!
    mais je voulais dire de mettre des point d'arret et de relancé entre chaque point d'arret avec "F5"!
    Je suis désolé

    AlainTech a écrit:
    gootsu a écrit :
    en [Vba-E] c'est "F5"!!
    F5 pour relancer (tout) le code, F8 pour du pas à pas.
    Autrement dit, un seul point d'arrêt et F8 pour avancer dans le code.
    Oui je me suis corrigé la page précedente!
    si vous voulez je met des points d'arret au point statégique et je relance avec "F5" autrement dit avec "run" et effectivement "F8" c'est bien du pas à pas!
    Je m'en excuse encore une fois!

  20. #20
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    C'est pas F8 plutot que F5 ?
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/10/2008, 12h30
  2. Réponses: 2
    Dernier message: 20/10/2008, 13h38
  3. Variables super-global ?
    Par meliandah dans le forum Langage
    Réponses: 8
    Dernier message: 13/05/2007, 16h14
  4. Rendre super-globale une variable
    Par thanaos dans le forum Langage
    Réponses: 13
    Dernier message: 09/06/2006, 11h05
  5. [.NET] [C#] Variable super global ?
    Par choas dans le forum Windows Forms
    Réponses: 4
    Dernier message: 15/04/2005, 15h27

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