Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Transferer les valeurs de variables

6 réponses
Avatar
JacMar
Je travaille en Excel 2002.
Suite à un message précédent, j'ai trouvé comment transferer la valeur d'une
variable d'une sous-routine à une autre à l'intérieur d'un même projet. J'ai
utilisé la déclaration: "Public ... " .

Cependant ça ne semble pas fonctionner quand la variable est d'abord définie
à l'intérieur d'un formulaire. Tant que je reste dans la procédure du
"Private Sub CmdOK_Click ()", il n'y a pas de problème, mais du moment que
j'en sort, les variables définies dans le formulaire ne sont plus
accessibles. Elles ont été déclarées "Public", dans le module qui appelle ce
formulaire.

Merci d'avance.

6 réponses

Avatar
michdenis
Bonjour JacMar,

Si ta variable a été définie comme Public dans un module Standard, il ne faut pas la définir aussi "localement" au niveau de la
procédure elle-même sinon la variable locale aura la préséance dans ladite procédure et la variable publique sera tenue à l'écart
... en conséquence elle n'affichera pas les modifications survenues à sa valeur par la procédure.


Salutations!



"JacMar" a écrit dans le message de news:
Je travaille en Excel 2002.
Suite à un message précédent, j'ai trouvé comment transferer la valeur d'une
variable d'une sous-routine à une autre à l'intérieur d'un même projet. J'ai
utilisé la déclaration: "Public ... " .

Cependant ça ne semble pas fonctionner quand la variable est d'abord définie
à l'intérieur d'un formulaire. Tant que je reste dans la procédure du
"Private Sub CmdOK_Click ()", il n'y a pas de problème, mais du moment que
j'en sort, les variables définies dans le formulaire ne sont plus
accessibles. Elles ont été déclarées "Public", dans le module qui appelle ce
formulaire.

Merci d'avance.
Avatar
docm
Voici comment Laurent Longré résumait la question de la portée des
variables:

Une variable de niveau module est une variable déclarée au début du
module, avant toute procédure ou fonction. Elle s'oppose aux "variables
locales" par sa portée (le module tout entier) et sa durée de vie
("illimitée").

Par exemple :

Dim Toto As Boolean ' <= variable globale de niveau module

Sub Test
Dim Tata As Boolean ' <= variable locale à la procédure Test
End Sub

La variable Toto :

- est accessible à partir de n'importe quelle procédure ou fonction du
module, et éventuellement des autres modules et / ou d'autres classeurs
si elle est déclarée à l'aide du mot-clé "Public".
- conserve sa valeur tant que le classeur n'est pas fermé ni le projet
VBA réinitialisé.

La variable Tata de la procédure Test :

- n'est accessible qu'à l'intérieur de la procédure où elle est
déclarée.
- est "détruite" à la fin de l'exécution de cette procédure, à moins
qu'elle soit déclarée à l'aide du mot-clé "Static".

Pour résumer :

Variable de niveau module :
- déclarée avec Dim : portée module, durée de vie "illimitée"
- déclarée avec Public : portée classeur, durée de vie "illimitée"

Variable locale à une procédure :
- déclarée avec Dim : portée "procédure", détruite à la fin de celle-ci
- déclarée avec Static : portée procédure, durée de vie "illimitée"

Si une variable est destinée à conserver sa valeur entre chaque
exécution de la macro, et / ou si elle doit être accessible par un grand
nombre de procédures différentes, il faut la déclarer au niveau module,
avec ou sans le mot-clé Public selon que l'on veut la partager ou non
avec les autres modules du projet.

Quant à "variable d'état", ça désigne en général une variable booléenne
ou entière destinée à mémoriser si une action particulière s'est
produite, de manière par exemple à éviter d'exécuter une macro dans un
contexte où elle déclencherait une erreur. Par nature, ce type de
variable est souvent de niveau module.

Par exemple, la variable suivante permet d'indiquer à la procédure
Workbook_Open si la fermeture du classeur est demandée par une autre
procédure (AutoriserFermeture = True) ou par l'utilisateur
(AutoriserFermeture = False par défaut).

Dans le module ThisWorkbook :

Public AutoriserFermeture As Boolean

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Cancel = Not AutoriserFermeture
End Sub

Et ensuite, pour fermer le classeur par macro :

Sub FermerClasseur()
ThisWorkbook.AutoriserFermeture = True
ThisWorkbook.Close
End Sub

Cette "variable d'état" empêche la fermeture "manuelle" du classeur par
l'utilisateur.

Comme autre type de "variable d'état", il y a par exemple les variables
stockant l'état de certains contrôles des DialogSheets avant leur
fermeture, de manière à orienter l'exécution ultérieure de la macro
selon l'état de ces contrôles, etc.

"JacMar" a écrit dans le message news:

Je travaille en Excel 2002.
Suite à un message précédent, j'ai trouvé comment transferer la valeur
d'une

variable d'une sous-routine à une autre à l'intérieur d'un même projet.
J'ai

utilisé la déclaration: "Public ... " .

Cependant ça ne semble pas fonctionner quand la variable est d'abord
définie

à l'intérieur d'un formulaire. Tant que je reste dans la procédure du
"Private Sub CmdOK_Click ()", il n'y a pas de problème, mais du moment que
j'en sort, les variables définies dans le formulaire ne sont plus
accessibles. Elles ont été déclarées "Public", dans le module qui appelle
ce

formulaire.

Merci d'avance.


Avatar
JacMar
Merci pour les infos. Je vais ré-examiner.



"docm" wrote:

Voici comment Laurent Longré résumait la question de la portée des
variables:

Une variable de niveau module est une variable déclarée au début du
module, avant toute procédure ou fonction. Elle s'oppose aux "variables
locales" par sa portée (le module tout entier) et sa durée de vie
("illimitée").

Par exemple :

Dim Toto As Boolean ' <= variable globale de niveau module

Sub Test
Dim Tata As Boolean ' <= variable locale à la procédure Test
End Sub

La variable Toto :

- est accessible à partir de n'importe quelle procédure ou fonction du
module, et éventuellement des autres modules et / ou d'autres classeurs
si elle est déclarée à l'aide du mot-clé "Public".
- conserve sa valeur tant que le classeur n'est pas fermé ni le projet
VBA réinitialisé.

La variable Tata de la procédure Test :

- n'est accessible qu'à l'intérieur de la procédure où elle est
déclarée.
- est "détruite" à la fin de l'exécution de cette procédure, à moins
qu'elle soit déclarée à l'aide du mot-clé "Static".

Pour résumer :

Variable de niveau module :
- déclarée avec Dim : portée module, durée de vie "illimitée"
- déclarée avec Public : portée classeur, durée de vie "illimitée"

Variable locale à une procédure :
- déclarée avec Dim : portée "procédure", détruite à la fin de celle-ci
- déclarée avec Static : portée procédure, durée de vie "illimitée"

Si une variable est destinée à conserver sa valeur entre chaque
exécution de la macro, et / ou si elle doit être accessible par un grand
nombre de procédures différentes, il faut la déclarer au niveau module,
avec ou sans le mot-clé Public selon que l'on veut la partager ou non
avec les autres modules du projet.

Quant à "variable d'état", ça désigne en général une variable booléenne
ou entière destinée à mémoriser si une action particulière s'est
produite, de manière par exemple à éviter d'exécuter une macro dans un
contexte où elle déclencherait une erreur. Par nature, ce type de
variable est souvent de niveau module.

Par exemple, la variable suivante permet d'indiquer à la procédure
Workbook_Open si la fermeture du classeur est demandée par une autre
procédure (AutoriserFermeture = True) ou par l'utilisateur
(AutoriserFermeture = False par défaut).

Dans le module ThisWorkbook :

Public AutoriserFermeture As Boolean

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Cancel = Not AutoriserFermeture
End Sub

Et ensuite, pour fermer le classeur par macro :

Sub FermerClasseur()
ThisWorkbook.AutoriserFermeture = True
ThisWorkbook.Close
End Sub

Cette "variable d'état" empêche la fermeture "manuelle" du classeur par
l'utilisateur.

Comme autre type de "variable d'état", il y a par exemple les variables
stockant l'état de certains contrôles des DialogSheets avant leur
fermeture, de manière à orienter l'exécution ultérieure de la macro
selon l'état de ces contrôles, etc.

"JacMar" a écrit dans le message news:

Je travaille en Excel 2002.
Suite à un message précédent, j'ai trouvé comment transferer la valeur
d'une

variable d'une sous-routine à une autre à l'intérieur d'un même projet.
J'ai

utilisé la déclaration: "Public ... " .

Cependant ça ne semble pas fonctionner quand la variable est d'abord
définie

à l'intérieur d'un formulaire. Tant que je reste dans la procédure du
"Private Sub CmdOK_Click ()", il n'y a pas de problème, mais du moment que
j'en sort, les variables définies dans le formulaire ne sont plus
accessibles. Elles ont été déclarées "Public", dans le module qui appelle
ce

formulaire.

Merci d'avance.







Avatar
JacMar
Présentement, voici ce que j'ai:

"Public TxtNom as String (C'est le seul endroit ou la variable TxtNom est
déclarée)

"Sub FormulaireCondo ()

". . .
". . .
"FRMCondo.show
"End Sub

Dans le formulaire FRMCondo, j'entre du texte dans une "TextBox" identifiée
comme TxtNom. Je peux utiliser la valeur de TxtNom dans la procédure "Private
Sub CmdOK_Click ()" qui s'active quand je "clique" sur un bouton OK que j'ai
créé sur le formulaire.
Si, cependant, j'essaye d'utiliser la valeur de TxtNom
(ActiveCell.value=TxtNom) dans une autre sub dans le même workbook, après
être passé par le formulaire, sa valeur semble être "", c'est à dire: rien.

Que se passe-t-il. Si je comprends bien la plupart des réponses jusqu'à
maintenant, ça devrait marcher.

Merci encore d'avance.

"docm" wrote:

Voici comment Laurent Longré résumait la question de la portée des
variables:

Une variable de niveau module est une variable déclarée au début du
module, avant toute procédure ou fonction. Elle s'oppose aux "variables
locales" par sa portée (le module tout entier) et sa durée de vie
("illimitée").

Par exemple :

Dim Toto As Boolean ' <= variable globale de niveau module

Sub Test
Dim Tata As Boolean ' <= variable locale à la procédure Test
End Sub

La variable Toto :

- est accessible à partir de n'importe quelle procédure ou fonction du
module, et éventuellement des autres modules et / ou d'autres classeurs
si elle est déclarée à l'aide du mot-clé "Public".
- conserve sa valeur tant que le classeur n'est pas fermé ni le projet
VBA réinitialisé.

La variable Tata de la procédure Test :

- n'est accessible qu'à l'intérieur de la procédure où elle est
déclarée.
- est "détruite" à la fin de l'exécution de cette procédure, à moins
qu'elle soit déclarée à l'aide du mot-clé "Static".

Pour résumer :

Variable de niveau module :
- déclarée avec Dim : portée module, durée de vie "illimitée"
- déclarée avec Public : portée classeur, durée de vie "illimitée"

Variable locale à une procédure :
- déclarée avec Dim : portée "procédure", détruite à la fin de celle-ci
- déclarée avec Static : portée procédure, durée de vie "illimitée"

Si une variable est destinée à conserver sa valeur entre chaque
exécution de la macro, et / ou si elle doit être accessible par un grand
nombre de procédures différentes, il faut la déclarer au niveau module,
avec ou sans le mot-clé Public selon que l'on veut la partager ou non
avec les autres modules du projet.

Quant à "variable d'état", ça désigne en général une variable booléenne
ou entière destinée à mémoriser si une action particulière s'est
produite, de manière par exemple à éviter d'exécuter une macro dans un
contexte où elle déclencherait une erreur. Par nature, ce type de
variable est souvent de niveau module.

Par exemple, la variable suivante permet d'indiquer à la procédure
Workbook_Open si la fermeture du classeur est demandée par une autre
procédure (AutoriserFermeture = True) ou par l'utilisateur
(AutoriserFermeture = False par défaut).

Dans le module ThisWorkbook :

Public AutoriserFermeture As Boolean

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Cancel = Not AutoriserFermeture
End Sub

Et ensuite, pour fermer le classeur par macro :

Sub FermerClasseur()
ThisWorkbook.AutoriserFermeture = True
ThisWorkbook.Close
End Sub

Cette "variable d'état" empêche la fermeture "manuelle" du classeur par
l'utilisateur.

Comme autre type de "variable d'état", il y a par exemple les variables
stockant l'état de certains contrôles des DialogSheets avant leur
fermeture, de manière à orienter l'exécution ultérieure de la macro
selon l'état de ces contrôles, etc.

"JacMar" a écrit dans le message news:

Je travaille en Excel 2002.
Suite à un message précédent, j'ai trouvé comment transferer la valeur
d'une

variable d'une sous-routine à une autre à l'intérieur d'un même projet.
J'ai

utilisé la déclaration: "Public ... " .

Cependant ça ne semble pas fonctionner quand la variable est d'abord
définie

à l'intérieur d'un formulaire. Tant que je reste dans la procédure du
"Private Sub CmdOK_Click ()", il n'y a pas de problème, mais du moment que
j'en sort, les variables définies dans le formulaire ne sont plus
accessibles. Elles ont été déclarées "Public", dans le module qui appelle
ce

formulaire.

Merci d'avance.







Avatar
michdenis
Il faut faire la différence entre le contrôle (textbox) TxtNom et la variable TxtNom...

Pourquoi leur donnes-tu le même nom ? Un tout petit peu d'imagination et cela va fonctionner !

Dans ta procédure, Excel renseigne ton textbox "txtnom" et non ta variable, lorsque tu fermes ton formulaire,
la valeur du textbox disparaît et comme ta variable txtnom n'a pas été renseigné... c'est normal qu'elle affiche ""

Tu te souviens de ce que j'ai énoncé : au niveau de la procédure, le "local" a préséance sur le "Public".


Salutations!



"JacMar" a écrit dans le message de news:
Présentement, voici ce que j'ai:

"Public TxtNom as String (C'est le seul endroit ou la variable TxtNom est
déclarée)

"Sub FormulaireCondo ()

". . .
". . .
"FRMCondo.show
"End Sub

Dans le formulaire FRMCondo, j'entre du texte dans une "TextBox" identifiée
comme TxtNom. Je peux utiliser la valeur de TxtNom dans la procédure "Private
Sub CmdOK_Click ()" qui s'active quand je "clique" sur un bouton OK que j'ai
créé sur le formulaire.
Si, cependant, j'essaye d'utiliser la valeur de TxtNom
(ActiveCell.value=TxtNom) dans une autre sub dans le même workbook, après
être passé par le formulaire, sa valeur semble être "", c'est à dire: rien.

Que se passe-t-il. Si je comprends bien la plupart des réponses jusqu'à
maintenant, ça devrait marcher.

Merci encore d'avance.

"docm" wrote:

Voici comment Laurent Longré résumait la question de la portée des
variables:

Une variable de niveau module est une variable déclarée au début du
module, avant toute procédure ou fonction. Elle s'oppose aux "variables
locales" par sa portée (le module tout entier) et sa durée de vie
("illimitée").

Par exemple :

Dim Toto As Boolean ' <= variable globale de niveau module

Sub Test
Dim Tata As Boolean ' <= variable locale à la procédure Test
End Sub

La variable Toto :

- est accessible à partir de n'importe quelle procédure ou fonction du
module, et éventuellement des autres modules et / ou d'autres classeurs
si elle est déclarée à l'aide du mot-clé "Public".
- conserve sa valeur tant que le classeur n'est pas fermé ni le projet
VBA réinitialisé.

La variable Tata de la procédure Test :

- n'est accessible qu'à l'intérieur de la procédure où elle est
déclarée.
- est "détruite" à la fin de l'exécution de cette procédure, à moins
qu'elle soit déclarée à l'aide du mot-clé "Static".

Pour résumer :

Variable de niveau module :
- déclarée avec Dim : portée module, durée de vie "illimitée"
- déclarée avec Public : portée classeur, durée de vie "illimitée"

Variable locale à une procédure :
- déclarée avec Dim : portée "procédure", détruite à la fin de celle-ci
- déclarée avec Static : portée procédure, durée de vie "illimitée"

Si une variable est destinée à conserver sa valeur entre chaque
exécution de la macro, et / ou si elle doit être accessible par un grand
nombre de procédures différentes, il faut la déclarer au niveau module,
avec ou sans le mot-clé Public selon que l'on veut la partager ou non
avec les autres modules du projet.

Quant à "variable d'état", ça désigne en général une variable booléenne
ou entière destinée à mémoriser si une action particulière s'est
produite, de manière par exemple à éviter d'exécuter une macro dans un
contexte où elle déclencherait une erreur. Par nature, ce type de
variable est souvent de niveau module.

Par exemple, la variable suivante permet d'indiquer à la procédure
Workbook_Open si la fermeture du classeur est demandée par une autre
procédure (AutoriserFermeture = True) ou par l'utilisateur
(AutoriserFermeture = False par défaut).

Dans le module ThisWorkbook :

Public AutoriserFermeture As Boolean

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Cancel = Not AutoriserFermeture
End Sub

Et ensuite, pour fermer le classeur par macro :

Sub FermerClasseur()
ThisWorkbook.AutoriserFermeture = True
ThisWorkbook.Close
End Sub

Cette "variable d'état" empêche la fermeture "manuelle" du classeur par
l'utilisateur.

Comme autre type de "variable d'état", il y a par exemple les variables
stockant l'état de certains contrôles des DialogSheets avant leur
fermeture, de manière à orienter l'exécution ultérieure de la macro
selon l'état de ces contrôles, etc.

"JacMar" a écrit dans le message news:

Je travaille en Excel 2002.
Suite à un message précédent, j'ai trouvé comment transferer la valeur
d'une

variable d'une sous-routine à une autre à l'intérieur d'un même projet.
J'ai

utilisé la déclaration: "Public ... " .

Cependant ça ne semble pas fonctionner quand la variable est d'abord
définie

à l'intérieur d'un formulaire. Tant que je reste dans la procédure du
"Private Sub CmdOK_Click ()", il n'y a pas de problème, mais du moment que
j'en sort, les variables définies dans le formulaire ne sont plus
accessibles. Elles ont été déclarées "Public", dans le module qui appelle
ce

formulaire.

Merci d'avance.







Avatar
docm
Il ne faut pas confondre les variables et les controles.
Une variable nommée Zaza est une chose totalement indépendante d'un controle
TextBox nommé Zaza.

Pour ne pas se mélanger, mieux vaut éviter d'utiliser le même nom pour des
choses de différentes natures.



"JacMar" a écrit dans le message news:

Présentement, voici ce que j'ai:

"Public TxtNom as String (C'est le seul endroit ou la variable TxtNom est
déclarée)

"Sub FormulaireCondo ()

". . .
". . .
"FRMCondo.show
"End Sub

Dans le formulaire FRMCondo, j'entre du texte dans une "TextBox"
identifiée

comme TxtNom. Je peux utiliser la valeur de TxtNom dans la procédure
"Private

Sub CmdOK_Click ()" qui s'active quand je "clique" sur un bouton OK que
j'ai

créé sur le formulaire.
Si, cependant, j'essaye d'utiliser la valeur de TxtNom
(ActiveCell.value=TxtNom) dans une autre sub dans le même workbook, après
être passé par le formulaire, sa valeur semble être "", c'est à dire:
rien.


Que se passe-t-il. Si je comprends bien la plupart des réponses jusqu'à
maintenant, ça devrait marcher.

Merci encore d'avance.

"docm" wrote:

Voici comment Laurent Longré résumait la question de la portée des
variables:

Une variable de niveau module est une variable déclarée au début du
module, avant toute procédure ou fonction. Elle s'oppose aux "variables
locales" par sa portée (le module tout entier) et sa durée de vie
("illimitée").

Par exemple :

Dim Toto As Boolean ' <= variable globale de niveau module

Sub Test
Dim Tata As Boolean ' <= variable locale à la procédure Test
End Sub

La variable Toto :

- est accessible à partir de n'importe quelle procédure ou fonction du
module, et éventuellement des autres modules et / ou d'autres classeurs
si elle est déclarée à l'aide du mot-clé "Public".
- conserve sa valeur tant que le classeur n'est pas fermé ni le projet
VBA réinitialisé.

La variable Tata de la procédure Test :

- n'est accessible qu'à l'intérieur de la procédure où elle est
déclarée.
- est "détruite" à la fin de l'exécution de cette procédure, à moins
qu'elle soit déclarée à l'aide du mot-clé "Static".

Pour résumer :

Variable de niveau module :
- déclarée avec Dim : portée module, durée de vie "illimitée"
- déclarée avec Public : portée classeur, durée de vie "illimitée"

Variable locale à une procédure :
- déclarée avec Dim : portée "procédure", détruite à la fin de celle-ci
- déclarée avec Static : portée procédure, durée de vie "illimitée"

Si une variable est destinée à conserver sa valeur entre chaque
exécution de la macro, et / ou si elle doit être accessible par un grand
nombre de procédures différentes, il faut la déclarer au niveau module,
avec ou sans le mot-clé Public selon que l'on veut la partager ou non
avec les autres modules du projet.

Quant à "variable d'état", ça désigne en général une variable booléenne
ou entière destinée à mémoriser si une action particulière s'est
produite, de manière par exemple à éviter d'exécuter une macro dans un
contexte où elle déclencherait une erreur. Par nature, ce type de
variable est souvent de niveau module.

Par exemple, la variable suivante permet d'indiquer à la procédure
Workbook_Open si la fermeture du classeur est demandée par une autre
procédure (AutoriserFermeture = True) ou par l'utilisateur
(AutoriserFermeture = False par défaut).

Dans le module ThisWorkbook :

Public AutoriserFermeture As Boolean

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Cancel = Not AutoriserFermeture
End Sub

Et ensuite, pour fermer le classeur par macro :

Sub FermerClasseur()
ThisWorkbook.AutoriserFermeture = True
ThisWorkbook.Close
End Sub

Cette "variable d'état" empêche la fermeture "manuelle" du classeur par
l'utilisateur.

Comme autre type de "variable d'état", il y a par exemple les variables
stockant l'état de certains contrôles des DialogSheets avant leur
fermeture, de manière à orienter l'exécution ultérieure de la macro
selon l'état de ces contrôles, etc.

"JacMar" a écrit dans le message
news:



Je travaille en Excel 2002.
Suite à un message précédent, j'ai trouvé comment transferer la valeur
d'une

variable d'une sous-routine à une autre à l'intérieur d'un même
projet.



J'ai
utilisé la déclaration: "Public ... " .

Cependant ça ne semble pas fonctionner quand la variable est d'abord
définie

à l'intérieur d'un formulaire. Tant que je reste dans la procédure du
"Private Sub CmdOK_Click ()", il n'y a pas de problème, mais du moment
que



j'en sort, les variables définies dans le formulaire ne sont plus
accessibles. Elles ont été déclarées "Public", dans le module qui
appelle



ce
formulaire.

Merci d'avance.