OVH Cloud OVH Cloud

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

6 réponses

1 2
Avatar
Céline
DSLL !!!! Erreur copie (ct une ancienne version avec mon customproperty)
il fallait lire :

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

MaVar = 1
Effacer_Lignes ("salut")

EtaT_Etude = MaVar
MsgBox MaVar
MsgBox EtaT_Etude
End Sub

L'execution à nouveau de :
MsgBox MaVar
MsgBox EtaT_Etude
après wrkbk_open m'affiche respectivement 1 puis 0 !!?!!
Avatar
michdenis
Pourquoi n'utilise pas ceci pour l'ouverture de ton
modèle ....dans le thisworkbook :

'------------------------------------
Private Sub Workbook_Open()

If ThisWorkbook.Path = "" Then
'Seulement les trucs qui doivent être
'réalisé une fois à la création du classeur
'à partir du modèle
'EXEMPLE : si tu veux initialer la variable MaVar
'à partir des procédures données...
MaVar = 1
'Si tu as besoin d'initialer la variable avec la même valeur
'à chaque ouverture, pourquoi ne pas utiliser une CONSTANTE ?

Else
'les trucs à réaliser à chaque ouverture du classeur.

End

End Sub
'----------------------------

Les "custompropertyitem" sont accessibles par l'item propriété du fichier
du menu contextuel dans l'explorateur Windows d'où la possibilité
que la ou les valeurs soient modifiées par un tiers...cette façon de
faire comporte un certain risque quant à sa sécurité.

Si la variable est déclarée comme Public dans un module Standard
Public MaVariable as Integer
Et que tu l'initialises dans ta procédure Workbook_Open, il n'y a
aucune raison pour que cette variable perde sa valeur !






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

DSLL !!!! Erreur copie (ct une ancienne version avec mon customproperty)
il fallait lire :

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

MaVar = 1
Effacer_Lignes ("salut")

EtaT_Etude = MaVar
MsgBox MaVar
MsgBox EtaT_Etude
End Sub

L'execution à nouveau de :
MsgBox MaVar
MsgBox EtaT_Etude
après wrkbk_open m'affiche respectivement 1 puis 0 !!?!!
Avatar
michel
Bonjour
MaVar vaut toujours 1 mais ta variable etat_Etude elle est locale donc
remise a zero a la fin de la proc workbok_open
Si tu veux la garder ajoute Dim Etat_Etude dans la partie declarations de
ton module
HTH
--
Michel
"Céline" a écrit dans le message de news:

DSLL !!!! Erreur copie (ct une ancienne version avec mon customproperty)
il fallait lire :

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

MaVar = 1
Effacer_Lignes ("salut")

EtaT_Etude = MaVar
MsgBox MaVar
MsgBox EtaT_Etude
End Sub

L'execution à nouveau de :
MsgBox MaVar
MsgBox EtaT_Etude
après wrkbk_open m'affiche respectivement 1 puis 0 !!?!!


Avatar
Céline
Bonsoir,
Merci à vous pour vos éclaicissemments :
- à nol pour le lien vers googleNewsGroup !!! (beaucoup plus clair
via ggl à mon avis personnel que depuis microsoft)
- à MichDenis pour tous ses conseils mais aussi ses explications sur
les divergences (entre .name et propertyitem)
- à MichDenis et Michel pour leur remarque pertinente : j'avais pas
fait les bonnes déclarations concernant MaVar et Etat_Etude!!!
Ca me permet de bien avancer ....
Avatar
michdenis
| ces modules de classe sont assez bluffant ! c'est le POO !
| tu connais un site qui explique ou qui parle de çà ?
| à mon boulot les zinformatichiens n'ont pas installer l'aide (vba)

POO -> c'est quoi ça ?

les zinformatichiens n'ont pas installer l'aide (vba)
Pas brillants!!! ...Les responsables de réseaux ne sont pas
forcément des "informatiens"

en général, les livres sur excel effleurent le sujet en insérant un chapitre sur le sujet...C'est
le cas pour les 2 livres suggérés...c'est cher payé pour le peu d'information.... mais si tu
y tiens ! (évidemment il y en a d'autres...)

'------------------------
Excel 2003 VBA Programmer's Reference
By
Paul Kimmel,Stephen Bullen,John Green,Rob Bovey,Robert Rosenberg
'------------------------
et
'------------------------
Professional Excel Development: The Definitive Guide to Developing Applications Using Microsoft
Excel and VBA
By
Stephen Bullen, Rob Bovey, John Green
'------------------------
Avatar
Alfred Wallace

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










ces modules de classe sont assez bluffant ! c'est le POO !

tu connais un site qui explique ou qui parle de çà ?
à mon boulot les zinformatichiens n'ont pas installer l'aide (vba)

Merci

José



1 2