[VB] variable globale

Résolu/Fermé
Chronix - 25 avril 2010 à 12:37
 Chronix - 25 avril 2010 à 17:03
Bonjour à tous!

Voilà j'essaie de programmer sur excel un jeu du type "Morpions"

Pour l'instant j'ai écrit une liste de subs dans "ThisWorkbook" et le jeu fonctionne bien.
Pour définir les pions des joueurs, j'ai déclaré, au début de "ThisWorkbook" des constantes pour la couleur et le signe ("O" ou "X") des joueurs, en dehors des subs.

Const Couleur1 as Long = 255

Le plateau de jeu est sur le feuille de calcul "Sheet1", bien que pour l'instant je n'y ai jamais fait référence (aucune utilisation de la fonction Worksheets("Sheet1")).

A présent je voudrais que les joueurs puissent choisir eux-même la couleur de leurs pions.
j'ai donc créer une deuxième feuille de calcul "Menu", dans laquelle je colorie la case D2 avec la couleur du joueur 1. Je remplace donc la ligne où j'ai déclaré ma constante Couleur1 par le code suivant :

Dim Couleur1 As Long 'Couleur du Joueur 1
Couleur1 = Worksheets("Menu").Range("D2").Interior.Color

Lorsque je lance mon programme, Visual Basic m'envoie l'erreur "Compile error : Invalid Outside Procedure", et me surligne "D2" (guillemets compris)

Ai-je mal déclaré ma variable globale? ou le problème est-il autre?

Merci par Avance!!

A voir également:

2 réponses

Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
Modifié par Polux31 le 25/04/2010 à 13:01
Bonjour,


Tu devrais éviter de mettre du code dans ThisWorkbook.
En principe on ne garde que les méthodes se rattachants à Workbook comme Workbook_Open() ou Workbook_BeforeClose() ou encore Workbook_BeforeSave() ... etc.

Il est préférable de créer des modules pour le reste du code.

Tu peux par exemple dans ThisWorkbook avoir

Private Sub Workbook_Open() 
    Module1.LanceJeu 
End Sub 


Et dans le module1 :

Option Explicit 

Public Sub LanceJeu() 

     InitialiseJeu 
     '..... 
     '..... 

End Sub 

Private Sub InitialiseJeu() 

End Sub 

'etc ...


Si tu déclares une constante, tu ne peux pas changer sa valeur par la suite.
Si tu veux changer la valeur de la variable globale, il faut juste faire ça:

Option Explicit 

Public Couleur1 As Long 'Couleur du Joueur 1  

Public Sub LanceJeu() 

     InitialiseJeu 
     '..... 
     '..... 

End Sub 
'etc ...


Ensuite, si tu dois utiliser plusieurs feuilles, je te conseille de référencer les feuilles. Tu peux également déclarer des objets "Feuille" :

Option Explicit 

Public Couleur1 As Long 'Couleur du Joueur 1  
Public xlSheet1 As Worksheet 
Public xlSheet2 As Worksheet 

Public Sub LanceJeu() 

     Set xlSheet1 = ThisWorkbook.Worksheets(1) 
     Set xlSheet2 = ThisWorkbook.Worksheets(2) 

     InitialiseJeu 
     '..... 
     '..... 

End Sub 
'etc ...


Il te suffit ensuite de faire référence à l'un des objets lorsque que tu veux la désigner:

Couleur1 = xlSheet1.Range("D2").Interior.Color


Bon courage

;o)
«Ce que l'on conçoit bien s'énonce clairement, Et les mots pour le dire arrivent aisément.»
Nicolas Boileau
1
D'accord j'ai bien respecté tout ce que tu m'as dit... Merci ça marche très bien... mais il n'y a donc pas moyen de déclarer la variable globalement?

En fait on est obligé de définir la variable au début de la sub principale (dans ton exemple lance_le_jeu ()...), c'est bien ça?

Parce qu'en fait j'ai créer pleins de subs différentes qui prennent en compte ces variables globales, et j'aimerai à ne pas à avoir à les redéfinir au début de chaque sub (c'est vrai que dans mon cas il me suffit de les redéfinir au début de la fonction principale)

Mais j'ai une deuxième fonction Reinitialise qui peut etre lancée toute seule, (sans à avoir à passer par lance_le_jeu), pour l'instant j'ai donc redéfini mes variables de couleur dans réinitialise() et lance_le_jeu()... est-ce que c'est bon ou est-ce que c'est trop lourd?
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
25 avril 2010 à 15:50
Tu peux utiliser les variables globales partout dans le module si elles sont déclarées en Private et dans tous les modules si elles sont déclarés en Public. Tu peux les initialiser effectivement dans la sub LancerJeu() ou ailleurs comme InitialiseJeu(). Une fois initialisées, les valeurs des variables globales peuvent être lues partout dans le code.

;o)
0
Merci pour tout!!!
0