Différence entre variable privée ou publique et variable d'argument d'un Sub

Mic13710

XLDnaute Junior
Bonjour à tous,

Je m'arrache les cheveux depuis ce matin avec un étrange comportement concernant des variables.
Pour mon application, j'ai déclaré des variables publiques. J'utilise ces mêmes variables dans les arguments de deux de mes Sub et c'est là que ça coince.
En effet, il semble que même si ces variables portent le même nom, elles sont considérées par excel comme deux variables distinctes.

Je m'explique.
J'ai 3 variables publiques que j'utilise dans différentes procédures :
Public Var1 as Boolean
Public Var2 as Boolean
Public Var3 as Boolean

Et deux Procédures utilisant ces mêmes variables :
Sub Proc1(Var1 as Boolean, Var2 as Boolean, Var3 as Boolean)
Sub Proc2(Var1 as Boolean, Var2 as Boolean, Var3 as Boolean)

Si j'écris Proc1 False, False, True
et que j'appelle à partir de Proc1 une procédure dans laquelle les mêmes variables sont utilisées, les 3 variables sont bien attribuées dans Proc1, mais ne sont pas transférées dans la procédure appelée.
Si bien que je peux avoir simultanément Var1 = False dans Proc1 et Var1 = True dans la procédure appelée !
idem pour les 2 autres variables.
J'ai beau écrire dans Proc1 un truc qui me semble stupide, mais pourquoi pas essayer :
Var1 = Var1
Var2 = Var2
Var3 = Var3
ça ne change rien : j'ai bien 2 variables portant le même nom avec 2 valeurs différentes.

Comment est-ce possible ?

Perso, je ne vois pas ce qui explique un tel comportement. J'aimerais comprendre.

Merci pour votre aide.
 

Pierrot93

XLDnaute Barbatruc
Re : Différence entre variable privée ou publique et variable d'argument d'un Sub

Bonjour,

bah... peut être utiliser d'autres noms pour tes variables "public".... pas top d'utiliser les mêmes noms, surtout si dans même module....

bonne journée
@+
 

Herdet

Nous a quitté
Repose en paix
Re : Différence entre variable privée ou publique et variable d'argument d'un Sub

Bonjour à tous,
Je m'arrache les cheveux depuis ce matin avec un étrange comportement concernant des variables.
Pour mon application, j'ai déclaré des variables publiques. J'utilise ces mêmes variables dans les arguments de deux de mes Sub et c'est là que ça coince.
En effet, il semble que même si ces variables portent le même nom, elles sont considérées par excel comme deux variables distinctes.

Je m'explique.
J'ai 3 variables publiques que j'utilise dans différentes procédures :
Public Var1 as Boolean
Public Var2 as Boolean
Public Var3 as Boolean

Et deux Procédures utilisant ces mêmes variables :
Sub Proc1(Var1 as Boolean, Var2 as Boolean, Var3 as Boolean)
Sub Proc2(Var1 as Boolean, Var2 as Boolean, Var3 as Boolean)

Si j'écris Proc1 False, False, True
et que j'appelle à partir de Proc1 une procédure dans laquelle les mêmes variables sont utilisées, les 3 variables sont bien attribuées dans Proc1, mais ne sont pas transférées dans la procédure appelée.
Si bien que je peux avoir simultanément Var1 = False dans Proc1 et Var1 = True dans la procédure appelée !
idem pour les 2 autres variables.
J'ai beau écrire dans Proc1 un truc qui me semble stupide, mais pourquoi pas essayer :
Var1 = Var1
Var2 = Var2
Var3 = Var3
ça ne change rien : j'ai bien 2 variables portant le même nom avec 2 valeurs différentes.

Comment est-ce possible ?

Perso, je ne vois pas ce qui explique un tel comportement. J'aimerais comprendre.

Merci pour votre aide.
Bonjour,

Le fait de redéfinir en local les variables en arguments par Sub Proc1(Var1 as Boolean, Var2 as Boolean, Var3 as Boolean) prend le pas sur la définition publique car elles sont réinitialisées localement.
Action : affecter des valeurs à Var1, Var2 et Var3 et ensuite faire l'appel de Sub Proc1() simplement sans arguments

Cordialement
Robert
 

Mic13710

XLDnaute Junior
Re : Différence entre variable privée ou publique et variable d'argument d'un Sub

Bonjour à tous les 2 et merci pour vos réponses.

Robert, c'est comme ça que je fonctionnait avant de modifier mes procédures, mais comme j'avais à chaque fois mes variables à affecter avant, j'ai opté pour une déclaration par argument.
Par contre je confirme que si les variables sont réinitialisées localement, les variables publiques du même nom ne sont pas modifiées, d'où mon problème.

D'accord avec toi Pierrot qu'en attribuant d'autres noms ça fonctionne, mais je dois dans ce cas faire ceci :
Sub Proc1 (A as Boolean, B as Boolean, C as Boolean)
Var1 = A
Var2 = B
Var3 = C

Je trouve quand même très bizarre qu'il soit possible d'attribuer le même nom à une variable module (publique ou privée) et une variable argument et qu'elles puissent prendre 2 valeurs différentes à l'intérieur d'une macro sans qu'il y ait une alerte d'incompatibilité.
 

Pierrot93

XLDnaute Barbatruc
Re : Différence entre variable privée ou publique et variable d'argument d'un Sub

Re,

D'accord avec toi Pierrot qu'en attribuant d'autres noms ça fonctionne, mais je dois dans ce cas faire ceci

bah.. comment est lancée ta procédure ? tu lui passes lui les variables en argument lorsque tu la lances...
Code:
Proc1 Var1, Var2, Var3
 

Mic13710

XLDnaute Junior
Re : Différence entre variable privée ou publique et variable d'argument d'un Sub

Oui Pierrot, mais dans ce cas, il faut tout d'abord attribuer des valeurs aux Var1, Var2 et Var3. Les arguments Var1, Var2 et Var3 et les variables publiques auront les mêmes valeurs, mais à quoi bon alors utiliser des arguments si je dois aussi attribuer des valeurs aux variables du même nom ?
Ce que mon problème met en évidence, c'est qu'un argument n'est valable que dans sa propre procédure et n'est pas exportable. Qui plus est, même si je veux à l'intérieur de la procédure imposer une valeur à la variable à partir de la valeur de l'argument du même nom (Var1 = Var1), la valeur de la variable ne change pas puisque seul l'argument est pris en compte dans la procédure. Il faudrait sans doute introduire un paramètre pour dire quelque chose comme : variable Var1 = Var1 de l'argument. Mais je ne sais pas dissocier l'un de l'autre.
Pour éviter les conflits, j'ai donc opté pour des noms d'arguments différents et donné selon les besoins des valeurs aux variables à partir des arguments.
Ca marche, mais ce n'est pas trop ce que je cherchais à faire.
 

Pierrot93

XLDnaute Barbatruc
Re : Différence entre variable privée ou publique et variable d'argument d'un Sub

Re,

Oui Pierrot, mais dans ce cas, il faut tout d'abord attribuer des valeurs aux Var1, Var2 et Var3
oui, mais puisque tu appele une procédure avec arguments.... bien obligé... quelque chose doit m'échapper car je ne vois pas très bien le problème.....
 

Mic13710

XLDnaute Junior
Re : Différence entre variable privée ou publique et variable d'argument d'un Sub

Et bien je pensais tout bêtement que si un argument portait le même nom qu'une variable, la valeur pouvait-être attribuée indifféremment à l'un ou l'autre, la dernière valeur attribuée étant la seule valable tout au long d'une macro, ce qui évitait une double écriture.
Mais de ce que j'ai pu observer, j'en conclus que ce n'est pas possible puisque que visiblement une variable et un argument peuvent avoir le même nom sans avoir la même valeur.
 

Efgé

XLDnaute Barbatruc
Re : Différence entre variable privée ou publique et variable d'argument d'un Sub

Bonjour à tous,
Désolé de m'immiscer dans la conversation, mais...
En quoi est-il interressant de passer en argument une variable public ?
Si elle est public, n'importe quelle sub ou fonction peut l'utiliser non ?
Si tu passe une variable en argument, il faut au préalable la valoriser de tout façon.
Si tu utilise une variable public il faut la valoriser également.
Je ne vois pas du tout l'interet de la manip, mais peut être ai-je raté quelque chose...
Cordialement
 

Mic13710

XLDnaute Junior
Re : Différence entre variable privée ou publique et variable d'argument d'un Sub

Si tu écris
Proc1 True, False, True
Tu attribues bien une valeur à chaque argument Var1, Var2, Var3.
Mon intention au départ était de dire que si le nom de l'argument reprend le nom d'une variable, la valeur attribuée serait commune aux deux parce que je ne voyais pas de différence entre une variable déclarée dans un module (ou à l'intérieure d'une procédure) et une variable passée en argument. Je précise bien que c'était mon interprétation.
La notion de public ou privé n'a pas d'importance ici. Mes variables sont tout simplement publiques parce que je les utilisent dans d'autres modules.
Ce que mon essai m'a appris c'est qu'on peut faire cohabiter une variable et un argument portant le même nom avec 2 valeurs différentes à l'intérieur d'une même macro, ce qui est très surprenant. Il y a donc clairement un cloisonnement entre les niveaux des variables en et hors procédure.
 

Herdet

Nous a quitté
Repose en paix
Re : Différence entre variable privée ou publique et variable d'argument d'un Sub

C'est quand même bizarre ou bien un morceau de code nous à échappé car le code ci-dessous modifie bien les variables publiques après l'exécution du sous-programme "sous_test"
----------------------------------------------------------
Public var1, var2, var3 As Variant
Sub test1()
var1 = 10
var2 = 20
var3 = 30
Debug.Print "1 : " & var1; " "; var2; " "; var3
Call sous_test(var1, var2, var3)
Debug.Print "4 : " & var1; " "; var2; " "; var3
End Sub

Sub sous_test(var1 As Variant, var2 As Variant, var3 As Variant)
Debug.Print "2 : " & var1; " "; var2; " "; var3
var1 = 1000
var2 = 2000
var3 = 3000
Debug.Print "3 : " & var1; " "; var2; " "; var3
End Sub

----------------------
1 : 10 20 30
2 : 10 20 30
3 : 1000 2000 3000
4 : 1000 2000 3000
 

Mic13710

XLDnaute Junior
Re : Différence entre variable privée ou publique et variable d'argument d'un Sub

Oui Herdet, ton code fonctionne puisque tu assignes des arguments à chaque procédure.
Dans mon cas, c'est différent puisque de mes procédures avec arguments, j'appelle d'autres procédures sans argument à l'intérieur desquelles j'ai des variables dont les noms sont les mêmes que les arguments de la procédure appelante.

Par exemple :

Proc1 True, False, True

Sub Proc1 (Var1 as Boolean, Var2 as Boolean, Var3 as Boolean)
Bla bla Bla
Tartempion
Bla Bla Bla
End Sub

Sub Tartempion()
If Var1 Then
Bla Bla Bla
End if
End Sub

Dans ce cas, la variable Var1 n'aura pas la valeur de l'argument de Proc1 puisqu'elle n'a pas été portée par un argument dans Tartempion, mais une valeur indépendante qui peut-être False ou True suivant la valeur attribuée à Var1 par la Macro avant d'atteindre Proc1.
 
Dernière édition:

Herdet

Nous a quitté
Repose en paix
Re : Différence entre variable privée ou publique et variable d'argument d'un Sub

Logiquement, tant qu'un sous-programme ne modifie pas la valeur de var1, elle gardera la valeur publique d'origine.
Si une proc modifie var1 la nouvelle valeur publique sera celle modifiée par la proc.
Conclusion : pourquoi perdre du temps à comprendre un mauvais fonctionnement assez prévisible d'ailleurs ?
Pour maitriser les valeurs de variables, il faut bien les gérer et leur donner des noms différents.
 

Mic13710

XLDnaute Junior
Re : Différence entre variable privée ou publique et variable d'argument d'un Sub

Je suis d'accord aussi et je suis moi-même très pointilleux sur les noms des variables et leur déclaration. J'ai bien sûr donné des noms différents et tout est ok.
C'est juste ce fonctionnement étrange avec 1 variable qui peut prendre 2 valeurs différentes sans qu'Excel ne s'en offusque qui me semble surprenant.

Bonsoir à tous et merci pour votre aide. J'aurai encore appris quelque chose.
 

Discussions similaires

Réponses
8
Affichages
615