formateur informatique

Générer un diaporama Web avec une base de données Access

Accueil  >  Bureautique  >  Access  >  Access VBA  >  Générer un diaporama Web avec une base de données 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 :


Diaporama dynamique sur base de données Access

Dans de précédentes formations, nous avons déjà bâti d'une part une visionneuse d'images sur un formulaire Access et d'autre part, un diaporama de photos pour le Web en Javascript. Ici nous proposons en quelques sortes de fusionner les deux. L'application Access a la capacité d'archiver les images contenues dans un dossier du disque. L'application Internet sait retranscrire l'album photos sur une plateforme universelle, un navigateur Web. Nous proposons que la première transmette les données nécessaires à la seconde, afin de construire dynamiquement le diaporama sur ces nouvelles photos.

Application formulaire Access pour générer dynamiquement des albums photos Html pour internet

Nous allons donc simuler le principe d'un site internet dynamique où un code serveur accède à la base de données, consolide les nouvelles informations pour les transmettre au traitement d'un code client, qui s'exécute seulement sur la machine de l'internaute.

Sources et présentation du concept

Pour coder le lien dynamique qui s'exercera entre l'application Access et l'application internet, nous proposons de récupérer les sources respectives, telles que nous les avons développées dans les formations précédentes. La décompression conduit aux deux fichiers d'applications à la racine soit la base de données Access et la page Html du diaporama. Vous notez aussi la présence des sous dossiers styles et images dans lesquels se trouvent les ressources externes de la page Web. Nous utiliserons d'ailleurs le sous dossier images comme hôte des photos pour l'écriture par le code Visual Basic Access.
  • Double cliquer sur le fichier visionneuse-images-conception.accdb pour l'ouvrir dans Access,
  • Cliquer sur le bouton Activer le contenu du ruban jaune,
Le volet sur la gauche présente les objets Access disponibles pour cette base de données : Deux tables et un formulaire. Les tables contiennent déjà des enregistrements mais ils sont à mettre à jour. En effet, ils font référence à des images stockées sur un emplacement hors de portée.
  • Double cliquer sur l'objet Visionneuse pour exécuter son formulaire,
  • Cliquer ensuite sur le bouton à la loupe en bas de l'album photos du formulaire,
  • Dans la boîte de dialogue qui suit, désigner un dossier contenant des images,
  • Puis, cliquer sur Ok pour valider,
Les premières photos apparaissent instantanément au centre de l'album et dans les miniatures placées sur la droite. Dès lors, selon la formation que nous avions bâtie, vous pouvez débuter la navigation au travers de l'album par clic sur les boutons ou sur les vignettes des miniatures. Le chemin absolu du dossier a été enregistré dans la table Chemin tandis que les informations sur les photos ont été archivées dans la table Images. Ainsi nous pourrons exploiter ces données pour les transmettre à l'application Web Javascript.
  • Dans le ruban Accueil, cliquer sur la flèche du bouton Affichage,
  • Dans la liste, choisir Mode création,
Si la feuille de propriétés n'est pas visible dans votre environnement, vous devez cliquer sur le bouton Feuille de propriétés du ruban Création. Vous notez la présence d'un nouveau bouton sur la gauche en bas de l'album, accompagné d'un graphisme représentant une bobine de film. C'est ce bouton qui doit permettre de transmettre toutes les données nécessaires pour générer dynamiquement le diaporama pour le Web. Nous devons donc créer sa procédure événementielle.
  • Cliquer sur ce nouveau bouton (btn_media) pour le sélectionner,
  • Activer l'onglet Evénement de sa feuille de propriétés,
  • Cliquer sur le petit bouton accompagnant son événement Au clic,
  • Dans la boîte de dialogue qui suit, choisir Générateur de code et valider par Ok,
Nous basculons ainsi dans l'éditeur de code, entre les bornes de la procédure btn_media_Click, soit le code qui s'exécutera au clic sur le bouton btn_media. Vous notez la présence des autres procédures ayant permis de construire cette visionneuse d'images. Ce code VBA devra notamment être capable de :
  • Copier les images dans le sous dossier Images de l'application Web,
  • Modifier une instruction Javascript dans la page Html pour transmettre la chaîne d'images,
  • Lancer l'exécution de la page dans son navigateur pour générer le diaporama.
Pour mieux comprendre, nous devons accéder à la structure de la page Html.
  • Enregistrer les modifications,
  • Revenir dans l'explorateur Windows dans le dossier de décompression,
  • Cliquer avec le bouton droit de la souris sur le fichier album-photos-internet.html,
  • Dans le menu contextuel, choisir de l'ouvrir avec un éditeur tel que le Notepad ++,
  • Faire défiler la page vers le bas jusqu'à atteindre la section du script située sous le body,
Au tout début de ce script, vous notez la présence d'une déclaration de chaîne de caractères énumérant des noms de fichiers séparés par des points-virgules. C'est de cette variable chaine_img que dépend tout l'album photos Web. Chaque fichier est analysé indépendamment par le code Javascript et chargé dans le diaporama depuis le sous dossier Images.

//debutChaine
var chaine_img="01-place-de-grammat-lot.jpg; 02-vue-depuis-Rocamadour-lot.jpg; 03-place-de-cahors-lot.jpg; 04-vue-depuis-saint-cirq-lapopie-lot.jpg;"
chaine_img +="05-la-cluzas-haute-savoie.jpg; 06-luge-ete-la-cluzas-haute-savoie.jpg; 07-chateau-de-chambord-loir-et-cher.jpg; 08-les-gorges-du-verdon-alpes-de-haute-provence.jpg";
chaine_img += ";09-le-grau-du-roi-gard.jpg; 10-le-pont-du-gard.jpg; 11-le-colorado-du-luberon.jpg; 12-la-dune-du-pilat-gironde.jpg";
//finChaine


En somme, si nous parvenons à modifier cette chaîne par le code VBA Access, au moment du clic sur le bouton btn_media, c'est tout l'album photos Web que nous modifions. C'est la raison pour laquelle, ce groupe de lignes est encadré de repères en commentaires. Nous les exploiterons par le code externe afin d'intervenir précisément entre ces bornes repérées.

Récupérer les images archivées en base de données
Avant de songer à modifier les instructions Javascript dans la page Html par le code VBA Access, nous devons récupérer les images archivées dans la base de données. Ainsi, non seulement nous pourrons reconstruire la chaîne à modifier dans la page Web, mais nous pourrons aussi copier toutes ces photos dans le sous dossier local, le sous dossier Images.

Comme toujours, avant de débuter, nous devons commencer par déclarer les variables nécessaires au développement.
  • Revenir dans l'éditeur de code VBA Access, entre les bornes de la procédure btn_media_Click,
  • Ajouter les déclarations de variables suivantes :
Dim verif_nombre As Integer
Dim enr As Recordset
Dim chaque_image: Dim les_fichiers: Dim le_dossier
Dim fichier_image As String: Dim dossier_destination As String
Dim chaine_img As String
Dim contenu_web As String: Dim ligne_texte As String
Dim position1 As Integer: Dim position2 As Integer
Dim bout1 As String: Dim bout2 As String


Nous avons besoin de savoir si des images sont bien archivées dans la table avant de débuter le processus. L'exécution d'une requête spécifique retournera le décompte des photos trouvées dans la variable verif_nombre. Bien sûr, pour y parvenir, nous devrons accéder aux enregistrements de la table, d'où la déclaration de la variable enr pour manipuler les enregistrements. La variable permettant d'accéder à la base de données quant à elle, est déjà déclarée en variable publique.

Les variables suivantes (chaque_image, les_fichiers, le_dossier, fichier_image, dossier_destination) permettront, comme leur nom l'indique, d'accéder aux fichiers et dossiers, puisqu'il s'agit de copier ces images dans un premier temps.

La variable chaine_img servira à reconstruire l'énumération des noms de fichiers pour la page Web. La variable contenu_web, déclarée elle aussi comme un texte, servira à stocker en mémoire l'intégralité du contenu de la page Html. Cette reconstitution se fera ligne à ligne par accès séquentiel, d'où l'intérêt de la variable ligne_texte. Ainsi à l'issue, nous pourrons découper l'information en deux parties (bout1 et bout2) selon les positions (position1 et position2) trouvées pour les repères en commentaires, dans la page Web, mentionnés plus haut.

Dans la syntaxe SQL pour les requêtes, c'est la fonction COUNT qui permet de compter sur un champ spécifié, le nombre d'enregistrements trouvés. Et c'est la méthode OpenRecordset sur un objet de base de données qui permet d'initialiser l'objet Recordset permettant d'accéder aux données résultant de la requête ainsi exécutée.
  • En conséquence, à la suite du code, ajouter les instructions suivantes :
verif_nombre = 0

Set enr = la_base.OpenRecordset("SELECT count(images_num) AS nb_images FROM Images", dbOpenDynaset)
enr.MoveFirst
verif_nombre = enr.Fields("nb_images").Value
enr.Close

MsgBox verif_nombre

If (verif_nombre > 0) Then

End If


Nous commençons par initialiser la variable verif_nom. Puis, pour initialiser l'objet Recordset, nous passons la syntaxe SQL de la requête à la méthode OpenRecordset de l'objet la_base. Comme la fonction SQL Count réalise un calcul à la volée, nous créons un champ virtuel (nb_images) pour réceptionner son résultat grâce au mot clé As. Comme toujours, la méthode MoveFirst de l'objet Recordset permet alors de placer le pointeur de lecture sur le premier enregistrement extrait par la requête. Puis, la propriété Fields de ce même objet permet d'accéder au champ qui lui est passé en paramètre, le fameux champ virtuel, pour lequel nous accédons à son contenu grâce à la propriété Value. Le traitement étant terminé, nous n'oublions pas de fermer la connexion établie par l'objet Recordset grâce à sa méthode Close. Un test temporaire (MsgBox) permet de vérifier la valeur récupérée. C'est elle qui décidera de la poursuite du code, si le nombre d'images archivées est bien supérieur à zéro, comme le traduit l'instruction conditionnelle If.
  • Enregistrer les modifications (CTRL + S) et basculer sur le formulaire (ALT + F11),
  • L'exécuter en enfonçant la touche F5 du clavier et cliquer sur le bouton btn_media,
Dénombrer enregistrements images présentes en base de données par instruction SQL Count exécutée par VBA Access

Comme vous le constatez, et comme l'illustre la capture ci-dessus, la requête SQL de décompte a parfaitement fonctionné. La variable verif_nombre a réceptionné 8 enregistrements, soit 8 images archivées, signifiant que nous pouvons poursuivre le traitement.
  • Afficher le formulaire en mode création et revenir dans l'éditeur de code,
  • Passer la ligne du MsgBox en commentaire à l'aide d'une apostrophe en préfixe,
Avant de parcourir l'ensemble des noms de fichiers archivés pour les copier dans le répertoire local de la page Web, nous devons nous assurer que celui-ci a bien été purgé des potentielles précédentes photos. Nous devons donc accéder aux fichiers du sous dossier Images par le code Visual Basic. Et pour ce faire, nous devons instancier la classe appropriée grâce à la fonction CreateObject, comme nous l'avait appris la formation VBA Access pour manipuler les fichiers d'un dossier. Pour constater que l'opération est un succès :
  • Coller des images de votre choix dans le sous dossier Images,
  • Entre les bornes de l'instruction If, ajouter les lignes de code suivantes :
dossier_destination = Application.CurrentProject.Path & "\images\"
Set les_fichiers = CreateObject("scripting.filesystemobject")
Set le_dossier = les_fichiers.getfolder(dossier_destination)

For Each chaque_image In le_dossier.Files
If (chaque_image.Name <> "image-defaut.jpg" And chaque_image.Name <> "indicateur.png" And chaque_image.Name <> "le_formateur.png" And chaque_image.Name <> "motifgb2.jpg" And chaque_image.Name <> "textpap4.jpg") Then
chaque_image.Delete
End If
Next chaque_image


Tout d'abord la propriété dérivée Path de la propriété CurrentProject de l'objet Application permet de retourner le chemin complet de l'application Access, donc de la page Web qui est située au même emplacement. Puis nous instancions la classe permettant de manipuler les fichiers et dossiers en passant le paramètre scripting.filesystemobject à la fonction CreateObject. Dès lors l'objet les_fichiers hérite des propriétés et méthodes. C'est ainsi que la méthode getfolder avec le chemin du dossier en paramètre, permet de créer l'objet pour manipuler précisément ce dossier. La propriété Files de cet objet fraichement créé renvoie une collection de tous les fichiers contenus dans ce dossier. C'est pourquoi, nous initialisons une boucle For Each permettant de parcourir chacun d'entre eux.

Dans la boucle, à l'aide du mot clé And dans l'instruction If, nous vérifions tout d'abord que le fichier en cours de lecture ne correspond pas (<>) à l'une des images de la page Web. Si le test multicritère est validé, alors nous exploitons la méthode Delete de l'objet chaque_image, pour effacer la photo du disque dur.
  • Enregistrer les modifications, basculer sur le formulaire et l'exécuter (F5),
  • Cliquer sur le bouton btn_media,
En apparence rien ne se produit puisque nous avons désactivé le MsgBox. Dans les faits, le code VBA est censé avoir nettoyé le sous dossier Images de l'application en préservant celles dont les noms de fichiers sont énumérés dans l'instruction If. Si vous ouvrez le sous dossier dans l'explorateur Windows, vous constatez en effet que les images que vous avez précédemment collées, ont disparu.

Maintenant que nous avons la certitude que le dossier est bien nettoyé, nous devons initier une boucle de lecture sur tous les enregistrements. Ainsi nous récupèrerons les noms de fichiers pour pouvoir en faire une copie en local. Il s'agit donc de nouveau d'exécuter une requête sélection sur la table Images grâce à la méthode Recordset de notre objet de base de données.
  • Afficher le formulaire en mode création et revenir dans l'éditeur de code VBA Access,
  • Après la boucle mais toujours dans le If, ajouter les instructions suivantes :
Set enr = la_base.OpenRecordset("SELECT images_fichier FROM Images", dbOpenDynaset)
enr.MoveFirst
Do
fichier_image = enr.Fields("images_fichier").Value
chaine_img = chaine_img & fichier_image & ";"

les_fichiers.CopyFile nom_dossier & "\" & fichier_image, dossier_destination & fichier_image

enr.MoveNext
Loop Until enr.EOF

enr.Close

chaine_img = "var chaine_img='" & chaine_img & "'"
MsgBox chaine_img


Comme précédemment, nous initialisons tout d'abord notre objet Recordset selon la syntaxe de la requête passée en paramètre de la méthode OpenRecordset. Cette requête sélection récupère, pour tous les enregistrements de la table Images, les informations contenues dans le champ images_fichier. Ce champ contient le nom du fichier correspondant à l'image à copier. Nous plaçons le pointeur de lecture sur le premier des enregistrements résultants (enr.MoveFirst). Puis, nous initions une boucle permettant de tous les parcourir (Do...Loop Until enr.EOF). La propriété EOF de l'objet Recordset est une contraction de l'expression End Of File. Donc ici, nous ne bouclons pas jusqu'à la fin du fichier mais jusqu'au dernier enregistrement renvoyé par l'exécution de la requête. Nous stockons tout d'abord le nom du fichier (fichier_image = enr.Fields("images_fichier").Value), à chaque passage dans la boucle, donc pour chaque image. Au fur et à mesure, nous construisons la variable chaine_img par concaténation (chaine_img = chaine_img & fichier_image & ";"), en prenant soin de séparer chaque nom d'image par un point-virgule. En effet, c'est comme cela qu'elles sont déclarées dans le code Javascript de la page Web de l'album photos. Et c'est donc comme cela que nous devons lui transmettre. Ensuite, la méthode CopyFile de notre objet les_fichiers qui avait instancié la classe pour manipuler les fichiers, permet de réaliser une copie selon deux paramètres (source et destination). Pour chaque image source, nous connaissons le chemin stocké dans la variable publique nom_dossier, tel que nous l'avions conçu dans l'application précédente pour la visionneuse d'images. Nous conservons le même nom pour la destination mais nous remplaçons son chemin pour la placer dans le répertoire local (dossier_destination & fichier_image). Bien sûr, il ne faut surtout pas oublier de placer le pointeur sur l'enregistrement suivant (enr.MoveNext), sinon la boucle ne progresse pas et ne se termine jamais.

Une fois la boucle terminée, nous fermons la connexion ouverte par notre objet Recordset (enr.Close). Puis, nous finalisons la construction de notre variable chaine_img dans le but de la transmettre bientôt à la page Web. Nous avons deux vérifications à réaliser pour nous assurer que ce code est fonctionnel. Tout d'abord, il s'agit de visualiser le retour fourni par la fonction MsgBox pour constater que les noms de fichiers sont correctement concaténés. Ensuite, nous devons nous assurer que les images ont correctement été dupliquées dans le sous dossier local.
  • Enregistrer les modifications, basculer sur le formulaire et l'exécuter,
  • Cliquer sur le bouton à la loupe pour parcourir le disque dur,
  • Sélectionner un dossier contenant des images et valider,
  • Cliquer ensuite sur le bouton btn_media,
Récupérer données en base de données pour copier leurs images dans un autre dossier par le code VBA Access

La chaîne apparaît parfaitement reconstruite par concaténation, par le biais du MsgBox. Si vous ouvrez le sous dossier Images du répertoire local, vous constatez la présence des images copiées, tandis que les précédentes ont été supprimées.

Récupérer le contenu de fichiers externes en VBA
Puisque l'expression des noms de fichiers est parfaitement concaténée dans une déclaration de variable, et puisque les images sont correctement copiées dans le sous dossier local, nous pouvons désormais traiter l'information de la page Web. Nous souhaitons dans un premier temps récupérer l'intégralité du code du diaporama Javascript. Dès lors, nous pourrons traiter la variable par le code VBA afin de remplacer la déclaration de la chaine des images par la nouvelle. Et pour ce faire, nous allons réaliser des accès séquentiels comme nous l'avions fait dans la formation VBA Excel pour importer des données sur une feuille.
  • Afficher le formulaire en mode création et revenir dans l'éditeur de code VBA Access,
  • Préfixer la ligne du MsgBox d'une apostrophe pour la passer en commentaire,
  • A la suite du code, toujours dans le If, ajouter les instructions de lecture suivantes :
Open Application.CurrentProject.Path & "\album-photos-internet.html" For Input As #1
Do While Not EOF(1)
Line Input #1, ligne_texte
contenu_web = contenu_web & ligne_texte & Chr(13) & Chr(10)
Loop
Close #1


Comme nous l'avions appris donc, l'instruction Open suivi du chemin complet d'un fichier, permet d'accéder à ce dernier en mémoire. Comme nous souhaitons récupérer son contenu, nous devons y accéder en lecture, ce que nous précisons grâce à l'instruction For Input. Comme les données du fichier sont chargées en mémoire, nous devons définir un adressage libre pour ensuite pouvoir ainsi le manipuler. Nous définissons une adresse avec le chiffre 1 (As #1).

Nous initialisons ensuite une boucle destinée à parcourir tout le contenu désormais stocké dans la RAM. Et c'est la fonction EOF (End Of File) avec l'adressage mémoire en paramètre, qui permet à la boucle de se poursuivre tant que la fin du fichier n'est pas atteinte. Dès lors, l'instruction Line Input #1 permet de récupérer la ligne complète en cours de lecture dans la boucle. Notez l'emploi nécessaire de la fameuse adresse mémoire (#1) pour toujours désigner le contenu stocké. Cette ligne est mémorisée dans la variable ligne_texte passée en paramètre. Avant le prochain passage dans la boucle, nous n'oublions de consolider tour à tour, chaque ligne ainsi récupérée, dans la variable contenu_web (contenu_web = contenu_web & ligne_texte & Chr(13) & Chr(10)). La fonction VBA Chr permet de simuler des actions clavier selon la valeur numérique passée en paramètre. Avec les nombres 13 et 10 nous simulons respectivement un retour chariot et un saut de ligne, afin de reconstituer proprement le fichier d'origine.

Il est temps désormais de manipuler ce fichier depuis sa variable contenu_web. Nous souhaitons identifier les positions de départ et de fin de la déclaration de variable à modifier, dans le script Javascript. Ainsi, nous pourrons fractionner le contenu en deux parties et insérer la variable chaine_img entre les deux.
  • Pour ce faire, à la suite du code et toujours dans le If, ajouter les instructions suivantes :
position1 = InStr(1, contenu_web, "//debutChaine") + 13
position2 = InStr(1, contenu_web, "//finChaine")
MsgBox position1 & "-" & position2

bout1 = Left(contenu_web, position1)
bout2 = Mid(contenu_web, position2)
contenu_web = bout1 & chaine_img & bout2


La fonction VBA InStr renvoie la position d'une occurrence (//debutChaine) recherchée dans une chaîne de caractères (contenu_web), en indiquant en premier paramètre, à partir de quelle position la recherche doit commencer. Nous récupérons ainsi la position des deux commentaires qui encadrent la variable à changer dans le script. Notez que dans le premier cas (position1), nous ajoutons 13 pour nous placer directement après le commentaire. Comme toujours, la fonction MsgBox permet de réaliser un test temporaire afin de vérifier la cohérence des positions ainsi récupérées.

C'est alors qu'intervient la fonction VBA Left permettant de prélever une partie de la chaîne de caractères sur une longueur donnée, en partant de la gauche. Dans la variable bout1, nous stockons tout le contenu situé avant la déclaration de variable du script (position1). L'autre partie est celle située après. C'est pourquoi nous exploitons cette fois la fonction VBA mid qui permet d'extraire une partie de la chaîne de caractères (contenu_web), en partant d'une position donnée (position2). Usuellement cette fonction requiert un troisième paramètre pour déterminer sur quelle longueur elle doit prélever l'information. Lorsqu'il n'est pas défini, la fonction mid prélève jusqu'à la fin en partant de la position définie en deuxième paramètre. Nous n'avons plus qu'à reconstruire la chaîne finale en concaténant chaque morceau dans l'ordre, sans oublier d'intercaler la nouvelle déclaration de variable.
  • Enregistrer les modifications, basculer sur le formulaire et l'exécuter,
  • Puis, cliquer sur le bouton btn_media,
Comme l'illustre la capture ci-dessous, le MsgBox retourne des positions cohérentes puisque la seconde est plus importante que la première.

Prélever positions de texte dans des fichiers externes pour pouvoir les manipuler et découper en VBA Access et reconstruire information

Le MsgBox n'aurait pas permis en revanche d'afficher l'intégralité de la chaîne reconstituée. Mais à en croire les positions correctement prélevées, la reconstruction devrait être correcte.

Ecrire dans des fichiers externes en VBA
Le plus dur est fait. Il s'agit maintenant de remplacer le contenu de la page Web, par la chaîne reconstituée avec la nouvelle déclaration d'images (contenu_web). Nous devons de nouveau accéder en mémoire au fichier album-photos-internet.html, mais cette fois en écriture (For Output).
  • Afficher le formulaire en mode création et revenir dans l'éditeur de code VBA Access,
  • Passer la ligne du MsgBox en commentaire,
  • A la suite du code et toujours dans le If, ajouter les instructions suivantes :
Open Application.CurrentProject.Path & "\album-photos-internet.html" For Output As #1
Print #1, contenu_web
Close #1


Le début de l'instruction Open ne change pas. Nous désignons le chemin d'accès complet au fichier Html pour le manipuler en mémoire, mais cette fois en écriture. C'est pourquoi nous le spécifions par l'instruction For Output. Comme précédemment nous définissons une allocation mémoire par le chiffre 1. Cette adresse n'est plus utilisée puisque l'ancien accès a été fermé (Close #1). Puis nous écrasons l'ancien contenu par le nouveau grâce à l'instruction Print qui pointe sur l'adresse mémoire et indique quoi écrire en paramètre, soit la variable contenu_web. Nous fermons l'accès et libérons la mémoire (Close #1). C'est à ce moment précis que les informations sont écrites en dur sur le disque, en lieu et place de l'ancien fichier.
  • Enregistrer les modifications, basculer sur le formulaire et l'exécuter,
  • Cliquer sur le bouton btn_media,
Le traitement est transparent pour l'utilisateur puisque nous ne déclenchons aucune alerte. Mais nous sommes censés avoir modifié le code Javascript de la page Html.
  • Pour en avoir le coeur net, afficher le dossier de décompression dans l'explorateur Windows,
  • Ouvrir le fichier Html dans un éditeur tel que le NotePad++,
  • Faire défiler la page vers le bas jusqu'à atteindre la section du script située après le body,
Instructions du fichier HTML externe modifié par code Visual Basic Acces pour interactions et générations dynamiques

Comme vous le constatez, le code de la page Html a parfaitement été restitué mais avec de nouvelles données dans la variable chaine_img. Il s'agit bien des noms de fichiers des photos contenues dans le dossier désigné depuis l'application Access. Comme nous avons déjà vérifié que ces images avaient correctement été copiées dans le sous dossier Images du répertoire local, le diaporama Web devrait s'adapter. Pour le vérifier, il ne reste plus qu'à exploiter une fonction VBA particulière, la fonction Shell. Cette dernière permet d'exécuter un fichier dans son application.
  • Fermer l'éditeur de code de la page Web,
  • Revenir sur l'application Access,
  • Afficher le formulaire en mode création et retourner dans l'éditeur de code VBA Access,
La syntaxe de la fonction Shell est la suivante :

Shell "chemin_de_l_executable_a_lancer"

Dans notre cas par exemple, nous souhaitons démarrer Firefox mais pas tout seul. Nous souhaitons ouvrir la page Html dans Firefox. La syntaxe devient alors :

Shell "chemin_de_l_executable_a_lancer chemin_du_fichier_a_ouvrir"

Lorsque le chaînes peuvent s'écrire en dur, tout va bien. Nous, nous devons concaténer ces informations avec des variables.
  • A la suite du code et toujours dans le If, ajouter l'instruction suivante :
Shell """C:\Program Files (x86)\MozillaFirefox\firefox.exe"" """ & Application.CurrentProject.Path & "\album-photos-internet.html""", vbMaximizedFocus

Bien sûr vous devez adapter le chemin de l'application à votre environnement Windows. Notez la présence des triples-côtes. L'expression passée à la fonction Shell doit être retranscrite et interprétée entre doubles côtes. Donc nous écrivons une double côte encadrée elle-même de doubles-côtes de part et d'autre de l'expression.
  • Enregistrer les modifications, basculer sur le formulaire et l'exécuter,
  • Cliquer sur le bouton btn_media pour générer le diaporama Web dynamiquement,
Album photos Javascript généré dynamiquement car alimenté en données et images par code VBA depuis formulaire Access

Quasiment instantanément, le diaporama Html apparaît dans le navigateur Web en affichant les photos désignées depuis l'application Access. Il est parfaitement fonctionnel comme lui dicte son code Javascript dont nous n'avons changé que la déclaration de la variable des images. Si vous réitérez l'opération depuis le formulaire Access après avoir désigné un autre dossier d'images, vous remarquez que le l'album photos internet s'adapte et semble donc se construire dynamiquement.

L'interaction entre l'application Access et l'application Web a été rendue possible grâce au code Visual Basic capable de manipuler les fichiers et de les modifier. Pour parfaire l'application, nous devrions traiter le script situé dans le head de la page Html, afin d'écrire les instructions Javascript pour le pré chargement des images dans le cache du navigateur. C'est notamment ce que nous avait enseigné la formation sur la création d'un album photos pour le Web. Mais le principe d'accès au fichier et de découpe des informations reste le même. Donc libre à chacun de parfaire le programme.

Le code complet du bouton pour générer dynamiquement l'album photos Web, est le suivant :

Private Sub btn_media_Click()
Dim verif_nombre As Integer
Dim enr As Recordset
Dim chaque_image: Dim les_fichiers: Dim le_dossier
Dim fichier_image As String: Dim dossier_destination As String
Dim chaine_img As String
Dim contenu_web As String: Dim ligne_texte As String
Dim position1 As Integer: Dim position2 As Integer
Dim bout1 As String: Dim bout2 As String

verif_nombre = 0
Set enr = la_base.OpenRecordset("SELECT count(images_num) AS nb_images FROM Images", dbOpenDynaset)
enr.MoveFirst
verif_nombre = enr.Fields("nb_images").Value
enr.Close

'MsgBox verif_nombre

If (verif_nombre > 0) Then

dossier_destination = Application.CurrentProject.Path & "\images\"
Set les_fichiers = CreateObject("scripting.filesystemobject")
Set le_dossier = les_fichiers.getfolder(dossier_destination)

For Each chaque_image In le_dossier.Files
If (chaque_image.Name <> "image-defaut.jpg" And chaque_image.Name <> "indicateur.png" And chaque_image.Name <> "le_formateur.png" And chaque_image.Name <> "motifgb2.jpg" And chaque_image.Name <> "textpap4.jpg") Then
chaque_image.Delete
End If
Next chaque_image

Set enr = la_base.OpenRecordset("SELECT images_fichier FROM Images", dbOpenDynaset)
enr.MoveFirst
Do
fichier_image = enr.Fields("images_fichier").Value
chaine_img = chaine_img & fichier_image & ";"

les_fichiers.CopyFile nom_dossier & "\" & fichier_image, dossier_destination & fichier_image

enr.MoveNext
Loop Until enr.EOF

enr.Close

chaine_img = "var chaine_img='" & chaine_img & "'"
'MsgBox chaine_img

Open Application.CurrentProject.Path & "\album-photos-internet.html" For Input As #1
Do While Not EOF(1)
Line Input #1, ligne_texte
contenu_web = contenu_web & ligne_texte & Chr(13) & Chr(10)
Loop
Close #1

position1 = InStr(1, contenu_web, "//debutChaine") + 13
position2 = InStr(1, contenu_web, "//finChaine")

'MsgBox position1 & "-" & position2

bout1 = Left(contenu_web, position1)
bout2 = Mid(contenu_web, position2)

contenu_web = bout1 & chaine_img & bout2

Open Application.CurrentProject.Path & "\album-photos-internet.html" For Output As #1
Print #1, contenu_web
Close #1

Shell """C:\Program Files (x86)\Mozilla Firefox\firefox.exe"" """ & Application.CurrentProject.Path & "\album-photos-internet.html""", vbMaximizedFocus

End If
End Sub


 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales