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

stockage des variables après fermeture d'un classeur

16 réponses
Avatar
Céline
bonjour à tous,
je me retrouve confrontée au problème suivant :
j'aimerais stocker une variable (integer) après fermeture d'un classeur
Excel car elles me seront utiles à sa prochaine ouverture.
Je me suis apercue que si on affectait purement et simplement la valeur à
cette variable (déclarée en Public dans un module), celle-ci est perdue à la
réouverture du classeur (info ou intox ? peut-être ai-je fait une mauvaise
manip ?)
J'ai donc essayé de stocker cette valeur dans un customproperties de ma
worksheets(1), et ma variable "zaza" récupère bien la valeur dans
customproperties.item(1) lors de la procédure wrkbook_open (je le teste à
l'aide d'un msgbox immédiatement ds wrkbk_open).
Mais si j'execute un msgbox zaza une fois que mon classeur est ouvert il
m'affiche 0 pour zaza
est-ce du à une mauvaise manip de ma part ou alors la réinitialisation de
toutes les variables du classeur a lieu après wrkbk_open ?

Autre question pratique d'utilisation du forum:
Dans le cas où notre question ait déjà été posée par un autre utilisateur
d'exel, existe-t-il un moyen de parcourir les post existant sur le forum (la
liste est longue :p) pour la retrouver et éviter les doublons, notamment
lorqu'on utilise ie ?
Merci de l'attention que vous accordez à nos petites préoccupations... :)
Céline

10 réponses

1 2
Avatar
michdenis
Une façon de faire :

Copie ceci dans un module standard :
Le nom retenu pour ta variable est MaVar

**********************************************
La dernière valeur retenue par la variable à la ré-ouverture de
ton classeur sera celle contenue par cette dernière au moment
de la dernière sauvegarde de ton classeur.
***********************************************

'-----------------------
Public Property Get MaVar() As Variant
Dim S As String
S = ThisWorkbook.Names("Toto").RefersTo
MaVar = Int(Right(S, Len(S) - 1))
End Property
'-----------------------

Public Property Let MaVar(ByVal vNewValue As Variant)
ThisWorkbook.Names.Add "toto", Int(vNewValue), False
End Property
'-----------------------

Ligne de commande pour attribuer une valeur à ta variable
de n'importe où dans ton code
MaVar = 25

Ligne de commande pour récupérer la valeur de ta variable
de n'importe où dans ton code
a = MaVar
Avatar
Céline
merci beaucoup MichDenis pour ta réponse...
seulement, pour ne pas recopier et utiliser bêtement ta proposition sans
comprendre, j'ai essayé de me pencher sur le comment du pourquoi, avec laide
de exel...
Malheureusement (cerveau-lent du lundi ou complexité des procédures?) je
n'ai pas été éclairée...
peux-tu m'expliquer comment tes procédures fonctionnent dans mon cas (quelle
est ici la particularité de propertyGet par rapport à une Sub standard) ? ce
sont des procédures appelées dès lors que le classeur est sauvegardé
(propertyLet) et à sa réouverture (propertyGet) ?
2ème question : un .name représente donc une donnée rattachée à mon wrkbk
(dans le cas ici)... quelle différence avec mes customproperties?
si ça ne t'ennuie pas de me sortir de ce brouillard...
MErci beaucoup en tout cas, je vais tester tout ça sur le champ...
bonne fin d'après-midi !
Avatar
michdenis
Property Get et Property Let sont 2 machin-trucs que l'on utilise habituellement
dans un module de classe. Voir l'aide d'Excel ou un bouquin sur le sujet.

L'important c'est qu'à chaque fois que tu affectes une nouvelle valeur à
la variable , "Property Let" s'exécute et affecte à un "NOM" du classeur
(invisible à l'usager) la valeur de la variable où elle est conservée.

Lorsque tu veux récupérer ta variable "Property Get" s'exécute et retrouve
la valeur du "Nom" du classeur.

L'avantage est que cela ne prend pas de procédures spéciales à l'ouverture
ou à la fermeture du classeur et la valeur de la variable est sauvegardée au même
moment de l'ensemble de tes données au moment de la sauvegarde de ton
classeur



"Céline" a écrit dans le message de news:

merci beaucoup MichDenis pour ta réponse...
seulement, pour ne pas recopier et utiliser bêtement ta proposition sans
comprendre, j'ai essayé de me pencher sur le comment du pourquoi, avec laide
de exel...
Malheureusement (cerveau-lent du lundi ou complexité des procédures?) je
n'ai pas été éclairée...
peux-tu m'expliquer comment tes procédures fonctionnent dans mon cas (quelle
est ici la particularité de propertyGet par rapport à une Sub standard) ? ce
sont des procédures appelées dès lors que le classeur est sauvegardé
(propertyLet) et à sa réouverture (propertyGet) ?
2ème question : un .name représente donc une donnée rattachée à mon wrkbk
(dans le cas ici)... quelle différence avec mes customproperties?
si ça ne t'ennuie pas de me sortir de ce brouillard...
MErci beaucoup en tout cas, je vais tester tout ça sur le champ...
bonne fin d'après-midi !
Avatar
isabelle
bonjour denis,

pourquoi ne pas mettre simplement la variable dans un "Nom" ?

Sub StokerVariable()
LaVariable = 2
Names.Add "MaVar", LaVariable, False
End Sub

Sub RécupérerVariable()
LaVariable = [MaVar]
End Sub

isabelle




Une façon de faire :

Copie ceci dans un module standard :
Le nom retenu pour ta variable est MaVar

**********************************************
La dernière valeur retenue par la variable à la ré-ouverture de
ton classeur sera celle contenue par cette dernière au moment
de la dernière sauvegarde de ton classeur.
***********************************************

'-----------------------
Public Property Get MaVar() As Variant
Dim S As String
S = ThisWorkbook.Names("Toto").RefersTo
MaVar = Int(Right(S, Len(S) - 1))
End Property
'-----------------------

Public Property Let MaVar(ByVal vNewValue As Variant)
ThisWorkbook.Names.Add "toto", Int(vNewValue), False
End Property
'-----------------------

Ligne de commande pour attribuer une valeur à ta variable
de n'importe où dans ton code
MaVar = 25

Ligne de commande pour récupérer la valeur de ta variable
de n'importe où dans ton code
a = MaVar





Avatar
michdenis
ta suggestion est bonne et fonctionnelle...


A) Le gros avantage à la méthode proposée c'est que
tu n'as pas besoin de déterminer un moment particulier
où tu dois sauvegarder ta variable...cela se fait automatiquement
au même moment de l'ensemble des données.
Aucune procédure événementielle n'est requise dans le ThisWorkbook.

B) Dans la procédure "Property Let", il serait possible d'ajouter un peu
de code pour vérifier la valeur que le programme emmagasine...
exemple dans ce cas : que la valeur passée correspond bien à l'étendue
que représente une donnée de type "integer" sinon renvoyé un message
particulier à l'usager ou définir un autre action le cas échant.

En passant, je retiens ta suggestion pour retrouver la valeur du nom.

Public Property Get MaVar() As Variant
MaVar = [toto]
End Property

Public Property Let MaVar(ByVal vNewValue As Variant)
ThisWorkbook.Names.Add "toto", Int(vNewValue), False
End Property






"isabelle" a écrit dans le message de news:
bonjour denis,

pourquoi ne pas mettre simplement la variable dans un "Nom" ?

Sub StokerVariable()
LaVariable = 2
Names.Add "MaVar", LaVariable, False
End Sub

Sub RécupérerVariable()
LaVariable = [MaVar]
End Sub

isabelle




Une façon de faire :

Copie ceci dans un module standard :
Le nom retenu pour ta variable est MaVar

**********************************************
La dernière valeur retenue par la variable à la ré-ouverture de
ton classeur sera celle contenue par cette dernière au moment
de la dernière sauvegarde de ton classeur.
***********************************************

'-----------------------
Public Property Get MaVar() As Variant
Dim S As String
S = ThisWorkbook.Names("Toto").RefersTo
MaVar = Int(Right(S, Len(S) - 1))
End Property
'-----------------------

Public Property Let MaVar(ByVal vNewValue As Variant)
ThisWorkbook.Names.Add "toto", Int(vNewValue), False
End Property
'-----------------------

Ligne de commande pour attribuer une valeur à ta variable
de n'importe où dans ton code
MaVar = 25

Ligne de commande pour récupérer la valeur de ta variable
de n'importe où dans ton code
a = MaVar





Avatar
isabelle
rebonjour denis,

je comprend bien que la méthode Property Get et Property Let évite de devoir utilisé un événement,

mais il faut quant même soit créer la variable ou bien si elle est déjà créer possiblement en changer la valeur
en exécutant une macro (événement ou non), n'est il pas mieux à ce moment de stoker cette valeur dans un "Nom" ?

isabelle



ta suggestion est bonne et fonctionnelle...


A) Le gros avantage à la méthode proposée c'est que
tu n'as pas besoin de déterminer un moment particulier
où tu dois sauvegarder ta variable...cela se fait automatiquement
au même moment de l'ensemble des données.
Aucune procédure événementielle n'est requise dans le ThisWorkbook.

B) Dans la procédure "Property Let", il serait possible d'ajouter un peu
de code pour vérifier la valeur que le programme emmagasine...
exemple dans ce cas : que la valeur passée correspond bien à l'étendue
que représente une donnée de type "integer" sinon renvoyé un message
particulier à l'usager ou définir un autre action le cas échant.

En passant, je retiens ta suggestion pour retrouver la valeur du nom.

Public Property Get MaVar() As Variant
MaVar = [toto]
End Property

Public Property Let MaVar(ByVal vNewValue As Variant)
ThisWorkbook.Names.Add "toto", Int(vNewValue), False
End Property






"isabelle" a écrit dans le message de news:
bonjour denis,

pourquoi ne pas mettre simplement la variable dans un "Nom" ?

Sub StokerVariable()
LaVariable = 2
Names.Add "MaVar", LaVariable, False
End Sub

Sub RécupérerVariable()
LaVariable = [MaVar]
End Sub

isabelle





Une façon de faire :

Copie ceci dans un module standard :
Le nom retenu pour ta variable est MaVar

**********************************************
La dernière valeur retenue par la variable à la ré-ouverture de
ton classeur sera celle contenue par cette dernière au moment
de la dernière sauvegarde de ton classeur.
***********************************************

'-----------------------
Public Property Get MaVar() As Variant
Dim S As String
S = ThisWorkbook.Names("Toto").RefersTo
MaVar = Int(Right(S, Len(S) - 1))
End Property
'-----------------------

Public Property Let MaVar(ByVal vNewValue As Variant)
ThisWorkbook.Names.Add "toto", Int(vNewValue), False
End Property
'-----------------------

Ligne de commande pour attribuer une valeur à ta variable
de n'importe où dans ton code
MaVar = 25

Ligne de commande pour récupérer la valeur de ta variable
de n'importe où dans ton code
a = MaVar










Avatar
michdenis
Bonjour Isabelle,

'-----------------------
Public Property Get MaVar() As Variant
MaVar = [toto]
End Property
'-----------------------
Public Property Let MaVar(ByVal vNewValue As Variant)
ThisWorkbook.Names.Add "toto", Int(vNewValue), False
End Property
'-----------------------

Afin de comprendre comme cela fonctionne, essaie la !
Nul besoin de créer une variable particulière, elle est la : MaVar

Si tu écris dans une procédure et que tu le fais en pas en pas, tu vas t'apercevoir
que "Property Let" est exécuté à chaque fois que tu modifies la valeur de la variable MaVar
'----------------
Sub Pour_Passer_UneValeur_à_Ta_Variable()
MaVar = 28
End Sub
'----------------

Lorsque tu veux retrouver la valeur de ta variable MaVar,
"Property Get" s'exécute et retrouve la valeur associé au "NOM" du classeur.
'----------------
Sub Pour_Récupérer_La_Valeur_De_Ta_Variable()
a = MaVar
End Sub
'----------------

Comme "Property Let" ou "Property Get" s'exécute à chaque fois
qu'intervient la variable MyVar, tu pourrais si le besoin était là, ajouter du
code à ces petites procédures pour effectuer quelques vérifications ou
actions à chaque appel de la variable MyVar car peu importe de quel
module ta variable est appelée, tu connais la source de l'appel de la variable
d'où un meilleur contrôle le cas échéant.

Cette proposition avait pour but de présenter quelque chose de nouveau
à cette problématique(sauvegarde de la valeur d'une variable au moment de
fermer le classeur)




"isabelle" a écrit dans le message de news:
rebonjour denis,

je comprend bien que la méthode Property Get et Property Let évite de devoir utilisé un événement,

mais il faut quant même soit créer la variable ou bien si elle est déjà créer possiblement en
changer la valeur
en exécutant une macro (événement ou non), n'est il pas mieux à ce moment de stoker cette valeur
dans un "Nom" ?

isabelle



ta suggestion est bonne et fonctionnelle...


A) Le gros avantage à la méthode proposée c'est que
tu n'as pas besoin de déterminer un moment particulier
où tu dois sauvegarder ta variable...cela se fait automatiquement
au même moment de l'ensemble des données.
Aucune procédure événementielle n'est requise dans le ThisWorkbook.

B) Dans la procédure "Property Let", il serait possible d'ajouter un peu
de code pour vérifier la valeur que le programme emmagasine...
exemple dans ce cas : que la valeur passée correspond bien à l'étendue
que représente une donnée de type "integer" sinon renvoyé un message
particulier à l'usager ou définir un autre action le cas échant.

En passant, je retiens ta suggestion pour retrouver la valeur du nom.

Public Property Get MaVar() As Variant
MaVar = [toto]
End Property

Public Property Let MaVar(ByVal vNewValue As Variant)
ThisWorkbook.Names.Add "toto", Int(vNewValue), False
End Property






"isabelle" a écrit dans le message de news:
bonjour denis,

pourquoi ne pas mettre simplement la variable dans un "Nom" ?

Sub StokerVariable()
LaVariable = 2
Names.Add "MaVar", LaVariable, False
End Sub

Sub RécupérerVariable()
LaVariable = [MaVar]
End Sub

isabelle





Une façon de faire :

Copie ceci dans un module standard :
Le nom retenu pour ta variable est MaVar

**********************************************
La dernière valeur retenue par la variable à la ré-ouverture de
ton classeur sera celle contenue par cette dernière au moment
de la dernière sauvegarde de ton classeur.
***********************************************

'-----------------------
Public Property Get MaVar() As Variant
Dim S As String
S = ThisWorkbook.Names("Toto").RefersTo
MaVar = Int(Right(S, Len(S) - 1))
End Property
'-----------------------

Public Property Let MaVar(ByVal vNewValue As Variant)
ThisWorkbook.Names.Add "toto", Int(vNewValue), False
End Property
'-----------------------

Ligne de commande pour attribuer une valeur à ta variable
de n'importe où dans ton code
MaVar = 25

Ligne de commande pour récupérer la valeur de ta variable
de n'importe où dans ton code
a = MaVar










Avatar
gérard
bonjour
question de debutant peut etre
et pourquoi ne pas stocker la varieble dans une cellule, a la fermeture
et la recuperere a l'ouverture ?
merci
"Céline" a écrit dans le message de news:

bonjour à tous,
je me retrouve confrontée au problème suivant :
j'aimerais stocker une variable (integer) après fermeture d'un classeur
Excel car elles me seront utiles à sa prochaine ouverture.
Je me suis apercue que si on affectait purement et simplement la valeur à
cette variable (déclarée en Public dans un module), celle-ci est perdue à
la
réouverture du classeur (info ou intox ? peut-être ai-je fait une mauvaise
manip ?)
J'ai donc essayé de stocker cette valeur dans un customproperties de ma
worksheets(1), et ma variable "zaza" récupère bien la valeur dans
customproperties.item(1) lors de la procédure wrkbook_open (je le teste à
l'aide d'un msgbox immédiatement ds wrkbk_open).
Mais si j'execute un msgbox zaza une fois que mon classeur est ouvert il
m'affiche 0 pour zaza
est-ce du à une mauvaise manip de ma part ou alors la réinitialisation de
toutes les variables du classeur a lieu après wrkbk_open ?

Autre question pratique d'utilisation du forum:
Dans le cas où notre question ait déjà été posée par un autre utilisateur
d'exel, existe-t-il un moyen de parcourir les post existant sur le forum
(la
liste est longue :p) pour la retrouver et éviter les doublons, notamment
lorqu'on utilise ie ?
Merci de l'attention que vous accordez à nos petites préoccupations... :)
Céline


Avatar
nol
bonsoir
pour cette partie de tes questions
tu peux utiliser les recherches sur google
:http://groups.google.com/group/microsoft.public.fr.excel
pour l'autre partie je laisse le soin aux pros qui on d'ailleur fort bien
répondu!

"Céline" a écrit dans le message de
news:
bonjour à tous,

Autre question pratique d'utilisation du forum:

Dans le cas où notre question ait déjà été posée par un autre utilisateur
d'exel, existe-t-il un moyen de parcourir les post existant sur le forum
(la

liste est longue :p) pour la retrouver et éviter les doublons, notamment
lorqu'on utilise ie ?
Merci de l'attention que vous accordez à nos petites préoccupations... :)
Céline



Avatar
Céline
bonjour,
pour te répondre, gérard, je voulais stocker cette variable "derrière" le
classeur, cad en non-visible par l'utilisateur, mais aussi eviter de stocker
dans une cellule qui pourrait un jour être utilisée (bon, je puorrais
utiliser la case ZZ300 mais c'est moins propre...)

pour en revenir à mon pb initial :
"J'ai donc essayé de stocker cette valeur dans un customproperties de ma
worksheets(1), et ma variable "zaza" récupère bien la valeur dans
customproperties.item(1) lors de la procédure wrkbook_open (je le teste à
l'aide d'un msgbox immédiatement ds wrkbk_open).
Mais si j'execute un msgbox zaza une fois que mon classeur est ouvert il
m'affiche 0 pour zaza"... etc
J'ai bien remplacé mes custompropertyitem par un MaVar, merci michdenis...

Mais voila le pb qui se pose tjs :
Lors dela création d'un .xls à partir d'un .xlt, j'ai une procédure ds
workbook open qui initialise MaVar à 1; puis cette ligne de code est
effacée(merci twinley et tous les autres sur excelabo.net); et l'execution
continue sur wrkbkk_open avec une variable "zaza" qui récupère MaVar
(effectué correctement car testé immédiatement avec un msgbox). or après
wrkbk_open "zaza" revient à 0, je ne sais pas pourquoi. Quelqu'un sait ?
(evidemment, je n'ai plus à passer par "zaza" vu que j'ai MaVar, mais je
cherche néanmoins à connaitre l'explication de ce pb... Par contre, après
fermeture et réouverture de ce .xls, comme il n'y plus la procédure
d'intialisation et d'effacement dans wrkbk_open, le phénomène n'a plus lieu)
voici mes procédures :

Private Sub Workbook_Open()
If Sheets.Count < 2 Then ActiveWorkbook.Sheets.Add
Feuil1.Visible = xlSheetVeryHidden
Worksheets(2).Activate
Range("C4").Select
If Range("D14").FormulaR1C1 = "" Then Range("D14").Comment.Visible = True

Worksheets(1).CustomProperties.Item(1).Value = 1
Effacer_Lignes ("salut")

EtaT_Etude = MaVar
MsgBox MaVar
MsgBox EtaT_Etude
End Sub

Sub Effacer_Lignes(tagada As String)
deb_li =
ActiveWorkbook.VBProject.VBComponents_("ThisWorkbook").CodeModule.ProcStartLine("Workbook_Open", 0)
With ActiveWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule
.DeleteLines deb_li + 7, 2
.CodePane.Window.Close
End With
End Sub

Ma sub effacer_ligne efface bien les lignes :
Worksheets(1).CustomProperties.Item(1).Value = 1
Effacer_Lignes ("salut")
de wrkbkk_open
1 2