La question est en titre, voici le cas :
J'utilise de deux manières différentes une boîte (USF) qui contient toujours les mêmes données de base.
Indifféremment de la méthode choisie, la phase préalable de compréhension & travail des paramètres définis par l'utilisateur est identiques, le traitement des données diffèrent seulement après cette première étape.
Jusqu'à maintenant j'ai donc deux procédures dont le début est copié-collé.
Et concrètement, pour une listbox exemple, en procédure A et B on trouve :
Code:
For i = 0 To Maliste.ListCount - 1
If Maliste.Selected(i) = True Then
If MiniListe = -1 Then
MiniListe = i + 1
ElseIf MiniListe <> -1 Then
MaxiListe = i + 1
End If
CbDeListe = CbDeListe + 1
End If
Next i
J'ai ainsi pas mal de listbox que je passe au crible pour connaître le mini, maxi et total d'éléments sélectionnés, plus d'autres éléments.
L'idée c'était de placer ce travail préparatif dans une procédure commune aux deux branches, exécuter cette procédure dans mes procédures A et B et utiliser les variables calculées... comment faire ?
Cela a beau s'appeler Public Sub...
C'est un problème que je crois avoir déjà rencontré, il y a très longtemps et pour lequel je n'avais pas trouvé d'autres solutions que de déposer mes données sur une feuille transitoire... Bref méthode petit cochon faute de mieux.
Re : Déclarer une variable valable pour plusieurs procédures ?
Un simple public à la place de dim ? :-O
Ha oui mais ho ha ha, non c'est que le voilà le souci ! Tu parles d'un module or mes 2 procédures sont planquées dans leur bouton respectif de la boîte... Y'a-t-il une alternative ou bien faut-il que j'entame le déménagement du code que je craignais depuis longtemps (pas fait puisque pas d'intérêt jusque là) ?
Et avant que je ne demande si cette méthode fonctionne entre module, pourquoi ceci ne fonctionne pas ?
Code:
Public i As Integer
Public Sub testA()
i = 10
End Sub
Public Sub TestB()
MsgBox i
End Sub
Re : Déclarer une variable valable pour plusieurs procédures ?
Bonjour, le souci est bien là pourtant. En résumé : les variables publiques ont-elles des contraintes si elles sont dans une USF ou un module ?
En voyant ta réponse hier Titi, j'ai conclu trop vite que c'est moi qui m'était trompé en oubliant une ligne de code évidente... Mais en fait pas du tout. Par rapport à ce que j'attendais j'avais coder correctement et ce matin je bute à nouveau dans le mur.
Voici qu'a écrit tototiti2008
Code:
Public iWW As Integer
Public Sub testA()
iWW = 10
End Sub
Public Sub TestB()
MsgBox iWW
End Sub
[b]
Sub appel()
testA
TestB
End Sub[/b]
L'appel me manquait et c'est là que ça coince. Tel que je l'avais compris, une variable publique est connue partout et tout le temps, tel l'oiseau elle ne point de frontière, donc dès mon testB je m'attendais à afficher son contenu.
Et ce matin, rebelote bien que le problème soit différent, cette fois j'ai une valeur calculée dans une USF (voir fichier joint) :
Code:
Public i As Long, j As Long, k As Long
Private Sub CommandButton1_Click()
i = 5
j = 3
k = 1
addition
End Sub
J'appelle une procédure (addition) située dans un module :
Code:
Public Sub addition()
Dim z As Long
z = i + j + k
MsgBox z
End Sub
Seulement là, patatra, i comme j (et ne parlons pas de k !) sont inconnus au bataillon. Au mieux si je les ai définis d'une manière (MaVaRiAbLe), une fois leur nom tapé en entier elle reprend la casse mais rien de plus. Dans le ctrl + espace, aucun j ou k ; leur valeur = empty
Why ?
Et même deux fois Waï puisque j'ai justement fait l'inverse : données en module, appel de cette procédure dans l'usf et obtention des données ; cela fonctionnerait dans un sens pas dans l'autre ?
Re : Déclarer une variable valable pour plusieurs procédures ?
Bonjour Charly88,
une variable Publique retient sa valeur dans tout le projet si (et seulement si ) tu la déclare en haut d'un module
si tu mets Public en haut du code de ton USF, tu ne donne accès à ces variables que dans les procédures de cet USF, pas en dehors.
Essaye peut-être de faire des recherches sur la notion de Portée d'une variable... si tu ne trouve pas, reviens nous voir, j'essaierais de résumer les différents cas..
Re : Déclarer une variable valable pour plusieurs procédures ?
Merci !!
Il suffit donc de déclarer toutes les variables générales dans un module... Étrange mais bon.
Une autre petite question pour ma culture G, sitôt posté, j'étais parti pour éditer parce que je me suis aperçu que ma procédure dans l'userform exemple était écrite Private Sub CommandButton1_Click() ... et là j'me suis dit, Marcel t'es con, faut la passer en publique !
Mais aucun effet bien sûr.
En deux mots (promis je cherche un tuto après), quelle influence cela peut avoir le caractère publique ou privé dans ce cas de bouton ?
Re : Déclarer une variable valable pour plusieurs procédures ?
Re,
Les sub Private ne peuvent être appelées qu'à partir d'autres sub du même objet. Donc tes sub Private de ton USF ne peuvent être appelées que d'autres Sub du code de ton USF. Si tu les mets en Public, tu pourra les appeler d'un module par exemple.
Pour les variables, Dim et Private ont la même fonction, je crois.
Après il y a des trucs comme Static qui sont un peu tordus, je ne maîtrise pas vraiment...