MS ACCESS et persistance

Nous sommes conscient que la séparation des données de l’ihm est primordiale pour une application MS ACCESS. L’attachement automatique est depuis de nombreuses années rentré dans les mœurs, chaque développeur utilise le sien.

Si au moment de l’installation, il est obligatoire de spécifier le chemin du fichier de données, lors des mises à jour de l’application cela peut agacer l’utilisateur. Surtout si elles sont régulières. On se doit alors d’utiliser la persistance pour sauvegarder ces paramètres.

Comment créer de la persistance pour les paramètres d’une application ?

En fait il n’y a pas une, mais plusieurs méthodes pour stocker ses valeurs de configuration. La première utilise les fichiers ini. Ce sont des fichiers texte qui ont une structure particulière dont voici un exemple :

[Etiquette1]

paramètre1=Valeur

paramètre2=Valeur

[Etiquette2]

paramètre1=Valeur

Lire et écrire dans un fichier ini

Lire et écrire dans ce type de fichier ne constitue pas une grosse difficulté puisque Windows possède ces 2 fonctions dans l’API Kernel32.

Je vous livre ici ces 2 fonctions implémentées en VBA qui permettent de gérer un fichier ini dans le répertoire de l’application. 

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

Const vgInifile = "monapplication.ini"

Function pIniLireParametre(vlEntete As String, vlNomParametre As String) As String

'---------------------------------------------------------------------------------------
' Procedure    : pIniLireParametre
' Description  : renvoi un paramètre depuis un fichier ini spécifié par vgIniFile
' Parameters   : vlNomParametre est le nom du paramètre à renvoyer
' Return       : le paramètre correspondant à vlNomParametre
'---------------------------------------------------------------------------------------
'
On Error GoTo Errsub
Dim vParam As String, vlLong As Long
vParam = String(255, 0)

vlLong = GetPrivateProfileString(vlEntete, vlNomParametre, "", vParam, 255, CurrentProject.Path & "\" & vgInifile)

If vlLong <> 0 Then vParam = Left$(vParam, vlLong)
pIniLireParametre = RTrim(vParam)

Exit Function

Errsub:
pIniLireParametre = ""

End Function
Function pIniEcrireParametre(vlEntete As String, vlNomParametre As String, vlValeurParametre As String) As Boolean

'---------------------------------------------------------------------------------------
' Procedure    : pIniEcrireParametre
' Description  : remplace le paramètre dans un fichier ini spécifié
' Parameters   : vlEntete est l'entête de la rubrique []
'                vlNomParametre est le nom du paramètre
'                vlValeurParametre est la valeur du paramètre
' Return       : N/A
'---------------------------------------------------------------------------------------
'
On Error GoTo Errsub
pIniEcrireParametre = True

WritePrivateProfileString vlEntete, vlNomParametre, vlValeurParametre, CurrentProject.Path & "\" & vgInifile
Exit Function

Errsub:
pIniEcrireParametre = False

End Function

Mise en œuvre de la persistance

Admettons un fichier Ini comportant plusieurs paramètres dont celui indiquant le répertoire du fichier de données.

[Donnees]
CheminData=C:\Users\fabrice\ApplicationData\data.accdb

La lecture se fera via l’instruction suivante :

vFichierData = pIniLireParametre("Donnees", "CheminData")

Il sera alors très simple de vérifier le chemin fourni et celui des tables attachées.

Pour écrire le paramètre on utilise cette instruction lors de la première installation :

pIniEcrireParametre "Donnees", "CheminData", "c:\Users\fabrice\ApplicationData\data.accdb"

Conclusion

En quelques commandes vous avez donné de la persistance à votre application et apporter un sérieux gain de confort à l’utilisateur.

 

Sélectionner un valeur connue dans une liste

Autant la sélection automatique d’un item dans une liste modifiable est facile grâce à une simple affectation, autant avec une liste classique c’est plus compliqué.

Je vous livre l’astuce consistant à mettre un peu de code dans une liste déroulante reprenant les valeurs de la liste.

Dans l’événement Après MAJ de la liste déroulante ou d’une zone de texte mettre le code VBA ci-dessous :

Dim i As Long
Dim i_save As Long
 
Me.lstMultiple.Selected(0) = True     'désélection de la liste multiple
 
For i = 1 To Me.lstMultiple.ListCount - 1  'parcours la liste multiple
    Me.lstMultiple.Selected(i) = False       
        'déselection de l'élement courant
    If (Me.lstMultiple.ItemData(i) = CStr(Nz(Me.lstRecherche, ""))) Then
       's'il est identique à ce que je cherche
       i_save = i  'je repère la ligne
    End If
Next
Me.lstMultiple.Selected(i_save) = True  
'en sortant je sélectionne la liste

lstMultiple est la liste classique et lstRecherche est la liste modifiable ou la zone de texte ou vous sélectionnez la valeur à trouver.

L’astuce consiste à parcourir la liste à la recherche de la valeur, d’en capter l’indice de la ligne pour l’affecter à cette même liste.

à bientôt pour une nouvelle astuce.

Astuce : Connaitre l’équivalent VBA d’une propriété.

Je vous livre une petite astuce simple pour connaître l’équivalent d’une propriété d’un formulaire ou d’un état en VBA :

En mode création, placez-vous que la propriété voulue, puis pressez la touche F1.

Vous aurez l’équivalent VBA de la propriété, son utilité et souvent un exemple d’utilisation VBA.

Bonne utilisation !

MS ACCESS : Afficher/Cacher le ruban à la demande

Cette fois-ci je vous livre l’une de mes astuces que j’utilise systématiquement dans toutes mes applications : Afficher/Cacher le ruban à la demande.

La méthode est simple, une variable globale permet de fixer l’état du ruban. Un raccourci dans une macro Autokey permet de changer l’état du ruban et une fonction VBA affiche ou cache le ruban suivant l’état de la variable.

Option Compare Database
Option Explicit
Dim StateRibbon As Boolean

Function DisplayRibbon()
' Auteur : Fabrice CONSTANS (MVP)
' Description : Affiche/cache le ruban
' ctrl+shift+R

Nz StateRibbon, False  ' 1er passage initialise à faux
' (ribbon invisible)

DoCmd.ShowToolbar "Ribbon", IIf(StateRibbon, acToolbarNo, acToolbarYes)

StateRibbon = Not StateRibbon  ' inverse la valeur

End Function

Le raccourci :

+^{R}  ExecuterCode DisplayRibbon()

Cacher le ruban permet de cacher également les boutons Restaurer/ Fermer ce qui donne une touche professionnelle à l’application.

MSACCESS : Déselection zone de liste

Lorsque vous utilisez une zone de liste sans sélection multiple, il peut arriver d’avoir besoin de désélectionner la ligne. Inutile de vous acharner sur la ligne sélectionnée avec votre souris, elle restera en surbrillance.

Je vous livre ici ma méthode pour enlever la sélection :

Dim itSel As Integer

Private Sub Form_Open(Cancel As Integer)
'initialise à -1 pour ne pas perturber la première sélection
itSel = -1 
End Sub

Private Sub Liste_Click()
'la selection est identique à la précédent
If Me.Liste.ListIndex = itSel Then
   Me.Liste.ListIndex = -1  'on déselectionne
   itSel = -1
Else
   'on fixe le choix pour la prochaine comparaison
   itSel = Me.Liste.ListIndex
End If

End Sub

La liste se nomme Liste. On déclare une variable globale au  formulaire, que l’on nomme itSel, elle permettra de conserver le précédent choix opéré, soit un entier positif pour une sélection et -1 pour la désélection.

Sur l’ouverture du formulaire on considère que rien n’est sélectionné et on attribue la valeur -1 à itSel. Lorsqu’on clique sur la zone de liste, on vérifie si le clic correspond à la sélection en cours au moyen de la propriété ListIndex.

Cette propriété retourne un entier de 0 à x ou x est le dernier item de la liste. Lorsque qu’on attribue une valeur à ListIndex l’item correspond est sélectionné, par contre si l’on met -1 aucune ligne n’est sélectionnée.

Simple et efficace.

Epingler une application ACCESS sous Windows 7 et supérieur

Epinglez une application Microsoft ACCESS dans la barre de Windows 7 ou 8 et vous constaterez qu’au démarrage c’est Microsoft ACCESS qui se lance… mais pas l’application.

Pour réussir ce tour de force, commencez par créer un simple raccourci vers votre application.

  • Clic-droit sur l’icône de l’application, Créer un raccourci.
  • Faites un clic-droit/propriété/onglet Raccourci
  • Dans la zone Cible rajoutez le chemin et le nom du programme de lancement, en l’occurrence MSACCESS.EXE, avant le chemin et le nom du fichier de votre application.

Suivant la version du système, 32 ou 64 bits et d’office, 32 ou 64 bits, l’emplacement sera différent. Si vous avez des difficulté utilisez la recherche de programme.

Par exemple pour un Windows 64bits et un Office 32 bits, cas le plus fréquent actuellement, vous trouverez ce fichier dans :

C:\Program Files (x86)\Microsoft Office\Office1x\

x correspondant à la version de votre Office, 12 pour 2007, 14 pour 2010, 15 pour 2013 ainsi de suite.

N’oubliez pas les guillemets séparant les 2.

Vous devrez obtenir ceci dans la zone Cible :

"C:\Program Files (x86)\Microsoft Office\Office14\MSACCESS.EXE" "X:\chemin vers mon application\application.accdb"

Le plus compliqué est fait, vous n’avez plus qu’à redémarrer votre application via ce raccourci et l’épingler.

Ce billet s’applique à une application Microsoft ACCESS mais également aux autres applications en général.

Cordialement,