Charger un fichier sur internet à partir d'excel (methode avec winsock)

Soyez le premier à donner votre avis sur cette source.

Vue 6 749 fois - Téléchargée 500 fois

Description

Ce script vba vous permet de charger un fichier a partir d'une adresse web. L'exploitation de ce fichier n'est pas faite, a vour de voir ce que vous voulez en faire, le document est chargé dans la variable DocumentContent.

Voilà le code de ce script en dessous, mais étant donné qu'il y a des objets, allez regarder le zip.

Bonne prog et à +, akh

Source / Exemple :


Dim HTML_INFOS() As String
Dim DocumentContent As String

Private Sub CommandButton1_Click()
    Winsock1.Close
    HTML_INFOS = Split(Text1.Text, "/")
    Winsock1.Connect HTML_INFOS(0), 80
    CommandButton1.Visible = False
    Label3.Caption = "Connection to server " & HTML_INFOS(0)
    Label3.Visible = True
    Text1.Enabled = False
End Sub

Function LoadingFinish()
    CommandButton1.Visible = True
    Label3.Visible = False
    Text1.Enabled = True
End Function

Private Sub Winsock1_Close()
    LoadingFinish
    MsgBox "Document chargé avec succés !", vbInformation + vbOKOnly, "Finit"
    ' Le document se trouve dans la variable DocumentContent
    ' cependant elle contient aussi les Headers du protocole HTTP
End Sub

Private Sub Winsock1_Connect()
    Dim ExcelDoc As String
    Label3.Caption = "Connexion établie - Attente du document"
    ExcelDoc = Join(HTML_INFOS, "/")
    Winsock1.SendData "GET http://" & ExcelDoc & " HTTP/1.1" & vbCrLf & vbCrLf
    DocumentContent = Empty
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Label3.Caption = "Document en cours de reception"
    Dim message As String
    Winsock1.GetData message
    DocumentContent = DocumentContent & message
End Sub

Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
    MsgBox "Erreur de transfert : " & vbCrLf & vbCrLf & Description, vbCritical + vbOKOnly, "Erreur " & Number
    Winsock1.Close
    LoadingFinish
End Sub

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

aKheNathOn
Messages postés
276
Date d'inscription
dimanche 22 juillet 2001
Statut
Modérateur
Dernière intervention
5 décembre 2013

Oui t'as totalment raison, c'est bien de l'avoir vu, j'aurais dû même le préciser, la concaténation de chaines en vb est trés longue, et la gestion des buffers est mal faite. Pour être plus précis , pour concaténer deux chaines vb crée un buffer de la taille total dans lequel il y met les deux chaines, donc ça peut passer encore pour quelques centaines de Ko, mais dépassé le MO il est vraiment lent.

J'ai déjà eu ce probléme, alors l'astuce est simple, et pas trop compliquée à mettre en place :

On déclare le string qui va contenir tout le fichier :
Dim Buffer as string

On le dimensionne à la taille totale du fichier :
Buffer = space(Longeur de Fichier)

Puis on écrit dedans :
Mid(Buffer, Position d'écriture) = Texte à y inscrire ...

Pour ce genre de cas il faudrais avoir une variable de type Long pour savoir à quel emplacement du fichier on se trouve...

Bréf ce n'est que de la methodo, et en plus pour être minutieux il aurrais fallu être plus complet dans la requette Get, voir même donne que le répértoire et le nom de fichier, mais le code répond à un certain besoin donné, qui ne demande pas de gros fichiers, et dont le server accepte (j'espére) ce genre de requette "primitive" ...

Une alternative aurais été d'utiliser les api de windows, mais je ne suis pas sûr que ça passe dans les VBA (manque de practique), en tout cas, c'est une base pour débutter à télécharger des fichiers avec excel.

Par pur plaisir, et non par plagiat, voilà la fonction utilisée par API Guide pour télécharger un fichier :

Compatibilité : Requires Windows NT 4.0 or later; Requires Windows 95 or later

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
Public Function DownloadFile(URL As String, LocalFilename As String) As Boolean
Dim lngRetVal As Long
lngRetVal = URLDownloadToFile(0, URL, LocalFilename, 0, 0)
If lngRetVal 0 Then DownloadFile True
End Function
Private Sub Form_Load()
'example by Matthew Gates (Puff0rz@hotmail.com)
DownloadFile "http://www.allapi.net", "c:allapi.htm"
End Sub


Bréf, walla si ça peut vous aider, j'en serais ravi, à +, et bonne prog, akh
cs_EBArtSoft
Messages postés
4531
Date d'inscription
dimanche 29 septembre 2002
Statut
Modérateur
Dernière intervention
22 avril 2019
8
Ya un pb dans vb avec les tampons de type string dans winsock
lors de la reception de gros fichier a un debit important
le programme ralenti de maniere exponentiel due a
la concatenation des tampons. cela meme apres compilation
du projet.

Une solution consiste a utiliser un tableau de type byte
pre dimentionner selon le "Content-Length" et de copier
le tampon bout a bout

Bon je sait pas si je suis bien clair mais je voulais juste indiquer
ce probleme...

Peut importe

Bonne pr@g

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.