portée illimitée d'une variable?

F

Frédéric

Guest
Bonjour à tous, accros du vba,
je voudrais, en tant qu'autodidacte d'excel vba, vous soumettre une petite question, mais tout dabord, je vous rappelle le contexte :
j'ai une variable qui se crée à l'ouverture d'un fichier, mais qui se décharge dès l'arret du code
l'utilisateur de ce fichier est amené à lancer une macro qui va devoir faire appel au contenu de cette variable.

Ma question est la suivante : comment la déclarer et où afin qu'elle ne soit pas perdue à l'arret du code pour etre réutilisée ensuite? (la portée illimitée existe t' elle?)

J'ai essayé les "Public", "Static", "Public constant" mais rien n'y fait.

"Public constant" ne fonctionne pas car ma variable " nomBO" contient une constante + une variable (nomBO = "cmdouv - " & Vusername)

nb : si aucune solution n'existe je me verrais dans l'obligation de la mettre dans une cellule de mon fichier, mais bon, c'est pas top...

Merci d'avance à tous pour vos éventuelles réponses.
Bonne journée.
Cdt
FL
 
O

olive

Guest
Bonjour!

mais qu'en est-il pour une variable define dans un classeur et que l'on veut reprendre en executant une macro dans un autre classeur. Est-ce qu'une variable peut avoir une portee sur l'ensemble de l'application Excel?

Merci!

Olive
 
Y

Yeahou

Guest
Bonjour

un extrait de l'aide

Les variables déclarées avec l'instruction Public sont accessibles à toutes les procédures, dans l'ensemble des modules de toutes les applications, à moins que Option Private Module ne soit activé. Dans ce cas, les variables ne sont publiques qu'au sein du projet qui les accueille.

Cordialement, A+
 
O

olive

Guest
Eh bien c'est cense etre comme cela, mais je n'y arrive toujours pas...

prenons un cas pratique: je dois mal me debrouiller (je suis novice en la matiere):

OBJECTIF: Je voudrais pouvoir utiliser une variable d'un classeur dans un autre. Explication: j'ai un classeur 1 qui fait appel a une macro d'un classeur 2 (qui est mon classeur de macros). Je n'arrive pas a utiliser dans le classeur 2 une variable definie dans le classeur 1 .

Imaginons la macro dans le classeur 1
-----------------------
sub macro1

mavar="bonjour" 'je definis ma variable
workbooks.open ("c:testmacro.xls") 'j'ouvre le classeur ou se trouve la macro que je veux lancer
run ("testmacro.xls!macro2") 'lance la macro

end sub
-----------------------
et dans le classeur 2, une fois ouvert
-----------------------
sub macro2

msg=msgbox(mavar)

end sub
-----------------------

Lorsque la macro2 se lance, mavar est revenue a une valeur "empty".


Alors j'ai essaye les choses suivantes:

-----------------------
Option Explicit
Public MaVar As String

Sub macro1()

MaVar = "bonjour" 'je definis ma variable
Workbooks.Open ("c:testmacro.xls") 'j'ouvre le classeur ou se trouve la macro que je veux lancer
Run ("testmacro.xls!macro2") 'lance la macro===> ON PASSE SUR LA MACRO2
End Sub
-----------------------
Sub macro2()

msg = MsgBox(MaVar) '==> IL N'A PAS GARDE LA VALEUR DE MAVAR

End Sub
-----------------------


J'ai egalement esaye ceci:
-----------------------
Option Explicit
Public MaVar As String

Sub macro1()

MaVar = "bonjour" 'je definis ma variable
Workbooks.Open ("c:testmacro.xls") 'j'ouvre le classeur ou se trouve la macro que je veux lancer
Run ("testmacro.xls!macro2(MaVar)") 'lance la macro==> MARCHE PAS: THE MACRO CANNOT BE FOUND

End Sub

-----------------------
Enfin, j'ai essaye les deux macros ci-dessus avec la macro2 suivante:

Sub macro2(MaVar As String)

msg = MsgBox(MaVar)

End Sub



Est-ce que vous pouvez m'aider?
Ca a l'air vraiment simple, mais je n'y arrive toujours pas

merci beaucoup!!!
 
Y

Yeahou

Guest
Bonjour

J'ai testé et ce n'est effectivement pas si simple. Les variables publiques ne se transmettent pas mais on peut contourner.
l'exemple joint utilise une méthode basée sur des fonctions du classeur 1 appelées à l'ouverture et à la fermeture du classeur 2.
il suffit que les deux classeurs soient ouverts pour que la valeur de la variable se transmette de l'un à l'autre.

tu peux utiliser la même syntaxe pour lancer une macro d'un autre classeur avec en arguments les variables du classeur qui lance la macro. Cela serait encore plus simple.
Application.Run("autreclasseur.xls!Macroalancer", Ma_Variable1, Ma_Variable2, Ma_Variable3, Ma_Variable4, Ma_Variable5)

Cordialement, A+
 

Pièces jointes

  • Exemple2.zip
    23.7 KB · Affichages: 33
  • Exemple2.zip
    23.7 KB · Affichages: 30
  • Exemple2.zip
    23.7 KB · Affichages: 30
Y

Yeahou

Guest
Re bonjour

voici un autre exemple illustrant le passage direct d'arguments à une macro d'un autre classeur.
le bouton du classeur3 lance une macro du classeur4 qui affiche un message correspondant à une variable du classeur3.

Cordialement, A+
 

Pièces jointes

  • Exemple3.zip
    16.2 KB · Affichages: 34
  • Exemple3.zip
    16.2 KB · Affichages: 24
  • Exemple3.zip
    16.2 KB · Affichages: 34
O

olive

Guest
Merci pour votre aide!!

En effet, il fallait specifier les arguments pour exporter la variable... Ca fonctionne maintenant...
Mais a present, j'ai un autre probleme pour ces macros liees: je n'arrive pas pas faire un exit sub correct...

Donc, nouveau sujet!

Frederic, est-ce que ca repond a tes attentes?

Merci a tous!
 
F

Frédéric

Guest
Bonjour à tous,

merci pour vos réponses, grace à elles, nous pouvons avancer dans nos démarches, nous les autodidactes du vba.

Merci pour ces infos sur les variables qui répondent à 95% à mes besoins (les 5% manquants?......, cela correspondrait à creer une variable "indestructible" qui garderait sa valeur meme quand le vba est stoppé, mais bon, j'ai cru comprendre que cela n'etait pas possible..., alors on fera avec)

encore merci

A bientot

excel-lement
frederic
 

Statistiques des forums

Discussions
312 332
Messages
2 087 361
Membres
103 530
dernier inscrit
Chess01