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 en VBA Excel
Dans l'optique de décortiquer les
fréquences de sortie des
numéros du loto et dans le but de dresser de potentielles
probabilités pour les
tirages suivants, nous proposons de monter une application en plusieurs étapes. Dans ce premier volet, il est question de
télécharger le
fichier compressé synthétisant tous les tirages. Ainsi dans les prochains volets, après
décompression automatisée, nous pourrons accéder à ce fichier pour
importer ses informations dans la feuille du classeur et mettre en place des méthodes d'analyse dans une séquence suivante.
Classeur Excel à télécharger
Nous proposons de débuter les travaux à partir d'un
classeur Excel offrant un
bouton d'importation et une grille destinée à la réception des numéros pour chaque tirage passé.
Comme vous le constatez, le classeur est accompagné d'un fichier texte. Ce dernier stocke l'Url du fichier à télécharger depuis le site de la française des jeux.
- Double cliquer sur le fichier du classeur pour l'ouvrir dans Excel,
- Puis, cliquer sur le bouton Activer la modification du bandeau de sécurité,
Nous découvrons une feuille accueillant une grille destinée à recevoir les
numéros des lotos à importer. De même, dans le coin supérieur droit, vous notez la présence d'un
bouton. C'est lui qui doit enclencher tout le processus, en commençant par le
téléchargement du fichier compressé archivant l'
historique de tous les tirages.
La procédure et ses variables
Nous devons commencer par créer la
procédure VBA associée
au clic sur le bouton de la feuille. Comme il s'agit d'un
contrôle ActiveX, le lien peut s'établir très simplement.
- En haut de la fenêtre Excel, cliquer sur l'onglet Développeur pour activer son ruban,
- Dans la section Contrôles du ruban, cliquer sur le bouton Mode Création,
- Sur la feuille dès lors, double cliquer sur le bouton intitulé Actualiser,
C'est ainsi que nous basculons dans l'
éditeur VBA Excel, entre les bornes de la
procédure événementielle actualiser_Click. Son
code VBA se déclenchera au clic de l'utilisateur sur ce
bouton de feuille.
- Dans les bornes de cette procédure, ajouter les déclarations de variables 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) pour stocker respectivement le chemin d'accès à l'application locale et l'Url du fichier à prélever sur le Web. Ensuite, nous déclarons
deux objets (As Object). Le premier doit
instancier la classe permettant d'émettre des
requêtes http. Le second doit
instancier la classe permettant d'accéder aux
flux stockés en mémoire. Il s'agira naturellement du fichier à réceptionner depuis le Web.
La demande Http
Pour réaliser un
téléchargement depuis une
Url précise, nous devons exécuter une
requête http. Pour cela, nous devons
instancier la classe permettant d'émettre ces
requêtes.
- A la suite du code, ajouter les instructions VBA suivantes :
...
chemin = ThisWorkbook.Path & "\tirages\loto.zip"
adresse = "https://media.fdj.fr/ ... /loto/loto_201911.zip"
Set requeteHttp = CreateObject("Microsoft.XMLHTTP")
requeteHttp.Open "GET", adresse
requeteHttp.send
...
Tout d'abord, grâce à la
propriété Path de l'
objet VBA Excel ThisWorkbook, nous pointons dans le
dossier de l'application, pour descendre dans le
sous dossier tirages, que vous devez créer. Puis, nous indiquons sous quel nom nous souhaitons récupérer le fichier compressé (loto.zip). Ensuite, nous stockons l'
Url du fichier à télécharger dans la
variable adresse. Rappelez-vous, vous pouvez récupérer cette adresse dans le fichier texte issu de la décompression. Il est à noter que cette Url peut varier dans le temps. Il s'agira alors d'aller la prélever directement depuis le site de la française des jeux pour la mettre à jour dans le programme. Ensuite, nous initialisons (Set) notre
objet requeteHttp. Grâce à la
fonction VBA CreateObject et à son
paramètre Microsoft.XMLHTTP, nous instancions la classe permettant d'émettre des
requêtes http. En d'autres termes, il s'agit de demandes distantes formulées sur le Web. Dès lors, nous exploitons la
méthode héritée Open pour demander d'obtenir le fichier situé à cette adresse. Puis, nous envoyons la demande avec la
méthode héritée Send.
Tester la réponse à la demande Http
Avant d'envisager de récolter le fichier distant, nous devons tester la réponse à notre
requête http retournée par le site. Et pour cela, notre
objet requeteHttp offre désormais la
propriété status.
...
If requeteHttp.Status = 200 Then
Else
MsgBox "Une erreur est survenue"
End If
...
Si la valeur 200 est retournée, cela signifie que la demande est bien reçue, qu'elle est jugée conforme et qu'elle est acceptée. Dans ce cas, nous pourrons poursuivre le traitement consistant à récupérer le fichier distant. Le cas échéant, nous en informons l'utilisateur pour qu'il puisse recommencer ultérieurement. Il arrive parfois, pour des raisons de sollicitations des sites, que les demandes ne puissent pas être traitées complètement.
Lire dans le flux
C'est désormais en
mémoire que nous devons accéder à ce fichier à télécharger. L'idée est de récolter toutes ses informations, de les consolider pour les sauvegarder sur le disque à l'emplacement indiqué par la
variable chemin.
- Dans la première branche de l'instruction conditionnelle, ajouter les lignes VBA suivantes :
...
Set flux = CreateObject("ADODB.Stream")
flux.Open
flux.Type = 1
flux.Write requeteHttp.responseBody
...
Tout d'abord, nous initialisons (Set) notre
objet flux en instanciant (CreateObject) la
classe ADODB.Stream pour accéder aux contenus hébergés temporairement en mémoire. Grâce à sa
méthode héritée Open, nous ouvrons l'un de ces flux pour accueillir les données. Avec la
propriété héritée Type réglée Ã
1, nous indiquons qu'il s'agit de
données binaires. En effet, le fichier est compressé. S'il s'était agi d'un banal fichier texte, nous lui aurions affectée la valeur 2. Puis, nous demandons de restituer (Méthode Write), le contenu émanant de la
requête http que nous avons formulée (requeteHttp.responseBody).
Sauvegarder le contenu téléchargé
Il ne nous reste plus qu'à finaliser. Et pour cela, nous devons simplement enregistrer sur le disque, les données hébergées en mémoire par ce flux que nous avons ouvert. Bien entendu, notre
objet ADODB.Stream offre une méthode tout à fait dédiée.
- Toujours dans la branche du If et à la suite du code, ajouter les deux lignes VBA suivantes :
...
flux.SaveToFile chemin, 2
flux.Close
...
La
méthode héritée SaveToFile de notre
objet flux permet d'enregistrer sur le disque, les données chargées en mémoire. Pour cela, nous lui passons deux paramètres. Il s'agit tout d'abord de l'
emplacement de la sauvegarde, déterminé par notre
variable chemin. Ensuite, la
valeur 2 passée en second argument indique d'
écraser le fichier s'il existe déjà . Ce mode est nécessaire dans la mesure où nous souhaitons récolter régulièrement les grilles du loto, mises à jour à raison de trois fois par semaine.
Décharger les objets de la mémoire
Il ne nous reste plus qu'à détruire les objets qui ne sont plus utilisés avant de tester le code de téléchargement.
- A la fin de la procédure, après l'instruction conditionnelle, ajouter les lignes VBA suivantes :
...
Set requeteHttp = Nothing
Set flux = Nothing
...
Ces réinitialisations permettent de sortir les objets de la mémoire.
- Enregistrer les modifications (CTRL + S) et revenir sur la feuille Excel (ALT + Tab),
- Dans le ruban Développeur, cliquer sur le bouton Mode création,
Ainsi, nous désactivons le mode conception.
- Dès lors, cliquer sur le bouton Actualiser,
Rien ne se produit en apparence et pourtant !
Mais si vous ouvrez le
sous dossier tirages à la racine du dossier de décompression, vous notez bien la présence d'un
fichier compressé nommé
loto.zip. Si vous décompressez ce dernier, que vous double cliquez sur le
fichier Csv résultant, vous obtenez bien toutes les grilles des lotos joués depuis des années. Quant à nous et à l'occasion du prochain volet, nous choisirons de maitriser cette importation pour ne conserver que certaines données à inscrire dans des cellules bien précises.