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! Et gratuitement…
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 img001.jpg, img002.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 but n'est vraiment pas de s'en servir pour faire des DDOS!
Sachez aussi que des sites internet se protègent de plus en plus contre le "web scrapping". Il est donc possible que l'approche que je vous propose ne fonctionne pas sur tous les sites internet…
Le code de la fonction VBA 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).
Mise à jour: 13/12/2021 – le code a été adapté pour fonctionner également sur la version 64-bits d'Office.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Private Declare PtrSafe 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 "France Télévision" 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.
N'oubliez pas que pour que le code qui suit fonctionne, vous devrez copier dans votre projet les deux codes VBA (l'exemple qui suit ET le code de la fonction plus haut).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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 = "https://www.france.tv/images/responsive/logos/channels/francetv-desktop.svg" ' <-- lien URL du fichier sur internet fichier_local = "C:\Temp\francetv-desktop.svg" ' <-- 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 |
Cet exemple est fait pour le téléchargement d'une image mais vous l'aurez compris, vous pouvez tout aussi bien télécharger un PDF, un fichier Excel ou encore un fichier texte…
Voici donc un exemple concret de la fréquente sous-estimation d'Excel en tant qu'outil. 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"…
Quelques remarques utiles
- 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…
- Il se peut que si le nom de fichier contient de caractères spéciaux (
espace
,'
,~
etc.) vous devriez d'abord assainir l'URL du fichier à télécharger. Vous pouvez facilement le faire grâce à la fonction VBAAssainirURL()
que je vous ai préparée… - Faites aussi attention au protocole utilisé par le site: une adresse web commençant par HTTP ne va pas nécessairement donner le même résultat que la même adresse avec HTTPS!
- Si vous n'arrivez pas à télécharger un fichier, vérifiez s'il ne se "cache pas" sur une page ou dans un dossier distant qui sont accessibles uniquement après une identification – cela peut parfois empêcher le script d'accéder au fichier.
Internet & Excel & fichiers: Pour aller plus loin
Tant que l'on est dans le thème de VBA et des fichiers, voici quelques articles qui pourraient vous intéresser:
- Manipulation basique des fichiers en VBA (pour copier, supprimer, déplacer ou renommer des fichiers avec VBA)
- Création des dossiers et sous-dossiers en VBA (si vous voulez classer les fichiers téléchargés selon un système)
- Supprimer un dossier en VBA
- Obtenir code source HTML d’une page web (pour en extraire les liens vers des fichiers à télécharger par exemple)
- Tout sur l'utilisation de Excel en ligne
Et pour finir, quelques autres articles pratiques:
- Toutes les fonctions VBA – liste complète des fonctions disponibles en VBA
- Comment utiliser la fonction RECHERCHEV en VBA (tutoriel)
- Protéger votre code VBA par un mot de passe
- Suivre l'activité de l'utilisateur (LOG)
87 commentaires sur “VBA: télécharger fichier de l’Internet”
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
Merci pour votre commentaire. Je suis content que cela vous ait aidé.
Cordialement, Martin
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,
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
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,
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
Pouvez vous m'aider à insérer ce code de manière à ce que cela fonctionne svp ?
Je suis novice^^
Merci d'avance.
Alex
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
Bonjour,
Impeccable merci beaucoup 🙂
avec plaisir…
Grand merci !
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
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.
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 :-))
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
un immense MERCI!
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
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
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
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
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
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 ^^
Bonjour Beneroz,
merci pour votre commentaire.
Ce code-ci a besoin de l'url exact du fichier – donc il ne fera pas tout seul ce dont vous avez besoin.
Ce que vous pouvez faire, c'est de télécharger le code source de la page en question et en extraire l'URL du fichier dont vous avez besoin.
Voici le code VBA pour télécharger le code html d'une page web
et ici le code VBA pour extraire une chaîne de caractères (donc le url du fichier)
J'espère que cela va vous aider.
Bien à vous, Martin
Merci pour les liens!
On va essayer quelques trucs, si je trouve quelque chose de valide et pas trop compliqué, je le partagerai ici ^^
Bonne journée,
Cordialement
Mon vocabulaire est pauvre pour vous exprimer mon respect, Autant de merci pour vous #Martin pour votre aide,
Merci beaucoup pour ce message.
Je suis content de savoir que j'ai pu vous aider.
Bien à vous, Martin Hudec
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
Bonjour,
cela utilise la librairie
Urlmon
.Il se peut qu'à l'interne, cette librairie utilise IE mais allez savoir ce qui se cache sous le capot 🙂
Plus d'infos sur cette fonction (
URLDownloadToFile
) / librairie (Urlmon.lib
) ici:https://msdn.microsoft.com/fr-fr/library/ms775123(v=vs.85).aspx
J'espère que cela vous aide. Bien à vous, Martin
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.
Excellente astuce, mais ça ne marche pas avec Environ("TEMP") à la place de "c:\temp"
Pourquoi ?
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 ?
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…
Bonjour Jean-Marc,
c'est exactement cela! Ravi que vous ayez trouvé par vous même…
M.
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
Oui c'est cela j'avais oublié le backslash 🙂
Bonnes fêtes !
Cordialement
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
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
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
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 "
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
Bonne chance! 😉
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
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
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
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:
(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
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.
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
Bonjour,
Merci pour votre réponse.
J'ouvre mes archive avec 7zip.
Vous entendez quoi par nuance de l'exentention??
cdt
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
Bonjour,
merci pour votre réponse.
Alors pour ma part j'utilise un ordi perso.
Les deux fichier sont identique, je vous laisse l'adresse pour tester si vous voulez ( le zip contient des modules vide )
http://www.donpepe.hebergratuit.net/Maj/GS/GS-1.zip
Il y a peu être une référence à activer dans excel ??
cdt
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
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 😉
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
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é
Bonjour Pépé,
Oui, c'est (bien sûr 😉 ) possible… Et comme j'ai trouvé votre question pertinente et probablement utile aux autres, j'en ai fait un post à part.
Vous le trouverez ici: VBA: vérifier si fichier sur internet existe / si URL existe
J'espère que cela répond à votre question. Normalement oui 😉
Bàv, Martin
Bonjour,
Oui cela me convient parfaitement. merci a vous.
cdt Pépé
Bonjour et un grand MERCI de mettre gratuitement à disposition ces renseignements.
J'utilise VBA et Excel pour télécharger depuis la fin des années 90.
Ma config actuelle est Windows XP SP 3 et Excel 2000 (en vieillissant je deviens hermétique au changement)
Je rencontre actuellement un problème semblable à celui décrit plus haut par vandenabeele :
J'ai pris l'exemple donné ci dessus: télécharger une image d'Internet
J'ai bien un message de téléchargement réussi mais lorsque j'ouvre le fichier de destination, aucun élément n'a été enregistré…
J'ai choisi l'image conseillée après m'être assuré que l'adresse était toujours valide et j'ai modifié ainsi les deux lignes
fichier_internet = "https://excel-malin.com/wp-content/uploads/2016/04/Calendrier_2018_France_horizontal.png" ' <– lien URL https ne marche pas
fichier_local = "C:\temp\cal.png" ' <– destination locale créée à l'occasion
J'ai créé le répertoire C:\temp\
J'ai exécuté la macro
MsgBox m'affiche "Le téléchargement a réussi…"… et il n'y a rien dans C:\temp\
Pas de problème, j'applique le remède essayé maintes fois en 2019 : je change "https" en "http"
la ligne URL devient
fichier_internet = "https://excel-malin.com/wp-content/uploads/2016/04/Calendrier_2018_France_horizontal.png" ' <– lien URL http marche bien… sur ce site
et j'obtiens bien mon image de calendrier prise sur ce site
Eh oui : " Sur ce site"
Et le nombre de sites où cela fonctionne se réduit rapidement.
D'où ma question
Auriez vous un morceau de code qui permette de télécharger du https
Par avance merci
Cyber-PAPY
Bonjour Cyber-PAPY,
pourriez-vous essayer le code qui suit?
Il faut juste modifier le dossier de destination…
Pouvez-vous me dire si cela résoud votre problème?
Si oui, je modifierai le code principale sur la page.
Si non, pourriez-vous me donner un exemple de URL qui ne marche pas? Merci.
Cordialement, Martin
Bonjour Martin et bravo pour la réactivité.
J'ai donc chargé la nouvelle version qui , sans surprise, fonctionne bien sur le calendrier
J'ai immédiatement essayé sur d'autres sites. Là c'est moins efficace: presque aucun ne répond.
Pour essayer de quantifier, j'ai cherché des images sur des sites en "Https" avec Google image
J'ai vérifié que l'image était toujours disponible avec comme navigateur Firefox
J'en ai sélectionné une cinquantaine.
Ensuite j'ai éliminé les doublons, les url d'image risquant de changer etc….
Trente furent retenues plus celle du calendrier .
La performance est peu brillante : six sur 30 avec la Sub TelechargerFichierNouvelleVersion() plus le calendrier
J'ai fait la même recherche avec l'ancienne, il n'y en avait que 7
J'utilise depuis des décennies ceci
—————————————
n°1
Private Declare Function URLDownloadToFile 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
————————————–
Cette année je suis passé à ceci
———————
n°2 uboo sommaire
Public Function TelechargerFichierInternet(SourceUrl As String, FichierLocal As String) As Boolean
TelechargerFichierInternet = TelechargerFichierURL(0&, SourceUrl, FichierLocal, BINDF_GETNEWESTVERSION, 0&) = ERROR_SUCCESS
End Function
———————
les URL sont les suivantes
D'abord celles qui sont lues par ordre décroissant
Les trois premières sont reconnues par les quatre fonctions
https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcTqNCTWyp5k6LDHHiFtIYv-0ty0Hf9LwBL2DY5eqLFJ-X1rOSTT
https://images.myhentaigrid.com/imagesmanga/images/The%20One%20I%20Love%202/thumbnail/001.jpg?19
https://static.tvtropes.org/pmwiki/pub/images/cp_fwb_mmch_20120926.jpg
puis par 3
https://www.8muses.com/image/fm/nxSCk+eOabMGI9PbixAMwioY-rSakDvydda1kS6mRsY9afBu72v5ifs8wEz2WZIt57XzlwWIR3-XMAzxeCLA1TRifue2QRcbzsKGTcfpsV-qSH-Gf8bq741TEnzX+-3r.jpg
https://excel-malin.com/wp-content/uploads/2016/04/Calendrier_2018_France_horizontal.png
https://static-s.aa-cdn.net/img/amazon/30600000488381/9adf30277e5e03b426281c43787b7694
https://martincomicsreview.files.wordpress.com/2019/07/new-teen-titans-tome-1.jpg?w=385
https://static.cnews.fr/sites/default/files/2019_redaction/joker_5d94e78d180c4.jpg
https://villa-rosemaine.com/sites/default/files/styles/1000/public/affiche_rentree_2019_40x60_15072019.jpg?itok=-VUNcqSN
puis celles qui ne sont jamais lues par aucune des quatre
https://arkham46.developpez.com/articles/office/officeweb/images/logoofficeweb.jpg
https://cdn140.picsart.com/299384276045211.png
https://dynaimage.cdn.cnn.com/cnn/w_768,h_1024,c_scale/https%3A%2F%2Fdynaimage.cdn.cnn.com%2Fcnn%2Fx_238%2Cy_0%2Cw_269%2Ch_359%2Cc_crop%2Fhttps%253A%252F%252Fstamp.static.cnn.io%252F5bef389f4db3d70020c01c63%252F171115164148-01-mickey-mouse-story-top.jpg
https://fr.zizki.com/ifr/comics/didier-convard-alexis-chabert/f601691132.jpg
https://i.pinimg.com/originals/43/3b/2e/433b2e72c81e2a420d8b65b0899ce7a4.jpg
https://o.aolcdn.com/images/dims3/GLOB/crop/1264×711+0+0/resize/800×450!/format/jpg/quality/85/https://s.aolcdn.com/os/ab/_cms/2019/10/04115835/budweiser-electric-trucks.jpg
https://pbs.twimg.com/media/DgoEt3-WsAIJ29J.jpg
https://pitetpit.fr/wp-content/uploads/2017/09/bateau-navigue-2.png
https://plaisance-location-bateau-hyeres.com/wp-content/uploads/2016/03/IMG_1029-960×400.jpg
https://qttcoysrxysnqxubvwdh.hath.network:3333/h/481a3495b0e556eed0229d515aaa5acdb40926c3-244119-1280-1737-jpg/keystamp=1574604000-02defd7a1c;fileindex=74962347;xres=org/000_LAF_3.jpg
https://s.brsimg.com/content/media/cercle-des-economistes/cde_geoffron.png
https://sortiralons.fr/wp-content/uploads/2019/05/FB_IMG_1556982357012-724×1024.jpg
https://thumbor.forbes.com/thumbor/960×0/https%3A%2F%2Fblogs-images.forbes.com%2Fnargessbanks%2Ffiles%2F2018%2F09%2Flexus-ml-run-shot-2.jpg
https://www.alsace-en-famille.com/medias/Photos/visit/228002337/228002337_1.jpg
https://www.bateaux.com/src/applications/showroom/images/images-publications/38b6a2c8ce0e4210f3e4ff50bd33f37e.jpg
https://www.dhresource.com/0x0s/f2-albu-g10-M01-29-65-rBVaWVwEw5SAP-f4ABMPDIowU-g363.jpg/navire-libre-2019-femmes-de-la-mode-v-cou.jpg
https://www.eurosnumismate.com/1438-2805-large_default/mickey-et-ses-amis-10-euros-france-2018-colorisee-argent-be.jpg
https://www.jeu-concours.biz/content/img/bons-plans/jeu-auchan-fr-coursesdenoel-225.png
https://www.trackerboats.com/images/homepage/tracker-home-2020-pro-team-195-txw-te.jpg
https://www.urban-comics.com/wp-content/uploads/2013/04/flash_article_grand.jpg
https://x.fap.to/images/thumb/45/185/18570049.jpg
https://zarbalib.fr/wp-content/uploads/2018/12/parametres-IMAP_Gmail_2018_w.jpg
Bonjour
Je n'ai pas encore trouvé la macro qui marche
J'ai peut être une piste : Un ad on de Firefox qui s'appelle Downthemall
Par Excel, on génère un metafichier et on l'importe dans downthelall.
Cela semble bien fonctionner
On est encore loin de la souplesse du téléchargement direct par Excel
Si quelqu'un avait une idée …..
Bonjour Cyber PAPY,
me revoilà et j'ai une bonne nouvelle…
Voici un nouveau code avec lequel j'ai réussi à télécharger les images de votre liste que vous n'arriviez pas télécharger avec les autres méthodes…
Cordialement, Martin
Bonjour Martin
Merci de vous préoccuper de mon souci.
J'ai donc fait l'essai avec ce nouveau code sur les 30 fichiers cités plus haut.
Grosse déception seulement six images chargées. Les mêmes que précédemment.
J'utilise toujours Excel 2000 et Windows XP Service Pack 3
Quel système avez vous?
Cordialement
CP
Bonsoir,
je suis en Windows 10, Office 365…
Donc en effet, deux systèmes très différents… Cela explique peut-être pourquoi cela marche pour moi et malheureusement pas pour vous.
Peut-être si quelqu'un d'autre qui lis ces lignes pouvait tester à son tour…
Bàv, Martin
L'évolution des systèmes d'exploitation est effectivement mon souci.
Pour des raisons de compatibilité avec mes programmes professionnels développés personnellement je me dois de rester sur cette configuration.
Quoi qu'il en soit, merci de cette aide qui profitera peut être à d'autres .
A titre d'encouragement je vous invite à lire l'histoire de Martin Le Malin.
( Nom qui vous conviendrait d'ailleurs fort bien )
Elle est en ligne ici en 52 albums
http://www.martinlemalin.com/martinonline.html
Les images se téléchargent très bien par Excel , même chez moi.
Bien amicalement
Cyber-PAPY
Bonjour,
je viens de copier en début de module votre code, et malheureusement, le premier "Private Declare" est en rouge …
J'utilise Excel 365 et suis sous W10;
D'où peut provenir mon problème ?
Merci d'avance
Eric
Bonjour Eric,
cela pourrait être la différence entre la version 32 bit et 64 bit de Office.
Essayez de remplacer la première ligne du code:
Private Declare Function TelechargerFichierURL Lib "urlmon" _
par
Private Declare PtrSafe Function TelechargerFichierURL Lib "urlmon" _
Est-ce que cela marche?
Cordialement, Martin
Tip top avec la version 64 bits il faut déclarer comme ça autrement ça ne fonctionne pas (ajout de PtrSafe)
Private Declare PtrSafe Function TelechargerFichierURL Lib "urlmon" _
impossible avec cette methode de telecharger des fichiers de plus de 4Go
Bonjour Max,
je dois avouer que je n'ai jamais essayé de télécharger un fichier de 4 Go 🙂
Bonjour,
Ce code ne marche pas pour le premier fichier .csv à l'adresse suivante :
https://www.swissgrid.ch/dam/dataimport/prl-srl/2020-PRL-SRL-TRL-Ergebnis.csv
Auriez-vous une idée? Le fichier est bien téléchargé en local mais est vide.
Merci de votre retour.
Bonjour Thomas,
c'est bizarre. Je viens de l'essayer avec le même code et le fichier de +/- 15 Mo s'est bien téléchargé…
Si vous copiez le URL directement dans votre browser? Le fichier se télécharge?
Cordialement, Martin
Il est bien téléchargé, mais il est quasiment vide. Ce n'est pas le cas chez vous? Merci pour votre retour rapide.
Non, chez moi il a 15,8 Mo et il contient 156.428 lignes…
Bizarre…
Ah ok chez moi il n'y a qu'un fichier de 15.8 KB et que la première ligne remplie… Bizarre
Merci quand même
Bonjour,
Merci pour ce code.
Cependant, comment faire pour automatiser en VBA quand le fichier à télécharger apparait dans une prompt Box " Voulez-vous télécharger le fichier truc à partir de http://www..." svp?
car la je n'ai pas l'url du fichier et impossible de le trouver dans le DOM du site car en dehors de IE apparemment…
Merci par avance.
Cordialement
Bonjour,
Merci beaucoup pour votre code. Il fonctionne à merveille lorsque je travaille depuis la maison. En revanche cela ne fonctionne pas lorsque je travaille depuis le réseau de l'entreprise. Peut-être celle-ci limite la taille des fichiers téléchargés. Peut-on y ajouter des informations de proxy ou sécurité quelque part?
Fred
Un big gros MERCI pour toutes ces fonctions VBA.
Aucune erreur sous windows 64b – Excel 2016 64b.
Je télécharge des couvertures (cover) pour ma gestion de BD comics sous android.
☺
Un grand merci pour ce code si pratique !
Cependant j'ai un problème concernant le téléchargement d'un fichier. Lorsque je réutilise le lien de téléchargement de mon fichier quand je le fais de manière classique (clic gauche sur un bouton présent sur le site) celui ci ne fonctionne plus….
Quand j'essaye de le retélécharger, cette fois-ci j'ai un autre lien qui a été utilisé.
Ma question est donc, est il possible de demander à excel de cliquer sur un bouton sur une page web pour télécharger le fichier voulu ?
Merci d'avance et en vous souhaitant une bonne fin de journée !
Bonjour Théo,
pour "cliquer sur un bouton", c'est faisable mais c'est compliqué – il vaut passer par le VBA de Internet Explorer (ou maintenant de Edge)…
Sinon, vous pouvez aussi:
Donc ce n'est pas impossible. Uu peu fastidieux mais c'est jouable…
Cordialement, Martin
Bonjour
J'ai testé la macro mais ça ne fonctionne pas trop. Le fichier que je souhaite récupérer sur internet est téléchargeable après choix d'une liste déroulante.
Bonjour, pour que le code de cette page-ci fonctionne, il vous faut l'URL direct du fichier à télécharger.
S'il y a une liste déroulante, c'est que cela va probablement impliquer du javascript et là il vous faudrait un moyen de récupérer le URL pour pouvoir le télécharger ensuite avec VBA.
Bonjour et merci beaucoup d'avoir partagé cette méthode de télécharger des fichiers présents sur internet. Avez vous une astuce qui permettrait de télécharger un fichier sur internet mais dont on ne connait que le début du nom ?
Par exemple si je sais que sur une page il existe un et un seul fichier dont le nom commence par "Test_20211123" mais que je ne connais pas le nom complet (qui correspond en fait à l'heure / minute / seconde de l'extraction), y a-t-il une possibilité de trouver ce fichier et de le télécharger ? La fonction "Dir" ne semble pas fonctionner sur les liens url….
Par avance merci de votre aide
Bonjour,
en effet, Dir ne fonctionne pas avec des emplacements sur un serveur.
Mais ce que vous demandez est tout de même possible – même si un peu fastidieux…
J'espère que cela va vous aider…
Cordialement, Martin
Merci beaucoup car la procédure marche bien quand le nom du fichier est dans le début du code HTML de la page. Par contre j'ai une erreur qui m'est remontée "Incompatibilité de type" quand je recherche un nom de fichier qui est plutôt sur la fin du code HTML. Savez vous si c'est dû à une limite en nombre de caractères que peut accepter la fonction "ExtraireChaineDelimitée" ? Si oui, avez vous une idée de comment je pourrai contourner le pb ?
Par avance merci pour votre aide
Bon, finalement je ne sais pas ce qui bloquait. L'erreur ne venait pas de la longueur du champ mais, dans certains cas uniquement, de la limite de fin que je paramétrais. J'ai contourné l'erreur car je connaissais le nombre de caractères recherchés avec un simple left().
Merci beaucoup en tout cas ces fonctions sont très utiles !
Content d'entendre que vous avez pu résoudre votre problème et que mon aide ait été utile!
Bonjour
J'ai testé votre macro qui marche très bien
Je télécharge des fichiers pdf et jpg mais le problème c'est que je n'arrive pas à ouvrir les fichiers
J'ai remarqué que la taille du fichier n'est pas la même quand je charge manuellement et j'utilise la macro
Je vous mets un lien pour essayer
https://www.helloasso.com/associations/les-pieds-mobiles/adhesions/inscription-2023-2024/carte-adherent?cardId=65433531&ag=65433531
Cordialement