OVH Cloud OVH Cloud

Variable qui rest mémorisée

7 réponses
Avatar
Michael
Bonjour à tous !

Petit probleme de newbie (je pense), en VBA, je déclare une variable public
de type integer
mais une fois que j'ai fermé (et enregistré) mon classeur et que je le
rouvre, ma variable = "" .

Existe-t-il une solution sans avoir a aller ecrire cette variable dans une
cellule de feuille cachée par exemple ?

Merci d'avance pour la moindre info.
Salutations.

7 réponses

Avatar
anonymousA
bonjour,

3 solutions possibles me viennent à l'idée, 2 simples et une plus
compliquée

1- ecrire la variable comme un nom dans les noms de classeurs et en
changer la valeur avant chaque fermeture du classeur.tu peux d'ailleurs
cacher ce nom pour eviter qu'un utilisateur ne te l'écrase.

2-L'inscrire dans une cellule d'une feuille cachée

3-l'inscrire en dur dans un module ( c.à. d comme une instruction du
style MaVar=3 ) puis la mettre à jour régulièrement dans le texte du
VBA

A+
Avatar
Michael
Merci du coup de main

Jai envie d'opter pour la 3eme solution qui me semble plus "propre".
Mais j'ai un peu de mal a saisir...
exemple

public MaVar as integer

sub des_trucs
la il y a des_trucs
MaVar = chose
End Sub

Je ferme mon classeur, le rouvre et là MaVar= ""

Quel instruction me permetrait de l'inscrire definitivement ?
Si c'est trop compliqué je me rabatterait sur les solutions 1 ou 2...

Merci bien !
Avatar
Michel Pierron
Bonjour Michael;
Regarde l'aide pour SaveSetting et GetSetting.
MP

"Michael" a écrit dans le message de news:


Bonjour à tous !

Petit probleme de newbie (je pense), en VBA, je déclare une variable
public

de type integer
mais une fois que j'ai fermé (et enregistré) mon classeur et que je le
rouvre, ma variable = "" .

Existe-t-il une solution sans avoir a aller ecrire cette variable dans une
cellule de feuille cachée par exemple ?

Merci d'avance pour la moindre info.
Salutations.





Avatar
Michael
Solution interessante Michel je ne connaissais pas mais bien qu'elle
pourrait parfaitement
fonctionner, j'aimerai autant opter pour une methode qui reste propre a
Excel et qui n'en deborde pas.

Merci quand meme pour l'info !
Avatar
Michel Pierron
Re Michael;
Tu peux également utiliser un nom masqué; en supposant que ta variable soit
intitulée MyVar:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next
With ThisWorkbook
.Names("SaveMyVar").Delete
.Names.Add Name:="SaveMyVar", RefersToR1C1:=MyVar, Visible:úlse
.Save
End With
End Sub

Private Sub Workbook_Open()
On Error Resume Next
MyVar = ThisWorkbook.Names("SaveMyVar").RefersTo
If Err Then MyVar = 1 ' Ta valeur par défaut
End Sub

MP

"Michael" a écrit dans le message de news:


Bonjour à tous !

Petit probleme de newbie (je pense), en VBA, je déclare une variable
public

de type integer
mais une fois que j'ai fermé (et enregistré) mon classeur et que je le
rouvre, ma variable = "" .

Existe-t-il une solution sans avoir a aller ecrire cette variable dans une
cellule de feuille cachée par exemple ?

Merci d'avance pour la moindre info.
Salutations.





Avatar
anonymousA
Bon allons y pour la solution plus compliquée.

Dans le module Thisworkbook , tu inscris

Private Sub Workbook_BeforeClose(Cancel As Boolean)

sauve
ThisWorkbook.Saved = True

End Sub
Private Sub Workbook_Open()

MaVar =
Split(ThisWorkbook.VBProject.VBComponents("toto").CodeModule.Lines(2,
1), "=")(1)
MsgBox MaVar

End Sub

Dans un module standard, tu écris

Public MaVar

Sub tututu()

MaVar = 12

End Sub

Sub sauve()

MsgBox MaVar
With ThisWorkbook.VBProject.VBComponents
.Remove .Item("toto")
texte = "Sub sauvegarde" & vbLf
texte = texte & "tampon=" & MaVar & vbLf
texte = texte & "End sub"

Set cd = .Add(vbext_ct_StdModule)
cd.Name = "toto"
.Item("toto").CodeModule.InsertLines 1, texte
End With
Application.DisplayAlerts = False
ThisWorkbook.SaveAs ThisWorkbook.FullName
Application.DisplayAlerts = True

End Sub

Tu crées un module (ici , il s'appelle toto) et tu écris une 1ere
fois

Sub sauvegarde()
tampon = 10
End Sub

Au final, cet exemple est fait pour te permettre de voir que si tu
exécutes la procédure Sub tututu() alors MaVar vaudra 12. En
conséquence, à la fermeture du fichier cette variable sera conservée
dans la procédure Sub sauvegarde dans la ligne de texte tampon car
on affecte dans la procédure sub sauve() tampon=MaVar.La procédure
Sub sauvegarde est créée par programmation dans un module qu'on
dénomme toto après avoir supprimé l'ancien module qui portait le
même nom.

Quand tu rouvriras ton fichier , j'ai laissé des Msgbox au moment de
la fermeture et de l'ouverture pour te permettre de voir que le MaVar
de l'ouverture correspond au MaVar de la fermeture précédente.
Par ailleurs, dans la procédure Workbook_BeforeClose, on fait appel à
la procédure Sauve pour déclencher tout. Le fait de mettre dans
Workbook_BeforeClose un appel à une autre procédure n'est pas neutre
car selon les configurations d'antivirus, le fait de mettre des
créations ou de suppressions de module dans les procédures
evenementielles de classeur peut être perçu comme une atteinte
virale. On ruse donc pour tromper l'anitivirus.

Bon, amuses toi bien même si l'affaire peut être encore améliorée
et evidemment adaptée à la situation que tu rencontres..

A+
Avatar
Michael
En effet tout ceci n'est pas très simple !
Mais bon je relève le défi de comprendre (Merci au passage pour toutes les
explications)
puis de l'appliquer dans mon cas.
En tout cas merci beaucoup car vous avez du bien vous amuser pour me pondre
tout ça !
Ceci étant, encore mille mercis, je vous tiens au courant.
Bon week-end