Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Archiver les données en Visual Basic Access
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.
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 .
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,
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,
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 ,
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 ,
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é.
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
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.