Problème de téléchargement

néné06

XLDnaute Accro
Bonsoir à toutes et tous.

Je recherche à programmer en VBA un téléchargement automatique sur des sites internet deuis une feuille Excel.

Un exemple, je souhaiterai télécharger automatiquement sur le, site "Télécharger.com" le programme "CCleaner" qui apparait dans la page d'ouverture de ce site.
Pour cela j'ai tapé :
ThisWorkbook.FollowHyperlink "HTTP://www.01net.com/telecharger/ CCleaner".

Si je tape: ThisWorkbook.FollowHyperlink "HTTP://www.01net.com/telecharger/", cette instruction, depuis ma feuille excel , m'envoie bien sur le site "Télécharger.com" à la page d'ouverture.

En ajoutant le "CCleaner" évidemment , IL PLANTE.

Existe quelle est la solution pour bien télécharger automatiquement ???


D'avance Merci !!!
 

Pièces jointes

  • Essai Téléchargements 01.xls
    34.5 KB · Affichages: 38
Dernière édition:

néné06

XLDnaute Accro
Re : Problème de téléchargement

Bonsoir MochD

Merci de t'être penché sur mon problème mais malheureusement je n'ai pas trouvé de réponse sur le téléchargement.
Peut-être dois je me pencher sur le langage "HTML" que je connais peu ?

Merci !!
A+
 

MichD

XLDnaute Impliqué
Re : Problème de téléchargement

Es-tu certain d'avoir pris le temps de fouiller?

Ce qui suit provient de ce site.

Perso, je n'ai jamais touché à ça. Je n'ai pas de site internet pour tester les possibilités!


Ce qui suit émane du site internet suivant : Formation Excel

=================================================
Télécharger des fichiers Internet


Il y a plusieurs méthodes pour télécharger des fichiers à partir du Web. Les plus courantes utilisent les protocoles HTTP et FTP.
- Le protocole http est celui que vous utilisez quand vous surfez sur le Net. Pour lire une page Web, regarder une image, ou bien pour télécharger un fichier zip en cliquant sur un lien.
- Le protocole FTP est plus performant, mais nécessite in logiciel particulier et la connaissance du mot de passe permettant d'accéder au serveur Web.
Il permet un transfert rapide des fichiers. C'est celui qui est généralement utlisé pour publier des fichiers sur le Web.

Par VBA, on peut utiliser l'une ou l'autre méthode.


• Une solution apparemment simple consiste à simuler le clic sur un lien pointant vers un fichier zip en utilisant :
ThisWorkbook.FollowHyperlink ("http://jacxl.free.fr/cours_xl/vba/zaza.zip"), , True
puis en utilisant une série de Application.SendKeys ("{ENTER}"), séparés par des pauses ( Application.Wait ) pour laisser le temps aux connexions et transfert de se faire.
A l'usage, cette technique manque de fiabilité et de rapidité.


• L'utilisation d'un protocole FTP est facile, grace aux API de Windows.
La macro ci-après télécharge le fichier applaud.wav qui se trouve dans le répertoire /cours_xl/vba sur le serveur ftp ftpperso.free.fr, en utilisant le login zaza et le mot de passe mdp_miaou. Le fichier téléchargé est enregistré localement sous le nom de rien.wav.

Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" ( _
ByVal hInternetSession As Long, ByVal sServerName As String, _
ByVal nServerPort As Integer, ByVal sUsername As String, _
ByVal sPassword As String, ByVal lService As Long, _
ByVal lFlags As Long, ByVal lContext As Long) As Long
Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" ( _
ByVal sAgent As String, ByVal lAccessType As Long, _
ByVal sProxyName As String, _
ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
Declare Function FtpSetCurrentDirectory Lib "wininet.dll" Alias _
"FtpSetCurrentDirectoryA" (ByVal hFtpSession As Long, _
ByVal lpszDirectory As String) As Boolean
Declare Function FtpGetFile Lib "wininet.dll" Alias "FtpGetFileA" ( _
ByVal hConnect As Long, _
ByVal lpszRemoteFile As String, _
ByVal lpszNewFile As String, _
ByVal fFailIfExists As Long, _
ByVal dwFlagsAndAttributes As Long, _
ByVal dwFlags As Long, _
ByRef dwContext As Long) As Boolean

Sub envoie_fichier()
internet_ok = InternetOpen("", 1, "", "", 0)
If internet_ok Then
ftp_ok = InternetConnect(internet_ok, "ftpperso.free.fr", 21, "zaza", "mdp_miaou", 1, 0, 0)
If FtpSetCurrentDirectory(ftp_ok, "/cours_xl/vba") Then
succès = FtpGetFile(ftp_ok, "applaud.wav", "c:\rien.wav", False, 0, &H0, 0)
End If
End If
If succès Then MsgBox ("le fichier a été transféré")
End Sub

Une procédure similaire est utilisée pour publier un fichier sur le Net (cliquez ici).


• Le transfert de fichiers par http est un peu plus laborieux dans la mesure où il faut lire le fichier byte par byte.
La macro proposée établit la connection avec le fichier à télécharger, le lit byte par byte, puis le recopie dans un fichier texte portant la même extension enregistré sur le disque local.

Declare Function OuvreInternet Lib "wininet" _
Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, _
ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
Declare Function fermeInternet Lib "wininet" _
Alias "InternetCloseHandle" (ByVal hInet As Long) As Integer
Declare Function code_page Lib "wininet" _
Alias "InternetReadFile" (ByVal hFile As Long, ByVal sBuffer As String, _
ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer
Declare Function Ouvrepage Lib "wininet" _
Alias "InternetOpenUrlA" (ByVal hInternetSession As Long, ByVal lpszUrl As String, _
ByVal lpszHeaders As String, ByVal dwHeadersLength As Long, ByVal dwFlags As Long, _
ByVal dwContext As Long) As Long

Sub télécharge_http()
Dim texte_code As String * 1024

fich = InputBox("adresse Internet du fichier à télécharger ?", _
"téléchargement HTTP", "http://jacxl.free.fr/cours_xl/vba/applaud.wav")

'recherche extension du fichier
extn = ""
txt = fich
encor:
extn = Right(txt, 1) & extn
txt = Left(txt, Len(txt) - 1)
If Left(extn, 1) <> "." Then GoTo encor
If extn = ".fr" Or extn = ".com" Then extn = ".html"

'connection au fichier à télécharger
internet = OuvreInternet("toto", 1, vbNullString, vbNullString, 0) 'ouvre Internet
URL = Ouvrepage(internet, fich, vbNullString, _
ByVal 0&, &H80000000, ByVal 0&) 'ouvre la page Web

'lecture du fichier par paquet de 1024 bytes
txt = ""
nb_caractères_lus = 1
Do While nb_caractères_lus > 0
code_page URL, texte_code, 1024, nb_caractères_lus
txt = txt & Left(texte_code, nb_caractères_lus)
Loop

'ménage
fermeInternet URL 'ferme la page
fermeInternet internet 'ferme Internet

'recopie dans un fichier
Open "c:\rien" & extn For Output As #1
Print #1, txt
Close #1

'ouverture du fichier téléchargé
ThisWorkbook.FollowHyperlink "c:\rien" & extn, , True

End Sub


• Plutôt que d'utiliser la fonction API InternetOpenUrl pour se connecter à la page à télécharger, on peut utiliser les fonctions InternetConnect, HttpOpenRequest et HttpSendRequest, un peu plus laborieuses à utiliser, mais qui offrent d'intéressantes possibilités (possibilité de connection avec un mot de passe, utilisation d'url sécurisées...).
La macro ci-après n'est que la transcription de la précédente en utilisant ces fonctions :


Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" ( _
ByVal sAgent As String, _
ByVal lAccessType As Long, _
ByVal sProxyName As String, _
ByVal sProxyBypass As String, _
ByVal lFlags As Long) As Long
Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" ( _
ByVal hInternetSession As Long, _
ByVal sServerName As String, _
ByVal nServerPort As Integer, _
ByVal sUsername As String, _
ByVal sPassword As String, _
ByVal lService As Long, _
ByVal lFlags As Long, _
ByVal lContext As Long) As Long
Declare Function HttpOpenRequest Lib "wininet.dll" Alias "HttpOpenRequestA" ( _
ByVal hHttpSession As Long, _
ByVal sVerb As String, _
ByVal sObjectName As String, _
ByVal sVersion As String, _
ByVal sReferer As String, _
ByVal something As Long, _
ByVal lFlags As Long, _
ByVal lContext As Long) As Long
Declare Function HttpSendRequest Lib "wininet.dll" Alias "HttpSendRequestA" ( _
ByVal hHttpRequest As Long, _
ByVal sHeaders As String, _
ByVal lHeadersLength As Long, _
ByVal sOptional As String, _
ByVal lOptionalLength As Long) As Long
Declare Function InternetReadFile Lib "wininet.dll" ( _
ByVal hFile As Long, _
ByVal sBuffer As String, _
ByVal lNumBytesToRead As Long, _
lNumberOfBytesRead As Long) As Long
Declare Function HttpQueryInfo Lib "wininet.dll" Alias "HttpQueryInfoA" ( _
ByVal hHttpRequest As Long, _
ByVal lInfoLevel As Long, _
ByRef sBuffer As Any, _
ByRef lBufferLength As Long, _
ByRef lIndex As Long) As Integer
Declare Function InternetCloseHandle Lib "wininet.dll" ( _
ByVal hInet As Long) As Integer

Sub téléchargement_http()
Dim tampon As String * 1024

URL_fichier = InputBox("URL de la page à télécharger ?", _
"code de la page Internet", "http://jacxl.free.fr/cours_xl/vba/applaud.wav")

'recherche extension du fichier
extn = ""
txt = URL_fichier
encor:
extn = Right(txt, 1) & extn
txt = Left(txt, Len(txt) - 1)
If Left(extn, 1) <> "." Then GoTo encor

'recherche serveur et chemin du fichier
serveur = Right(URL_fichier, Len(URL_fichier) - 7) 'retire le http://
chemin_fich = Right(serveur, Len(serveur) - InStr(serveur, "/"))
serveur = Left$(serveur, InStr(serveur, "/") - 1)

'création du fichier sur le disque local
Open "c:\rien" & extn For Output As #1

'connexion au fichier
Inet = InternetOpen("", 0, "", "", 0)
ConnServ = InternetConnect(Inet, serveur, 80, "", "", 3, 0, 0)
requete = HttpOpenRequest(ConnServ, "GET", chemin_fich, "HTTP/1.0", "", 0, &H80000000, 0)
HttpSendRequest requete, "", 0, "", 0

'lecture du fichier morceau par morceau
txt = ""
encore:
InternetReadFile requete, tampon, Len(tampon), nb_lus
txt = txt & Left$(tampon, nb_lus)
If nb_lus > 0 Then GoTo encore

' ménage
InternetCloseHandle Inet
InternetCloseHandle ConnServ
InternetCloseHandle requete

'recopie du fichier
Print #1, txt
Close #1

'ouverture du fichier téléchargé
ThisWorkbook.FollowHyperlink "c:\rien" & extn, , True
End Sub
=================================================
 

JCGL

XLDnaute Barbatruc
Re : Problème de téléchargement

Bonjour à tous,

Peux-tu essayer :

VB:
Private Sub CommandButton1_Click()
    ThisWorkbook.FollowHyperlink "https://secure.piriform.com/502/cookie?affiliate=10605&redirectto=http%3a%2f%2fdownload.piriform.com%2fccsetup320.exe&product=69697"
End Sub

A + à tous
 

néné06

XLDnaute Accro
Re : Problème de téléchargement

Bonsoir JCGL

Merci pour ta réponse qui exécute très bien ce que je voulais, mais te serait-il possible de m'expliquer ce code que je ne comprend pas ?
//secure.piriform.com/502/cookie?affiliate=10605&redirectto=http%3a%2f%2fdownload.piriform.com%2fccsetup320.exe&product=69697"

Encore merci!!!

A+
 

JCGL

XLDnaute Barbatruc
Re : Problème de téléchargement

Bonjour à tous,

Néné : Euh... Comment expliquer ce lien tout bête sur la version 3.20 ( ici .1750) de CCleaner... Qui ne sera pas pérenne sur la version supérieure.

A + à tous
 

Discussions similaires