formateur informatique

Archiver les données en Visual Basic Access

Accueil  >  Bureautique  >  Access  >  Access VBA  >  Archiver les données en Visual Basic Access
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
Sujets que vous pourriez aussi aimer :


Archiver les données en Visual Basic Access

Formulaire Access pour parcourir les fichiers et les archiver dans une table

Dans cette formation, nous allons apprendre à ajouter des données externes dans une table Access existante. Nous récupérons la liste des fichiers contenus dans un dossier, grâce au programme que nous avons conçu dans la formation VBA Access pour accéder aux fichiers. Un nouveau bouton Archiver est à ce titre proposé sur le formulaire Access. Il s'agit non seulement de récupérer les informations attachées aux fichiers pour les inscrire dans les champs de table correspondants. Mais il s'agit aussi de réaliser une copie locale de ces fichiers, pour archive. Nous commençons le travail à partir de la visionneuse que nous avions conçue dans la précédente formation, pour accéder aux fichiers d'un dossier. Contenu dossier à parcourir et récupérer par code VBA Access

Il en résulte un dossier nommé Contenu. Ce dernier propose des fichiers de type image et texte. Lorsque le fichier texte porte le même nom que le fichier image, il s'agit du descriptif de la photo. Notre programme devra donc archiver en base de données, le chemin de la photo dans un champ et son descriptif dans un autre, pour un même enregistrement.
  • Cliquer avec le bouton droit sur la table archive depuis le volet des objets Access,
  • Dans le menu contextuel, choisir Mode création,
Cette table est dotée d'une clé primaire pour ne pas risquer les doublons. Elle propose des champs dont archive_image et archive_texte pour stocker les informations relatives aux fichiers. Ces champs ont été typés et dimensionnés comme nous avions appris à le faire au travers de la formation Access pour créer sa première base de données.
Champs de table Access pour archiver données de fichiers externes en VBA

Contrôler les objets de formulaire par le code VBA
  • Fermer la table archive en cliquant sur la croix de son onglet,
  • Double cliquer sur le formulaire acces_fichier pour l'exécuter,
  • Cliquer sur le bouton Parcourir en bas à gauche du formulaire,
  • Dans la boîte de dialogue qui suit, sélectionner le dossier Contenu décompressé,
  • Puis, cliquer sur Ok pour déclencher le code de récupération des fichiers,
Formulaire Access pour parcourir fichiers de dossiers en VBA

La zone de liste sur la droite du formulaire se charge de tous les noms de fichiers contenus dans le dossier désigné. Si vous sélectionnez l'un de ces fichiers dans la liste, son contenu s'affiche au centre du formulaire, tantôt sous forme d'image, tantôt sous forme de texte, selon la nature du fichier. Il s'agit du programme que nous avions précédemment conçu et qui fonctionne parfaitement.

Vous notez la présence d'un nouveau bouton Archiver en bas du formulaire. Ce dernier est grisé car sa propriété Activé a été réglée sur Non. Il ne peut donc être cliqué. Il doit être rendu disponible par le code, si un contenu a préalablement été récupéré par le biais du bouton Parcourir. La condition consiste donc à vérifier que la zone de liste propose bien des fichiers à archiver.
  • Cliquer sur la flèche du bouton Affichage en haut à gauche du ruban Création,
  • Dans la liste, choisir Mode création,
  • Si elle n'est pas visible, cliquer sur le bouton Feuille de propriétés dans le ruban Création,
  • Sélectionner le bouton Parcourir et activer l'onglet Evénement de sa feuille de propriétés,
Vous notez qu'une procédure événementielle de code Visual Basic est déjà attachée à l'événement Au clic de ce bouton. C'est la raison pour laquelle nous avons pu désigner un dossier et charger son contenu.
  • Cliquer sur le petit bouton à l'extrémité droite de la ligne Au clic,
Nous basculons ainsi dans l'éditeur de code entre les bornes de la procédure événementielle parcourir_Click. Le code situé entre ces bornes se déclenche au clic sur le bouton Parcourir. Nous devons apporter plusieurs améliorations. Tout d'abord, avant de charger la zone de liste, nous devons commencer par la purger de son potentiel contenu. En effet à ce stade, si vous cliquez plusieurs fois de suite sur le bouton Parcourir, les nouveaux fichiers s'empilent sur les précédents. Puis, nous devons ajouter un compteur capable de comptabiliser les fichiers trouvés et ajoutés. C'est ce compteur qui déterminera à l'issue, si le bouton Archiver doit être activé ou au contraire désactivé.
  • Dans la partie déclarative, juste après : Dim dossier, chaque_fichier, ajouter la déclaration suivante :
dim compteur as integer

Nous partons du principe que le dossier peut contenir plus de 255 fichiers. C'est la raison pour laquelle nous avons choisi de typer la variable comme un Integer. Avec un Byte, nous n'aurions pas pu excéder ce nombre.
  • Après l'affectation boite_dialogue.Title =..., ajouter l'initialisation suivante :
compteur= 0

Maintenant que la variable est initialisée et affectée, nous allons pouvoir l'incrémenter.
  • Dans la boucle For Each, après l'instruction liste_fichiers.AddItem..., ajouter la ligne de code suivante :
compteur = compteur + 1

Si un fichier est trouvé dans le dossier, la variable compteur est incrémentée. Ainsi nous saurons que du contenu à archiver a été récupéré. En conséquence, le bouton Archiver devra être activé. Il suffit de réaliser ce test en fin de code, à l'aide d'une instruction conditionnelle if en VBA.
  • Après la boucle et avant le End If, ajouter le test sur la variable compteur :
If(compteur > 0) Then archiver.Enabled = True

Il s'agit de tester ce code.
  • Enregistrer les modifications (CTRL + S),
  • Basculer sur le formulaire (ALT + F11) et l'exécuter (F5),
  • Cliquer sur le bouton Parcourir, désigner le dossier contenu et valider,
Lecture de fichiers et activation de contrôles en VBA Access

Un contenu est chargé dans la liste et, grâce au test sur la variable compteur, le bouton Archiver devient disponible (enabled=true), comme l'illustre la capture ci-dessus. Cependant, rien n'empêche encore de cumuler plusieurs contenus successifs dans la zone de liste. Pour pallier ce défaut, avant qu'un nouveau contenu ne soit chargé, nous devons purger ce contrôle grâce à sa méthode RemoveItem. Cette méthode permet de supprimer un élément de la liste en le désignant par son index. Il faut donc parcourir chaque élément grâce à une boucle.
  • Basculer dans l'éditeur de code (ALT + F11),
  • Dans la partie déclarative, ajouter la déclaration suivante : Dim i As Integer,
  • Après l'initialisation de la variable : compteur=0, ajouter la boucle de traitement suivante :
For i = liste_fichiers.ListCount - 1 To 0 Step -1
liste_fichiers.RemoveItem (i)
Next i


Nous passons en revue tous les éléments de la zone de liste grâce à une boucle For. Mais nous partons du dernier élément pour remonter jusqu'au premier, grâce à un pas négatif (Step -1). En effet, à chaque passage, nous supprimons l'un des éléments. Donc le nombre contenu renvoyé par la propriété ListCount diminue à chaque fois. Cette astuce permet donc d'éviter l'erreur qui consisterait à essayer de supprimer un élément sur un index qui n'existe plus. La formation VBA Excel sur les boucles For nous avait appris à utiliser ces pas de décrémentation . Ensuite, la méthode RemoveItem du ListBox permet de supprimer l'élément désigné par l'indice qui lui est passé en paramètre.
  • Enregistrer les modifications et basculer sur le formulaire,
  • Cliquer sur le bouton Parcourir et désigner le dossier Contenu,
  • Réitérer cette dernière opération au moins une fois,
Comme vous le constatez, désormais le contenu ne s'empile plus dans la zone de liste puisque cette dernière est purgée avant d'être rechargée.

Accès aux fichiers et aux données de bases Access
Il s'agit maintenant de développer le code associé au bouton Archiver. Il doit copier les images dans un dossier local, enregistrer les éléments dans la table archive en récupérant les informations des fichiers parcourus dans le dossier.
  • Afficher le formulaire en mode création et sélectionner le bouton Archiver,
  • Cliquer sur le bouton de son événement Au Clic depuis sa feuille de propriétés,
  • Choisir Générateur de code et valider,
Nous basculons de nouveau dans l'éditeur de code, mais entre les bornes de la procédure archiver_Click, cette fois. Pour ajouter des enregistrements dans une table Access, le code a besoin d'accéder aux données. Et comme nous l'a appris la formation VBA Access sur la connexion aux données, nous devons ajouter la librairie nécessaire pour piloter les objets de connexion indispensables.
  • Cliquer sur le menu Outils en haut de l'éditeur de code,
  • Dans la liste, choisir Références,
  • Cocher la case du composant Microsoft ActiveX Data Objects 6.1 Library et valider,
Pour copier les images dans un dossier local, celui-ci doit être prévu à la racine de l'application.
  • Dans le répertoire de la base de données, créer un dossier archives,
Dossier local pour archiver données par code Visual Basic Access

Comme toujours, nous devons commencer par déclarer les variables dont nous aurons besoin. La formation VBA Excel sur la déclaration de variables, nous avait enseigné les rudiments.
  • Dans les bornes de la procédure archiver_Click, ajouter les déclarations suivantes :
Dim ligne As Recordset: Dim base As Database
Dim nom_fichier As String: Dim objet_fichier As Object
Dim dossier: Dim chaque_fichier
Dim compteur As Integer
Dim extension As String: Dim fichier_detail As String: Dim detail_contenu As String


Les variables ligne et base sont déclarées comme des objets de base de données grâce au composant ActiveX Data Object, ajouté en référence précédemment. Ils serviront à la connexion aux données de la base. La variable nom_fichier est déclarée comme un texte pour mémoriser le chemin d'accès complet au fichier désigné pendant le traitement. La variable objet_fichier est déclarée comme un objet. Elle permettra en effet d'instancier un objet ActiveX, grâce à la fonction VBA CreateObject, afin de piloter les dossiers et les fichiers dans l'arborescence. Les variables dossier et chaque_fichier ne sont pas typées, on parle de variant. Leur type sera défini au moment de l'affectation pour hériter des propriétés des objets sur lesquels on les initialise, en l'occurrence un dossier et des fichiers. La variable compteur permettra de passer en revue tous les fichiers grâce à une boucle l'incrémentant. Enfin, les dernières variables extension, fichier_detail et detail_contenu, permettront de stocker des informations précises sur les fichiers parcourus.

Comme toujours, avant tout traitement, nous devons commencer par initialiser les variables, notamment les variables objets. Pour ce faire :
  • Ajouter les affectations de variables suivantes, à la suite du code VBA :
Set base = Application.CurrentDb
Set ligne = base.OpenRecordset("archive", dbOpenDynaset)
Set objet_fichier = CreateObject("scripting.filesystemobject")
Set dossier = objet_fichier.getfolder(Application.CurrentProject.Path & "\archives")


Grâce à l'objet Application et à sa méthode CurrentDb, nous instancions un objet pour piloter la base de données en cours avec la variable base. Sa méthode OpenRecordSet permet alors d'instancier l'objet pour piloter les enregistrements de la table archive passée en premier argument. En second paramètre, nous utilisons la constante dbOpenDynaset, pour pouvoir modifier ces enregistrements, comme l'enseigne l'aide en ligne. Grâce à la fonction CreateObject avec le paramètre scripting.filesystemobject, nous instancions un objet ActiveX, dans la variable objet_fichier, afin de manipuler les fichiers et les dossiers, présents sur l'ordinateur. Sa méthode getfolder permet dès lors d'initialiser la variable dossier, sur le dossier à manipuler qui correspond au sous dossier archives du répertoire local de la base de données.

Nous devons maintenant réaliser deux actions de nettoyage. La première consiste à supprimer tous les anciens fichiers potentiels qui auraient pu être stockés dans le sous dossier archives. La seconde consiste à vider la table archive de tous ses enregistrements pour y inclure les nouveaux. Dans les deux cas, ce sont des boucles de traitements qui vont permettre de parcourir tous les éléments à supprimer. Et ces boucles sont désormais rendues possibles grâce aux objets que nous avons créés, d'une part pour désigner le dossier contenant les fichiers, et d'autre part pour désigner les enregistrements de la table archive.
  • A la suite du code, ajouter la boucle de suppression suivante :
For Each chaque_fichier In dossier.Files
chaque_fichier.Delete
Next chaque_fichier


La boucle For Each permet de parcourir tous les fichiers contenus dans le dossier. C'est la propriété Files de l'objet dossier qui renvoie la collection des fichiers qu'il contient. A chaque passage dans la boucle, pour chaque fichier donc, la méthode Delete permet de supprimer le fichier pointé.
  • Ajouter ensuite le traitement permettant de purger la table archive :
If ligne.RecordCount > 0 Then
ligne.MoveFirst

Do
ligne.Delete
ligne.MoveNext
Loop Until ligne.EOF

End If


La propriété RecordCount d'un objet RecordSet de base de données, retourne le nombre d'enregistrements contenus dans la table désignée, lors de l'instanciation. Il faut que ce nombre soit positif sinon il n'est pas nécessaire de vider cette table. C'est l'instruction If, que nous avions apprise dans la formation VBA Excel pour gérer les conditions, qui permet de vérifier ce critère. La méthode MoveFirst de l'objet RecordSet permet alors de placer le pointeur sur le premier enregistrement de la table. Une boucle Do permet ainsi de parcourir tous les enregistrements, jusqu'au dernier grâce à l'instruction Until ligne.EOF, juste après le mot clé Loop qui permet de fermer la boucle. EOF signifie End Of File, jusqu'à la fin du fichier, jusqu'au dernier enregistrement. Dans la boucle, pour chaque ligne, la méthode Delete de l'objet RecordSet permet de supprimer chaque enregistrement pointé.

Maintenant que les informations sont purgées de la table et du dossier, il s'agit de parcourir la liste des nouveaux fichiers à archiver, aussi bien dans la table que dans le dossier archives. Nous devons donc créer une boucle qui passe en revue chaque élément contenu dans la zone de liste : liste_fichiers. Comme nous l'avons déjà vu, sa propriété ListCount retourne le nombre d'éléments qu'elle contient. Comme le premier élément de la liste est référencé à l'indice 0, nous devons boucler jusqu'à ListCount - 1.
  • A la suite du code, ajouter les bornes de la boucle pour le traitement d'archivage récurrent :
For compteur = 0 To liste_fichiers.ListCount - 1

Next compteur


L'image doit être copiée dans le sous dossier archives et son nom doit être inscrit dans le champ archive_image de la table archive. Si un fichier texte porte le même nom que l'image, il s'agit du descriptif de cette dernière. Dans ce cas, son contenu doit être récupéré et inscrit dans le champ archive_texte du même enregistrement que l'image. En revanche, son fichier texte ne doit pas être archivé dans le sous dossier. Nous avons donc besoin dans un premier temps, d'accéder aux propriétés du fichier en cours de lecture dans la boucle, comme son extension, grâce à la variable objet objet_fichier, instanciée précédemment. Pource faire :
  • Ajouter les lignes de code suivantes, dans la boucle :
detail_contenu = ""
nom_fichier = chemin.Value & "\" & liste_fichiers.ItemData(compteur)
extension = objet_fichier.GetExtensionName(nom_fichier)
fichier_detail = Replace(nom_fichier, extension, "txt")


detail_contenu servira à stocker l'intégralité des informations du fichier texte. Nous la réinitialisons donc à chaque nouveau passage dans la boucle. Comme d'habitude, nous reconstruisons le chemin complet du fichier en cours de lecture, par concaténation. Grâce à la méthode GetExtensionName de l'objet ActiveX pointant sur les fichiers, nous récupérons l'extension du fichier en cours dans la variable extension. Enfin grâce à la fonction VBA Replace nous remplaçons l'extension de ce fichier par txt, que nous stockons dans la variable detail_contenu. L'objectif est de savoir s'il existe un fichier texte du même nom que l'image.

Justement, il s'agit désormais de tester l'existence de ce fichier. Et s'il existe bien, il s'agit d'en récupérer le contenu afin de l'inscrire dans la table, comme descriptif de l'image.
  • Toujours dans la boucle, à la suite du code, ajouter le traitement suivant :
If (objet_fichier.FileExists(fichier_detail) = True) Then
Open fichier_detail For Input As #1
detail_contenu = Input(LOF(1), #1)
Close #1
End If


Nous récupérons le contenu de ce fichier texte si le test sur son existence, réalisé par l'instruction If, s'avère positif. C'est la méthode FileExists de l'objet ActiveX, avec en paramètre le chemin du fichier, qui retourne un booléen sur l'existence de ce dernier. Ensuite, nous accédons au contenu du fichier texte en mémoire, comme nous l'avions appris dans la formations VBA Excel pour importer et exporter des données. L'instruction Open suivi du chemin du fichier permet d'initialiser cette ouverture en mémoire. Les mots clés For Input signifient que nous accédons à ce contenu pour le lire et non pour le modifier. Comme il s'agit d'un accès en mémoire, nous lui attribuons une adresse avec un numéro, grâce à l'instruction As #1. C'est ce numéro désormais qui permettra de désigner le fichier et son contenu. Dans la variable detail_contenu, nous chargeons l'intégralité du fichier texte en le prélevant sur l'ensemble de ses octets. La fonction Input initialise cette lecture. Le premier paramètre indique le nombre d'octets à prélever. Grâce à la fonction LOF (Len Of File), nous indiquons que nous prélevons tous les Octets. Le deuxième paramètre de cette fonction, désigne le fichier sur lequel nous prélevons, grâce à son adresse mémoire, reconnue par son numéro. Surtout, une fois le traitement terminé, nous n'oublions pas de fermer l'accès au fichier pour le décharger de la mémoire. C'est ce que nous faisons avec le mot clé Close suivi, comme toujours, de l'adresse mémoire désignant ce fichier (Close #1). Ainsi, au prochain passage de la boucle, nous pourrons réutiliser sans problème cette même adresse mémoire.

Puisque nous avons récupéré le descriptif de l'image, il est désormais temps d'archiver ces données. Pour que la copie et la mise à jour de la table puissent être initialisées, nous devons commencer par vérifier qu'il s'agit bien d'un fichier image. Pour cefaire :
  • Ajouter le test sur l'extension du fichier grâce à l'instruction If suivante :
If (UCase(extension) = "JPG" Or UCase(extension) = "GIF" Or UCase(extension) = "PNG") Then

End If


Un objet RecordSet propose deux méthodes pour ajouter des enregistrements dans une table existante, déjà désignée par l'instanciation de l'objet. Il s'agit de la méthode AddNew pour initialiser le processus. Puis une fois les champs de l'enregistrement mis à jour par affectation, c'est la méthode Update de l'objet RecordSet, qui permet de réaliser cette mise à jour.
  • Dans les bornes de l'instruction If, ajouter les traitements suivants:
objet_fichier.CopyFile nom_fichier, Application.CurrentProject.Path & "\archives\" & liste_fichiers.ItemData(compteur)
ligne.AddNew
ligne.Fields("archive_image") = liste_fichiers.ItemData(compteur)
ligne.Fields("archive_texte") = detail_contenu
ligne.Update


Tout d'abord, la méthode CopyFile de l'objet ActiveX pointant sur le fichier, permet de réaliser une copie de ce dernier, en passant en paramètre le fichier à copier (nom_fichier), puis le chemin de destination pour la copie, situé dans le sous dossier archives du répertoire local (Application.CurrentProject.Path). Ensuite la méthode AddNew de l'objet RecordSet initialise la mise à jour des enregistrements. Nous affectons les champs archive_image et archive texte, grâce à la propriété Fields du RecordSet respectivement sur, le nom du fichier et son descriptif récupéré précédemment. Il est temps de tester ce code.
  • Enregistrer les modifications et exécuter le formulaire,
  • Désigner le dossier contenu à l'aide du bouton Parcourir,
  • Puis, cliquer sur le bouton Archiver,
Enregistrer et archiver données dans table de base de données en VBA Access

A l'issue, si vous ouvrez la table archive, vous notez la présence des informations ajoutées par le code Visual Basic Access. Pour chaque image, le descriptif a bien été intégré dans le champ archive_texte. De même, dans le répertoire de l'application, si vous ouvrez le sous dossier archives, vous notez la présence des images qui y ont été copiées.

Pour parfaire le code, nous souhaitons proposer à l'utilisateur de lancer le diaporama des images archivées. Pour ce faire :
  • Après la boucle, ajouter les instructions suivantes :
archiver.Enabled = False
If (MsgBox("Souhaitez-vous lancer le Diaporama ?", vbYesNo + vbQuestion, "Exécuter le diaporama") = 6) Then
DoCmd.OpenForm "diaporama", acNormal


Tout d'abord nous désactivons le bouton Archiver pour ne pas permettre d'archiver une deuxième fois dans la foulée. Il s'agit en effet du même contenu. Puis, par le biais d'une boîte de dialogue MsgBox, nous récupérons le bouton cliqué par l'utilisateur, à la question posée. Si la valeur retournée vaut 6, nous savons que l'utilisateur a cliqué sur le bouton Oui. Dès lors la méthode OpenForm de l'objet DoCmd permet d'ouvrir le formulaire désigné par son nom, en paramètre. Nous avions appris à piloter cet objet avec la formation VBA Access pour créer des interactions entre les objets de base de données.
  • Fermer la table archive, et exécuter de nouveau le formulaire,
  • Désigner le dossier contenu avec le bouton Parcourir et cliquer sur le bouton Archiver,
  • A l'invite pour lancer le diaporama, cliquer sur le bouton Oui,
Le formulaire diaporama s'affiche instantanément. Néanmoins, rien ne se produit puisqu'aucun code VBA attaché n'a encore été développé.
Exécuter ouverture formulaire par code Visual Basic Access

Lecture des enregistrements d'une table Access - Diaporama
Maintenant que les données attachées aux images sont archivées dans la table et que l'ouverture du formulaire diaporama est commandé, il s'agit de déclencher un code qui permette d'afficher les images les unes à la suite des autres, comme lors d'un diaporama PowerPoint. Mais ces images doivent apparaître en respectant un délai, qui permette de temporiser avant de passer à la suivante. Pour ce faire, VBA propose une fonction Timer qui permet de gérer les intervalles de temps écoulés.
  • Afficher le formulaire diaporama en mode création,
  • Activer l'onglet Evénement de sa feuille de propriétés,
Comme vous le remarquez, l'événement Sur chargement du formulaire est déjà attaché à une macro. Cette macro Access a été conçue avec l'éditeur, pour agrandir la fenêtre du formulaire à son ouverture. Pour lancer le diaporama, nous souhaitons déclencher un code à l'activation du formulaire. Pour ce faire :
  • Cliquer sur le petit bouton à l'extrémité de son événement Sur activation,
  • Dans la boîte de dialogue qui suit, choisir Générateur de code et valider,
Nous basculons ainsi dans l'éditeur de code Visual Basic, attaché au formulaire diaporama, entre les bornes de la procédure Form_Current. Le code du diaporama doit être exécuté sur activation mais aussi au clic sur le bouton Lancer. Pour ne pas le saisir deux fois, nous allons le développer dans une procédure qui sera appelée par l'un et l'autre événement. Pour cela :
  • Créer la procédure visionner, après le End Sub du Form_Current,
Private Sub visionner()

End Sub
  • Ajouter l'appel de cette procédure dans les bornes du Form_Current, comme suit :
Private Sub Form_Current()
visionner
End Sub


Pour terminer la préparation avant de développer le code du diaporama, nous avons besoin d'une variable publique booléenne qui permettra d'indiquer si le diaporama est en cours ou a pris fin. Une variable publique conserve la valeur stockée en mémoire au-delà de la durée de vie des procédures, qui prend fin au End Sub.
  • En entête de code, en dehors de toute procédure, ajouter la déclaration suivante :
Dim demarrer As Boolean

Variable publique en VBA Access, durée de vie globale

Comme toujours avant de débuter, nous devons déclarer les variables nécessaires et les affecter. Pour cela :
  • Ajouter les déclarations et affectations suivantes dans le bornes de la procédure visionner :
Dim ligne As Recordset: Dim base As Database
Dim delai, debut

Set base = Application.CurrentDb
Set ligne = base.OpenRecordset("archive", dbOpenTable)
demarrer = True


Nous avons désormais l'habitude des variables de bases de données. C'est pourquoi nous les déclarons sous les noms respectifs ligne pour gérer les enregistrements, et base pour pointer sur la base de données en cours. Puis nous les affectons comme précédemment. La différence réside dans le mode d'ouverture de la table archive avec le paramètre dbOpenTable. Nous ne souhaitons pas modifier les données de la table, mais seulement les récupérer, enregistrement par enregistrement. Les variables debut et delai déclarées comme des variant, serviront respectivement à se caler sur l'horloge du Timer et à lui ajouter un incrément de temps, afin de temporiser avant d'afficher l'image suivante. Enfin, nous initialisons la variable publique demarrer à True pour indiquer que le diaporama est en cours d'exécution.

Ensuite, comme nous l'avons appris au travers de la formation VBA Access pour établir la connexion aux données, nous devons placer le pointeur sur le premier enregistrement, puis initialiser une boucle pour les parcourir tous.
  • A la suite, ajouter les lignes de code suivantes:
boucle:

ligne.MoveFirst
Do

ligne.MoveNext
Loop Until ligne.EOF = True


La méthode MoveFirst de l'objet RecordSet place le pointeur sur le premier enregistrement de la table. La boucle Do Loop avec l'instruction Until ligne.EOF = True, permet de boucler tant que le dernier enregistrement de la table n'est pas atteint. C'est la raison pour laquelle, nous exploitons la méthode MoveNext de l'objet RecordSet pour ne pas oublier de passer à l'enregistrement suivant, à chaque passage dans la boucle. Entre temps, devrons être ajoutés les traitements permettant de récupérer l'image et le descriptif, dans les champs de la table, pour les afficher dans les contrôles du formulaire. Notez l'instruction du tout début (boucle:). Les deux points permettent ainsi de créer une étiquette. Cette étiquette servira d'adresse à laquelle nous renverrons le code pour que le diaporama puisse s'exécuter en boucle, tant que la variable demarrer est à True.

Il s'agit maintenant de charger l'image et le descriptif sur le formulaire. Chacun devra s'afficher pendant 2 secondes avant de céder sa place. C'est là qu'intervient la fonction VBA Timer pour temporiser.
  • Dans la boucle, avant l'instruction ligne.MoveNext, ajouter le code suivant :
img.Picture = Application.CurrentProject.Path & "\archives\" & ligne.Fields("archive_image").Value
detail.Caption = ligne.Fields("archive_texte").Value
delai = 2
debut = Timer

Do While Timer < debut + delai
DoEvents
Loop

If (demarrer = False) Then Exit Do


Comme nous l'avions déjà appris, la propriété Picture du contrôle image nommé img, permet d'affecter le chemin complet de l'image à afficher, que nous reconstruisons par concaténation. La propriété dérivée Path de la propriété CurrentProject de l'objet VBA Application permet de désigner le dossier de la base de données en cours. Nous lui associons le sous dossier archives et le nom du fichier image, récupéré dans le champ archive_image de l'enregistrement en cours (ligne.Fields("archive_image").Value). Dans le Label situé sur le contrôle image du formulaire, nous affichons le descriptif de l'image grâce à sa propriété Caption que nous affectons à la valeur du champ archive_texte pour l'enregistrement en cours. Nous réglons ensuite le délai d'affichage sur 2 secondes (delai = 2). Nous initialisons l'indice de départ sur l'horloge, retournée par la fonction VBA Timer (debut = Timer). Timer s'incrémente automatiquement avec le temps qui passe. En conséquence, tant que le délai n'est pas écoulé (Do While Timer < debut + delai), nous bouclons dans le vide. Nous faisons ainsi attendre la suite de l'exécution du code. Notez tout de même la présence de l'instruction DoEvents avant la fermeture de la boucle (Loop). Cette fonction permet de rendre la main pour que d'autres processus soient exécutés, comme par exemple une demande d'arrêt de la part de l'utilisateur. Sans cette fonction, le processeur est occupé à temps plein par la boucle à exécuter. Enfin, avant de poursuivre le diaporama, un test est effectué sur la variable publique demarrer. Si l'utilisateur a cliqué entre temps sur le bouton Arrêter, le processus doit en effet être stoppé.

Le traitement de la boucle est terminé, mais avant de tester le code, nous devons décharger les objets de base de données pour fermer les connexions et ne pas les empiler. Pour ce faire :
  • Après la boucle et avant le End Sub, ajouter les instructions suivantes :
If (demarrer = True) Then GoTo boucle

ligne.Close
base.Close
Set ligne = Nothing
Set base = Nothing


Avant cela, si la valeur de la variable demarrer n'a pas changé, nous renvoyons le code à l'étiquette décrite précédemment, située avant la boucle, pour que justement le diaporama continue sa lecture, en repartant du début. Ensuite les méthodes Close des objets de base de données ferment les connexions, comme nous l'avons appris. Puis la dernière affectation des objets à Nothing permet de les décharger complètement de la mémoire. Deux réglages restent à faire avant de tester le code. Le bouton Arreter doit stopper le diaporama en affectant la variable publique demarrer à False. Le bouton lancer doit au contraire exécuter le diaporama en appelant la procédure visionner.
  • Afficher le formulaire diaporama en mode création,
  • Sélectionner le bouton Lancer,
  • Affecter une procédure événementielle à son événement Au clic,
  • Saisir l'instruction suivante entre ses bornes :
Private Sub lancer_Click()
visionner
End Sub
  • Affecter de même une procédure événementielle à l'événement Au clic du bouton Arreter,
  • Saisir l'affectation suivante entre ses bornes,
Private Sub arreter_Click()
demarrer = False
End Sub
  • Enregistrer les modifications puis fermer le formulaire diaporama,
  • Exécuter le formulaire acces_fichiers,
  • Cliquer sur le bouton Parcourir et désigner le dossier contenu,
  • Cliquer ensuite sur le bouton Archiver,
  • Répondre Oui au MsgBox pour lancer le Diaporama,
Le formulaire diaporama apparaît à l'écran et les images avec leur descriptif s'affichent en effet par intervalles de 2 secondes. Si vous cliquez sur le bouton Arreter, son exécution se stoppe et les objets de base de données sont bien déchargés. Si bien que vous pouvez fermer le formulaire.
Diaporama sur formulaire access des images archivées par code VBA
 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn