Sauvegarder les valeurs d'un formulaire en vba
Aujourd'hui, je vous propose une série de fonctions très utiles pour sauvegarder un formulaire : ainsi, la prochaine fois que vous l'ouvrirez, vous retrouverez toutes vos valeurs, sans devoir les retaper.
Pour se faire, les valeurs des textbox, combobox et optionbuttons sont écrites dans un fichier ini stocké dans le répertoire temporaire :
C:\Documents and Settings\<<NOM UTILISATEUR>>\Local Settings\Temp
Ce fichier ini se présentera sous la forme suivante :
[NomDuFormulaire]
optionbutton1=Vrai
textbox1=Valeur de la textbox1
combobox1=Valeur de la combobox1
etc.
Si dans votre programme, vous avez plusieurs formulaires, le fichier ini rajoutera à la suite les autres formulaires sauvegardés :
[NomDuFormulaire_1]
optionbutton1=Vrai
textbox1=Valeur de la textbox1
combobox1=Valeur de la combobox1
[NomDuFormulaire_2]
optionbutton1=Vrai
textbox1=Valeur de la textbox1
combobox1=Valeur de la combobox1
etc.
Je n'ai pas implémenté la sauvegarde des listbox, mais elle se fait de la même manière que les autres contrôles.
Voici donc les fonctions, qui sont à copier dans un module à part, par exemple FichierIni.
La constante NomFichierIni à la 3e ligne indique le nom du fichier ini à sauvegarder. Je vous conseille d'y mettre le nom de votre application, vous le retrouverez plus facilement dans le répertoire temp si par hasard vous deviez intervenir dedans (le fichier ini est éditable avec le bloc note de Windows).
Option Explicit
'Nom du fichier ini à écrire :
'---------------------------------
Const NomFichierIni = "Nom_du_fichier.ini"
'---------------------------------
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long
Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Function EcrireFichierIni(Entete As String, Cle As String, Valeur As String)
WritePrivateProfileString Entete, Cle, Valeur, RepTemp & NomFichierIni
End Function
Function LireFichierIni(Entete As String, Cle As String) As String
Dim Ret As String, NC As Long
Ret = String(255, 0)
NC = GetPrivateProfileString(Entete, Cle, "Default", Ret, 255, RepTemp & NomFichierIni)
If NC <> 0 Then Ret = Left$(Ret, NC)
LireFichierIni = Ret
On Error GoTo 0
Exit Function
LireFichierIni_Error:
MsgBox "Error " & Err.Number & " (" & Err.Description & ") dans la procédure LireFichierIni du Module FichierIni"
End Function
'Repertoire temporaire sous Local Settings :
Private Function RepTemp() As String
Dim Buf As String * 128
Dim Value As Integer
Value = GetTempPath(128, Buf)
RepTemp = Left(Buf, Value)
End Function
'Function SauverFormulaire(formulaire As UserForm) As Boolean
Function SauverFormulaire(formulaire As UserForm, NomForm As String) As Boolean
Dim ctrl As Control
'Mise en mémoire de chaque valeurs du formulaire
For Each ctrl In formulaire.Controls
If TypeOf ctrl Is TextBox Or TypeOf ctrl Is ComboBox Or TypeOf ctrl Is OptionButton Then
EcrireFichierIni NomForm, ctrl.Name, ctrl.Value
End If
Next ctrl
End Function
Function InitialiserFormulaire(formulaire As UserForm, NomForm As String) As Boolean
Dim ctrl As Control
Dim Valeur As String
'Mise en mémoire de chaque valeurs du formulaire
For Each ctrl In formulaire.Controls
If TypeOf ctrl Is TextBox Or TypeOf ctrl Is ComboBox Or TypeOf ctrl Is OptionButton Then
Valeur = LireFichierIni(NomForm, ctrl.Name)
If Valeur <> "Default" Then
If Valeur = "Vrai" Then
ctrl.Value = True
ElseIf Valeur = "Faux" Then
ctrl.Value = False
Else
ctrl.Value = Valeur
End If
Else
Exit Function
End If
End If
Next ctrl
End Function
L'utilisation de ces fonctions est très simple :
Pour charger dans un formulaire les valeurs sauvegardées, il faut rajouter telle quelle dans la procédure d'initialisation du formulaire cette ligne :
Private Sub UserForm_Initialize()
InitialiserFormulaire Me, Me.Name
End Sub
Pour sauvegarder les valeurs du formulaire, il faut rajouter cette ligne dans la procédure de fermeture du formulaire :
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
SauverFormulaire Me, Me.Name
End Sub
Ces fonctions sont utilisables pour n'importe quel type d'application utilisant le vba : Excel, Word, AutoCAD etc.