Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Général VBA
Général VBA Forum général VBA . Pour les logiciels spécifiques (Access, Excel, Word, ...), postez dans les bons sous forums.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/07/2006, 17h40   #1
Candidat au titre de Membre du Club
 
Inscription : juillet 2006
Messages : 68
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 68
Points : 12
Points : 12
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 :
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
florent149 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 18h19   #2
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 854
Points : 16 854
Envoyer un message via Skype™ à bbil
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...
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 10h05   #3
Candidat au titre de Membre du Club
 
Inscription : juillet 2006
Messages : 68
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 68
Points : 12
Points : 12
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.
florent149 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 10h08   #4
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 854
Points : 16 854
Envoyer un message via Skype™ à bbil
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)
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 10h14   #5
Candidat au titre de Membre du Club
 
Inscription : juillet 2006
Messages : 68
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 68
Points : 12
Points : 12
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?
florent149 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 11h12   #6
Membre du Club
 
Inscription : mai 2006
Messages : 151
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 151
Points : 58
Points : 58
Citation:
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!!
gootsu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 11h19   #7
Candidat au titre de Membre du Club
 
Inscription : juillet 2006
Messages : 68
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 68
Points : 12
Points : 12
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 :
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.
florent149 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 11h21   #8
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
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
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 11h27   #9
Candidat au titre de Membre du Club
 
Inscription : juillet 2006
Messages : 68
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 68
Points : 12
Points : 12
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!
florent149 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 11h29   #10
Membre du Club
 
Inscription : mai 2006
Messages : 151
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 151
Points : 58
Points : 58
dans tes "togglebuttons" tu n'as pas de fonction :
Code :
Private Sub ToggleButtonX_Change()
là ou il y aurait évantuellement ton "i" remis à 0?
gootsu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 11h31   #11
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
Oui, alors j'ignore dans quelle version de VBA tu es mais pour ce qui me concerne, je mets toujours (VBA97)
Code :
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
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 11h35   #12
Candidat au titre de Membre du Club
 
Inscription : juillet 2006
Messages : 68
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 68
Points : 12
Points : 12
Citation:
Envoyé par gootsu
dans tes "togglebuttons" tu n'as pas de fonction :
Code :
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!
florent149 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 11h36   #13
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
Tu as essayé mon code ?
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 12h05   #14
Candidat au titre de Membre du Club
 
Inscription : juillet 2006
Messages : 68
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 68
Points : 12
Points : 12
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 :
ActiveWorkbook.RunAutoMacros Which:=xlAutoOpen
Mais le code que tu m'a propose il faut le mettre dans ThisWorkbook ou ailleurs?

Merci de votre aide
florent149 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 12h09   #15
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
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+
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 12h14   #16
Candidat au titre de Membre du Club
 
Inscription : juillet 2006
Messages : 68
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 68
Points : 12
Points : 12
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?
florent149 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 12h18   #17
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
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
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 12h24   #18
Candidat au titre de Membre du Club
 
Inscription : juillet 2006
Messages : 68
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 68
Points : 12
Points : 12
Rhaaaaaaa..... Toujours une remise a 0 incomprehensible apres le premier lancement du userform en question...
florent149 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 12h46   #19
Membre du Club
 
Inscription : mai 2006
Messages : 151
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 151
Points : 58
Points : 58
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é

Citation:
AlainTech a écrit:
Citation:
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!
gootsu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 12h51   #20
Membre Expert
 
Avatar de illight
 
Inscription : septembre 2005
Messages : 1 016
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : septembre 2005
Messages : 1 016
Points : 1 044
Points : 1 044
C'est pas F8 plutot que F5 ?
__________________
Avant de poster, et http://www.developpez.com/sources/

N'oubliez pas le

Vous une brute ? faites voir
illight est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h22.


 
 
 
 
Partenaires

Hébergement Web