VBA: télécharger fichier de l’Internet 55


Tout le monde a probablement déjà eu besoin de télécharger un ou plusieurs fichiers d'internet – des images, des vidéos, des PDF,… Mais peu de gens savent qu'il est possible de télécharger simplement un fichier avec Excel – en utilisant une fonction VBA.

Vous n'avez donc même pas besoin d'installer (ou même acheter) un logiciel de téléchargement. Excel fera l'affaire!

Télécharger des fichiers d'internet avec VBA

La fonction VBA suivante permet de télécharger un fichier (peu importe son type) à partir de l'internet. Vous n'avez besoin que du lien (URL) du fichier et de son emplacement.

En combinaison avec une boucle, cette procédure devient très puissante pour un téléchargement en masse des photos, documents, vidéos etc. car cette méthode est très rapide et ne requière pas d'interaction de l'utilisateur. Elle est donc idéale pour être automatisée.

Astuce: si les liens URL des fichiers en ligne ont une structure logique (par exemple A001.jpg, A0002.jpg,…) ou si vous disposez de la liste des liens, il vous suffit de créer une logique pour attribuer un nom à utiliser pour la copie, une boucle et vous pouvez télécharger des dizaines de fichiers par minute! À utiliser avec modération.

Le code de la fonction qui télécharge des fichiers

Voici donc le code VBA de la fonction en question. Comme le code contient une déclaration ( Declare ), le code doit se trouver au début du Module qui contient le code VBA. Si ce n'est pas le cas, vous aurez droit à un message d'erreur de la par de l'éditeur VBA. La fonction utilise donc deux arguments de type String: SourceUrl (contenant l'URL du fichier distant) et FichierLocal (contenant le nom et l'emplacement de la copie).

Private Declare Function TelechargerFichierURL Lib "urlmon" _
Alias "URLDownloadToFileA" _
(ByVal pCaller As Long, _
ByVal szURL As String, _
ByVal szFileName As String, _
ByVal dwReserved As Long, _
ByVal lpfnCB As Long) As Long

Private Const ERROR_SUCCESS As Long = 0
Private Const BINDF_GETNEWESTVERSION As Long = &H10

Public Function TelechargerFichierInternet(SourceUrl As String, FichierLocal As String) As Boolean
TelechargerFichierInternet = TelechargerFichierURL(0&, SourceUrl, FichierLocal, BINDF_GETNEWESTVERSION, 0&) = ERROR_SUCCESS
End Function

 

Exemple: télécharger une image d'Internet

La procédure VBA qui suit montre comment utiliser la fonction de téléchargement TelechargerFichiersURL. Tant que l'on y est, autant prendre un cas réel! Disons que l'on veut télécharger le logo de la chaîne France 2 et le sauvegarder Dans le dossier MesImagesDuNet sur le disque C:\. Rien de plus simple!

Il vous suffit l'URL de l'image et l'emplacement (chemin + nom du fichier) où vous voulez sauvegarder le fichier et le tour est joué. Aucune boîte de dialogue ne s'ouvre: dans cet exemple, le nom et le chemin à utiliser pour sauvegarder le fichier sont utilisés comme le second paramètre de la fonction.

Sub ExempleTelechargementInternet()
'par: Excel-Malin.com ( https://excel-malin.com )
On Error GoTo ExempleErreur

Dim fichier_internet As String
Dim fichier_local As String
fichier_internet = "http://static.francetv.fr/arches/france2/default/img/logo_france2.png" ' <-- lien URL du fichier sur internet
fichier_local = "C:\Temp\LogoFrance2.png" ' <-- destination locale (disque dur local, externe, clé usb,...)

Call TelechargerFichierInternet(fichier_internet, fichier_local)

MsgBox "Le téléchargement a réussi..."
Exit Sub

ExempleErreur:
MsgBox "Une erreur s'est produite..."
End Sub

Voici donc un exemple concret de la fréquente sous-estimation d'Excel. Qui aurait cru pouvoir utiliser Excel pour télécharger des fichiers sur Internet? Et pourtant… VBA vous donne à disposition de nombreuses possibilités qui dépassent largement l'idée que le public se fait d'un "tableur"…

Remarque utile

Si vous comptez utiliser cette fonction plus souvent, il vous serait probablement utile de vérifier d'abord si le fichier en question se trouve vraiment sur internet. C'est possible et vous trouverez le code VBA, les explications et les exemples dans cet article: VBA: vérifier si fichier sur internet existe / si URL existe Il vous permettra également de tester la validité des adresses internet…

Pour aller plus loin en Excel

Tant que l'on est dans le thème de VBA et des fichiers, voici quelques articles qui pourraient vous intéresser

 

 

50 0




Laissez un commentaire

Votre adresse de messagerie ne sera pas publiée.

55 commentaires sur “VBA: télécharger fichier de l’Internet

  • Bruno G

    Un simple merci pour ce code.
    Que de temps vous m'avez fait gagner.
    J'ai pu faire une boucle pour télécharger en un seul clic une centaine de fichiers.

    Bon été à vous

    Bruno

  • Calimero

    bonjour,
    Je n'y connais rien en VBA mais je suis un ancien du DOS et du BASIC donc autant ne pas parler de mon âge 😉
    Quand je fais un copier-coller de l'exemple, j'ai le message "erreur de compilation Sub ou Function non définie".
    J'ai un gros catalogue de fichiers avec des URL pointant sur des images et cette astuce m'aiderait beaucoup.
    Cordialement,

    • excel-malin.com Auteur du billet

      Bonjour Calimero.
      Sur cette page, vous trouverez le code de la fonction VBA pour télécharger le fichier (le premier code sur la page) et l'exemple (deuxième code VBA de la page) qui utilise cette fonction (= le premier code).

      Vous devez donc copier/coller LES DEUX codes qui se trouvent sur cette page. En fait, l'exemple est juste une illustration comment utiliser la fonction – vous devez donc avoir copié la fonction dans votre macro avant de pouvoir utiliser l'exemple…

      J'espère que cela résout votre problème. Bonne chance avec les téléchargements.
      Bien à vous, Martin

      • Calimero

        Bonjour,
        Merci pour cette réponse rapide. En effet, ça fonctionne. Le problème est que c'est sur un site sécurisé dont j'ai les codes. Je peux afficher et enregistrer les images une par une quand je vais sur le site en faisant un simple clic droit, enregistrer l'image etc… Voilà ce que je voudrais faire : J'ai une société et un commercial qui se promène avec des tonnes de catalogues. J'ai donc récupéré par le biais de mes fournisseurs leur catalogue sous format excel. Nous sommes dans une région où la 3g est loin d'être partout, je voulais donc faire un catalogue d'images pour mon commercial pour qu'il puisse tout avoir sur son portable : références, caractéristiques et images…
        Si vous connaissez une solution
        Cordialement,

        • excel-malin.com Auteur du billet

          Bonjour.
          Avez vous essayé de d'abord lancer Internet Explorer, se connecter sur le site avec le login et le mot de passe et une fois que vous êtes bien connecté, lancer la macro?

          Sinon, il y a une autre méthode mais c'est nettement plus compliqué: il faut utiliser VBA pour ouvrir une session de IE, aller sur la page, remplir le formulaire de connection, lancer la connection et ensuite télécharger les fichiers. Mais c'est un code particulier pour chaque cas spécifique. Voyez par exemple ici (commentaire n°6 de "Norie").

          J'espère que cela vous aidera…
          Bien à vous, Martin

    • excel-malin.com Auteur du billet

      Bonjour Alex,
      vous devez copier/coller le code sur cette page dans un "Module" dans l'éditeur VBA. Ce serait un peu longue pour tout expliquer ici et comme le tutoriel général sur le VBA sur lequel je travaille pour le moment n'est pas encore fini, je vous ai préparé un fichier où il vous suffit d'écrire l'URL du fichier et la destination et de cliquer sur un bouton pour effectuer le téléchargement.

      Si vous voulez voir le code et comment il est utilisé, vous devez aller dans l'éditeur VBA (pour y accéder, appuyez Alt + F11 quand vous êtes dans le fichier Excel).
      Le fichier se trouve ici: exemple_telechargement_internet.xlsm

      J'espère que cela va vous aider. Cordialement, Martin

      • vandenabeele

        Bonjour,
        J'ai essayé votre code/fichier.
        J'ai bien un message de téléchargement réussi mais lorsque j'ouvre le ficheir de destination, aucun élément n'a été enregistré…
        Pouvez-vous m'aider?
        merci beaucoup pour votre aide

        • excel-malin.com Auteur du billet

          Bonjour,
          c'est difficile d'estimer à distance ce qui ne marche pas. Si vous essayez le fichier que j'ai préparé dans un des commentaires pour Alex:
          1) essayez de télécharger différents fichiers (par exemple: https://excel-malin.com/wp-content/uploads/2016/04/Calendrier_2018_France_horizontal.png mais aussi d'autres sites)
          2) essayez de les sauvegarder dans différents dossiers

          Vu que le code fonctionne pour presque tous les utilisateurs, je crois que ce sera lié à votre machine:
          * avez-vous les droits nécessaires pour écrire dans le dossier en question?
          * vous essayez de le sauvegarder sur un disque local ou sur le réseau?
          * …

          Si vous ne trouvez vraiment pas, contactez-moi sur contact@excel-malin.com avec les infos sur votre système, le(s) fichier(s) que vous voulez télécharger et les dossiers où vous voulez les sauvegarder – et je regarderai ce que je peux faire.

        • jike

          Merci pour votre réponse.
          Cela fonctionne au niveau de l'identification. Le code que je souhaite doit ouvrir le lien internet qui est dans la colonne "I2", télécharger le fichier et le stocké dans le lien qui se trouve dans la colonne "M2".

          Donc à la place de mettre l'adresse direct du fichier je l'ai modifié comme cela :

          fichier_internet = Range("I2").Value
          fichier_local = Range("M2").Value

          Comment créer une boucle pour lire toute la colonne (télécharger I3 et stocker à l’emplacement M3; télécharger i4 et stocker à l'emplacement M4;…).

          Merci d'avance pour votre aide;

          J. (novice en vba :-))

          • excel-malin.com Auteur du billet

            Bonjour Jike,
            ceci devrait faire l'affaire:


            Sub BoucleTelechargement()
            For LigneDeLien = 2 To Range("I" & Rows.Count).End(xlUp).Row
            fichier_internet = Range("I" & LigneDeLien).Value
            fichier_local = Range("M" & LigneDeLien).Value

            Call TelechargerFichierInternet(fichier_internet, fichier_local)

            Next LigneDeLien
            End Sub

    • Chris

      Bonjour, je ne dois vraiment pas être doué !! j'essaie en vain le code je n'y arrive pas. Je m'explique j'ai 5111 url (photos de mon grossistes) que je voudrais ouvrir en une seule fois et enregistrer. mais je galère terriblement, si l'on pouvait m'apporter une aide ce serait des plus sympathiques
      Bien a vous

      • excel-malin.com Auteur du billet

        Bonjour Chris,
        je vous ai fait un petit outil pour voir si cela fonctionne.
        Vous pouvez le télécharger ici

        Il suffit de remplacer les valeurs exemples par vos valeurs (le dossier où les fichiers doivent être stockés & la liste des URL). Vous cliquez sur le bouton et le tour est (devrait être) joué.
        Attention, s'il y a des images qui ont le même nom, il vont se "surécrire". Si c'est le cas, faites moi signe et je verrai ce que je peux faire.

        PS: le code VBA est déverrouillé donc vous pouvez y jeter un coup d'œil.
        Cordialement, Martin

  • Lucien

    Bonjour,

    Tout d'abord merci pour votre code, cela fonctionnait parfaitement !

    "Fonctionnait" car en effet, la semaine dernière je m'en suis servi à merveille mais voilà qu'en ce début de semaine cela ne fonctionne plus, j'ai bien le message "Le téléchargement a réussi" mais aucun fichier n'a en fait été téléchargé.

    Le contexte est que j'ai besoin de mettre à jour un effectif de personnel avec le planning disponible sur l'extranet de mon entreprise, j'allais donc chercher le planning avec votre code et je pouvais ensuite l'ouvrir directement dans excel. Mais depuis aujourd'hui cela ne fonctionne plus, en tout cas sur le réseau entreprise, lorsque j'utilise ma connexion de données personnelle aucun problème.

    Est-il donc possible que le service informatique ait-pu bloquer certaines fonctions de VBA ?

    Merci par avance,

    Lucien

    • excel-malin.com Auteur du billet

      Bonjour Lucien,
      d'après ce que vous dites, c'est presque certain que c'est votre service IT qui a bloqué cette fonctionnalité.
      Surtout si le code fonctionne toujours comme il faut sur votre connexion privée…

      Il est possible qu'il aient décelé une activité inhabituelle et l'ont bloqué – en tout cas, c'est ainsi que fonctionne des services informatiques des (grandes) entreprises.

      Il est toujours possible, surtout que cela n'a commencé qu'aujourd'hui, qu'il s'agit simplement d'un problème de connexion de votre réseau d'entreprise. À votre place, j'essaierait encore par ex. demain pour être sûr que le "problème" persiste.

      Bien à vous,
      Martin

      • Lucien

        D'accord merci, je ne pensais pas que l'on pouvait bloquer indépendamment de telles choses. Je réessayerais quand même demain mais j'ai peu d'espoir.

        Lucien

  • Beneroz

    Bonjour,
    je trouve cette fonction super intéressante et elle m'a beaucoup dépanné dans mes projets.

    Cependant je voulais savoir si en vba il était possible d'utiliser le même système pour télécharger un fichier dont on ne connait pas le type (.pnj ou .bmp) et le nom à l'avance mais juste en possédant un lien Url de type : http://www.bidule/dossier/?id=558

    Bien cordialement ^^

  • Chticurieux

    Bonjour
    Astucieux, mais …. N'y a-t-il pas utilisation en sous-main d'IE ??? Et dans ce cas risque de récupérer une ancienne version toujours dans son cache ( malgré la valeur de BINDF_GETNEWESTVERSION As Long = &H10) ???
    C'est ce qui m'est arrivé. J'ai vidé le cache et c'est redevenu la bonne dernière version.
    merci

      • Chticurieux

        Bonjour,
        J'ai essayé plusieurs fois ; à chaque, le cache IE ( vidé) se remplit. Ce n'est pas le premier que je remarque utiliser IE, en espérant qu'il y soit !! (ou qu'on ne l' pas démonté, auquel cas … ???) Mais en tout cas, merci d'avoir mis cette fonction en évidence.

    • Jean-Marc

      Autre remarque : il n'y a pas de message d'erreur lorsque le fichier distant n'est pas trouvé. Comment faire pour qu'il y en ait un ?

      • Jean-Marc

        J'ai trouvé tout seul : il suffit de tester la valeur de retour de la fonction ! Si c'est true le fichier a été trouvé, sinon c'est false.
        Avec un if then on peut donc afficher un msg d'erreur…

    • excel-malin.com Auteur du billet

      Bonjour Jean-Marc,
      c'est bizarre, pour moi cela fonctionne (je suis sous Win 10)…
      Vous n'oubliez pas d'ajouter le "backslash" entre le dossier temporaire et le nom du fichier?
      Par exemple: fichier_local = Environ("temp") & "\LogoFrance2.png"

      Bien à vous, Martin

  • Axurit

    Bonjour,

    Déjà je vous remercie pour ce petit code qui m'as bien aidé.
    Je voudrais savoir si c'est possible de le modifier afin de télécharger tous les fichiers se trouvant dans une url.
    Petit exemple ?
    http://www.toto.fr/images/dossier1/ et là télécharger 1.png, 2.png, 3.png ect…

    Je sais pas si c'est vraiment claire et si c'est possible.

    Dans l'attente de vous lire
    Cdt

    • excel-malin.com Auteur du billet

      Bonjour,
      il y a deux cas de figure.
      1) c'est exactement comme dans votre exemple et les noms des fichiers (images) ont une structure logique (connu ou pouvant être devinée). Dans ce cas, c'est facile – il suffit d'ajouter une boucle (j'ajoute le code plus bas)
      2) vous ne connaissez pas les noms de fichiers – là, cela devient plus complexe car d'abord, vous devez télécharger le code HTML de la page, ensuite l'analyser et le parser pour en extraire les noms de fichiers. C'est faisable mais cela peut être fastidieux à mettre au point. Mais cela marche comme je l'utilise moi même 😉

      Si vous êtes dans le cas 1), voici le code qui devrait faire l'affaire. Il suffit de modifier le numéro de la dernière image ( For x = 1 To "votre chiffre" )

      Le code entier (vous aurez toujours besoin du code de la fonction TelechargerFichierInternet en plus)


      Sub ExempleTelechargementInternet()
      'par: Excel-Malin.com ( https://excel-malin.com )
      On Error GoTo ExempleErreur

      Dim URLpage As String
      Dim DossierLocal As String
      Dim x As Integer

      URLpage = "http://www.toto.fr/images/dossier1/"
      DossierLocal = "C:\Temp\"

      For x = 1 To 50
      NomFichier = x & ".png"
      Call TelechargerFichierInternet(URLpage & NomFichier, DossierLocal & NomFichier)
      Next x

      MsgBox "Le téléchargement a réussi…"
      Exit Sub

      ExempleErreur:
      MsgBox "Une erreur s'est produite…"
      End Sub


      J'espère que cela vous aide. Bien à vous, Martin

      • Axurit

        Bonjour,

        Je suis admiratif d'une tel réactivité.
        Oui en effet cela m'avance pour les site dont je connais le nom des fichiers, néanmoins vous avez piqué mon attention de bidouilleur 🙂
        On peux récupérer le code avec html de la page avec Excel et ensuite faire un tri ? (cette outils m’étonnera toujours)

        Encore merci,
        Cordialement

        • excel-malin.com Auteur du billet

          Je n'ai pas toujours l'occasion d'être aussi réactif vous savez… 🙂
          Pour votre question: oui, c'est tout à fait possible! En effet, Excel peut faire beaucoup plus que ce que 95% des utilisateurs imaginent…

          Pour vous guider:
          1) voici comment télécharger le code html d'une page internet
          2) voici comment extraire une partie du texte en particulier
          –> il vous faudra utiliser une boucle pour retrouver toutes les images mentionnées dans le code HTML
          –> il vous faudra trouver les bonnes "balises" qui délimitent les noms de fichiers. Pour commencer, je pencherais vers "

          • Axurit

            merci beaucoup pour votre aide, en faite les images n’étaient que des exemples, mais je pense pouvoir me débrouiller.
            Je vous tiendrais informé.

            Bonne journée

          • Axurit

            A que coucou, c'est encore moi !!

            Je suis a l'étape 2, j'ai réussis à extraire le code html, cependant, je ne vois pas comment extraire plusieurs nom de fichier.
            j'ai trouvé les balises et ça me donne: fichier1
            cependant j'ai que le fichier1 qui ressort, je pense devoir lui dire que si: fichier 2 = fichier1 alors chercher plus loin, mais je vois pas comment lui dire de continuer dans la chaîne de caractère.
            Je veux bien un petit peu d'aide encore :D.

            Cordialement

          • Axurit

            Bonjour,

            Bon j'ai essayé pas mal de chose mais je ne vois vraiment pas comment poursuivre dans la chaîne de caractères.
            Je vais devoir attendre votre aide.

            Dans l'attente de vous lire.

            Cdt

          • Axurit

            yaaaattaaaaa !!!

            Bonjour,
            Apres des heures infructueuse je suis passe sur autre chose avec succes.
            Je m'explique, vu que j'avais mais balises, j'ai remplace celle ci par un caractere special. J'ai ensuite splitter en fonction de celui-ci et j'ai pu recupere tous mes fichier un recuperant un resultat sur deux du split.
            Si sa t'interresse je peux m'etre le code.

            Encore merci pour tous et a bientot.
            Cdt

          • excel-malin.com Auteur du billet

            Bonjour Axurit,
            Super! Je suis content que vous ayez trouvé la solution. Une solution bien pragmatique. Ceci est une grande force de Excel et de VBA. A la fin, on arrive presque toujour à obtenir ce que l'on veut… (Sinon, désolé, je n'étais pas disponible ce w-e.)

            Moi, j'utilise une boucle Do While ... Loop – dans le code HTML de la page, je trouve la première balise IMG. Une fois le nom de fichier extrait, la boucle continue jusqu'à ce qu'elle ne trouve plus de balise "IMG"…

            Exemple:

            
            MonCodeHTML = "... ceci est le code html de la page..."
            Do While InStr(LCase(MonCodeHTML), " 0
                 '...ici est l'extraction
            
                 ' on enlève la partie du code HTML déjà traitée
                 MonCodeHTML = Right(MonCodeHTML, Len(MonCodeHTML) - InStr(LCase(MonCodeHTML), "
            (code pas testé)
            
            Ainsi, le code cherche des images dans la partie restante du code HTML. Une fois qu'il ne trouve plus de balise IMG, la boucle se termine.
            
            Pour ton code, tu peux toujours le poster (mais s'il contient des balises HTML, il ne s'affichera peut-être pas correctement. Sinon, tu peux me l'envoyer à contact@excel-malin.com et je le posterai dans le bon format.
            
            Bien à toi et à bientôt, Martin
  • Don pépé

    bonjour,
    votre function fonctionne très bien hors-mis pour télécharger des fichier zip
    Le problème est qu'il télécharge bien mais le fichier est endommager donc pas utilisable.
    j'ai essayer de passer directement par mon navigateur sans excel et le fichier est correct.
    Pourriez-vous m'aider à la faire fonctionner pour télécharger un .zip svp.

    • AXuRiT

      Bonjour,

      C'est étonnant car je m'en sers aussi pour télécharger des fichiers au format zip (enfin .tar.bz2).
      Cela fonctionne parfaitement, peut etre la nuance de l'exentention.

      Avec quel logiciel l'ouvrez vous ?

      Cdt

      • Don pépé

        Bonjour,
        Merci pour votre réponse.
        J'ouvre mes archive avec 7zip.
        Vous entendez quoi par nuance de l'exentention??

        cdt

    • excel-malin.com Auteur du billet

      Bonjour,
      juste pour info, vous rencontrez ce problème sur votre ordi personnel ou sur votre lieu de travail?

      Car dans les entreprises, les départements IT instaurent des règles pour leur pare-feu pour protéger le réseau. Et votre action présente deux risques: 1° = automation & 2° = fichier ZIP en soi (qui peut contenir d'autres fichiers, potentiellement nuisibles). Donc cela ne m'étonnerait pas que cette manière de télécharger des fichiers zip soir interdite.

      Un deuxième point, vérifiez le suffixe du fichier – les deux fichiers (celui téléchargé "manuellement" et celui téléchargé via VBA) ont-ils le même suffixe?

      Bàv, Martin

        • AXuRiT

          Bonjour,

          Je viens d'essayer et en effet le fichier n'est pas valide…
          Honnêtement je ne vois pas d'ou cela viens, car moi cela fonctionne. Essayez peut être avec un fichier .rar.
          Martin vous aidera surement plus que moi.

          Bonne chance.
          Cdt, Jérémy

          • Don pépé

            Re,
            Bon problème résolus sa venais de mon hébergeur.
            merci a vous deux d'avoir pris le temps pour essayer de régler mon problème.

            Au passage grand bravo pour le site 😉

          • excel-malin.com Auteur du billet

            Chouette…
            J'y avais justement pensé et je voulais faire le test ce soir – prendre votre fichier, l'uploader sur mon site et essayer le code VBA de téléchargement pour voir si le problème ne se situe pas au niveau du serveur distant… Finalement, vous avez été plus rapide 🙂

            Et merci pour vos compliments. Bien à vous, Martin

  • Don pépé

    Bonjour,
    Me revoilà 😉
    J'avais une petite question.
    Je voulais savoir si c'était possible de tester l'adresse avant de télécharger pour voir si le fichier que l'on désir télécharger existe vraiment.

    Cdt Pépé