Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Télécharger une base de données distante
Nous proposons de monter une application en trois étapes. L'objectif est de pouvoir
importer les informations d'une
base de données compressée hébergée sur un serveur distant. Trois sujets sont donc à l'affiche. Dans une première étape, il est question de procéder au
téléchargement. Dans une deuxième, il s'agit de réaliser la
décompression. C'est alors l'
importation des données externes qui doit avoir lieu dans un troisième temps et tout cela, par le
code VBA Access.
Base de données Access à télécharger
Pour amorcer ces travaux, nous suggérons d'appuyer l'étude sur une
base de données offrant une
table pour accueillir ces
informations externes ainsi qu'un
formulaire avec un
bouton dédié au
téléchargement.
Comme vous pouvez le voir, la
décompression livre le
fichier de la base de données avec un
fichier texte. Ce dernier héberge l'
URL de la base de données distante que nous souhaitons
télécharger par le
code VBA Access.
- Double cliquer sur le fichier de la base de données pour l'ouvrir dans Access,
- Cliquer ensuite sur le bouton Activer le contenu du bandeau de sécurité,
- Puis, dans le volet de navigation sur la gauche, double cliquer sur le formulaire fRecup,
Ce
formulaire est doté d'un
sous formulaire pour accueillir les
données distantes à importer. Dans son entête, il propose aussi un
bouton de téléchargement. En réalité, il s'agit d'un contrôle image que nous utiliserons comme un bouton. Au clic, le
téléchargement doit intervenir dans un premier temps.
La procédure du bouton
Pour débuter, nous devons associer un code à déclencher au clic sur le
bouton de téléchargement.
- A gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage,
- Dans les propositions, choisir le mode Création,
- Sur le formulaire en conception, cliquer sur l'image à l'icône du téléchargement,
- Activer alors l'onglet Evénement de sa feuille de propriétés,
- Cliquer sur le petit bouton associé à son événement Au clic,
- Dans la boîte de dialogue qui suit, choisir le Générateur de code et valider par Ok,
C'est ainsi que nous basculons dans l'
éditeur de code VBA Access, entre les bornes de la
procédure événementielle telecharger_Click.
Les variables
Des
variables et
objets sont nécessaires, notamment pour émettre une
demande http destinée à récupérer le
fichier distant.
- Dans les bornes de la procédure, ajouter les déclarations suivantes :
...
Dim chemin As String: Dim adresse As String
Dim requeteHttp As Object: Dim flux As Object
...
Nous typons les deux premières variables comme des
textes (As String). Elles doivent respectivement stocker le
chemin d'accès au fichier résultant du téléchargement sur le disque ainsi que l'
Url du fichier distant. Nous typons les deux suivantes comme des
objets. La première doit
instancier la classe permettant notamment d'émettre des
requêtes http sur le Web. La seconde doit
instancier la classe permettant d'ouvrir un
flux de lecture en mémoire pour réceptionner les données du
fichier distant.
La demande de téléchargement
Il est maintenant temps d'initialiser les variables et notamment le premier objet pour effectuer la
demande http de téléchargement. Pour cela, faut-il encore connaître l'
url du fichier distant et l'
emplacement sur le disque pour l'accueillir.
- Après la déclaration des variables, ajouter les instructions VBA suivantes :
...
chemin = CurrentProject.Path & "\base-distante.zip"
adresse = "https://www.bonbache.fr/ .../base-distante.zip"
Set requeteHttp = CreateObject("Microsoft.XMLHTTP")
requeteHttp.Open "GET", adresse
requeteHttp.Send
...
Grâce à la
propriété Path de l'
objet VBA Access CurrentProject, nous désignons le
chemin d'accès à l'application locale. Nous lui ajoutons (& "\...") le
nom du fichier sous lequel nous souhaitons stocker le
fichier téléchargé. Dans la
variable adresse, nous mémorisons l'
URL du fichier distant. Cette dernière est donnée dans le fichier texte issu du téléchargement et de la décompression. Ensuite, nous initialisons (Set) l'
objet requeteHttp pour
instancier la classe permettant de réaliser ces
demandes distantes, grâce à la
fonction VBA CreateObject. Dès lors, nous exploitons sa
méthode héritée Open pour fournir l'URL. Puis, nous envoyons la demande de réception par le biais de sa
méthode Send.
La requête Http
Puisque la classe est désormais instanciée, sur la base de l'Url mémorisée, il est temps de réaliser la
demande http, ou plutôt de tester la réponse, pour récupérer le
fichier distant en local.
- A la suite du code, ajouter les instructions VBA suivantes :
...
DoEvents
If requeteHttp.Status = 200 Then
Else
MsgBox "Une erreur est survenue"
End If
...
Tout d'abord, nous exploitons la
commande DoEvents pour temporiser, suite à l'instanciation de la classe et à l'envoi de la demande, avant de tester la
réponse de la requête http. Grâce à la
propriété Status de la classe, nous sommes en mesure de vérifier (200) si la demande a bien été reçue et si elle a été jugée conforme. Dans ces conditions, nous prévoyons une branche (If) pour réceptionner les informations demandées. Le cas échéant (else), nous avortons le traitement et en informons l'utilisateur.
Télécharger le contenu distant
Si la demande a bien été reçue et autorisée, nous pouvons
charger le contenu distant en mémoire pour ensuite le sauvegarder sur le disque dur local. Pour cela, nous devons créer un
flux de lecture grâce à la
classe ADODB.Stream qu'il s'agit d'instancier.
- Dans la branche de l'instruction conditionnelle, ajouter les lignes VBA suivantes :
...
Set flux = CreateObject("ADODB.Stream")
flux.Open
flux.Type = 1
flux.Write requeteHttp.responseBody
flux.SaveToFile chemin, 2
flux.Close
...
Nous initialisons (Set) l'
objet flux sur la
classe ADODB.Stream. Nous ouvrons un
flux de lecture en mémoire grâce à sa
méthode héritée Open. Sa
propriété Type ainsi définie, indique que le fichier doit être traité en mode binaire, car il s'agit d'un fichier compressé. Ensuite, nous récupérons le corps de la requête http (responseBody), soit le
contenu du fichier distant. C'est alors que nous l'enregistrons physiquement sur le disque, grâce à la
méthode héritée SaveToFile à l'emplacement défini en amont (chemin) et avec écrasement autorisé (2). Enfin et naturellement, nous refermons le flux de lecture.
Détruire les objets
Avant de tester le code de téléchargement, nous devons détruire les objets qui ne sont plus utilisés pour libérer la mémoire de l'ordinateur.
- Après l'instruction conditionnelle, ajouter les deux lignes VBA suivantes :
...
Set requeteHttp = Nothing
Set flux = Nothing
...
Nous les réinitialisons (Set) simplement à Nothing.
- Enregistrer les modifications (CTRL + S) et basculer sur le formulaire (ALT + Tab),
- L'exécuter en enfonçant la touche F5 du clavier par exemple,
- Puis, cliquer sur le bouton de téléchargement,
A la première exécution, une erreur peut survenir car la demande http n'a pas le temps d'aboutir malgré la temporisation (DoEvents) que nous imposons. Nous avions constaté ce phénomène à l'occasion du développement de la
solution sur les numéros du loto en VBA Excel.
- Si l'erreur intervient, cliquer sur le bouton Fin de la boîte de dialogue,
- Puis, cliquer de nouveau sur le bouton de téléchargement,
Cette fois, aucune erreur n'est à déplorée. Mais rien ne se produit, en apparence en tous cas.
En effet, si vous ouvrez le dossier de l'application Access dans l'explorateur Windows, vous constatez la présence du
fichier distant qui a parfaitement été
téléchargé par notre
code VBA Access.