Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Obtenir le Code sourse d'une page Web en VBA

642 views
Skip to first unread message

Fredo P.

unread,
Apr 13, 2012, 8:02:05 PM4/13/12
to
Bonjour
Tout est dans le titre
Est qu'il est possible de définir puis copier le code source d'une page Web.


MichD

unread,
Apr 13, 2012, 10:11:36 PM4/13/12
to
Bonjour,

Essaie comme ceci en adaptant l'adresse de la page Web que tu désires...

'-------------------------------------
Sub test()
Dim CodeSource As String, IE As Object
Set IE = CreateObject("InternetExplorer.Application")

IE.Visible = False ' Ou True
IE.Navigate URL:="http://www.google.com"
While IE.Busy
DoEvents
Wend
CodeSource = IE.Document.body.innerHTML
IE.Quit
MsgBox CodeSource
End Sub
'-------------------------------------

--
MichD
---------------------------------------------------------------



Fredo P.

unread,
Apr 14, 2012, 2:51:43 AM4/14/12
to
Bonjour MichDenis
merci de prendre ce fil
j'ai un arrêt à la ligne CodeSource = IE.Document.body.innerHTML
et redémarre en forçant au pas à pas.
lorsque je veux copier le code en A1, j'ai une erreur 7, "mémoire
insuffisante".
Est ce qu'il serait possible d'avoir la même chose avec FireFox?

"MichD" <mich...@hotmail.com> a écrit dans le message de news:
jmamd0$kds$1...@speranza.aioe.org...

MichD

unread,
Apr 14, 2012, 7:37:41 AM4/14/12
to
A ) Cette procédure fut testée à partir d'Internet Explorer 9, Windows 7, 64 bits.
Est-ce que tu as essayé cette procédure telle qu'elle est écrite avec l'adresse
Internet qu'elle utilise?
À la procédure, je peux ajouter cette ligne de code sans problème :
Range("A1") = CodeSource

Ceci étant dit, j'ai une connaissance limitée de ce type de truc! Est-ce que tu peux
publier l'adresse de la page où tu éprouves une difficulté à extraire le codesource?
As-tu un message d'erreur, si oui, lequel?

B ) Je ne connais pas "Firefox" et ce Fureteur internet n'est pas installé sur mon ordi.

Une question toute bête, est-ce que le code est très différent d'un fureteur internet à
l'autre? Le langage lui est le même... non?


--
MichD
---------------------------------------------------------------



Fredo P.

unread,
Apr 14, 2012, 8:55:28 AM4/14/12
to

"MichD" <mich...@hotmail.com> a écrit dans le message de news:
jmbnic$mtg$1...@speranza.aioe.org...
>A ) Cette procédure fut testée à partir d'Internet Explorer 9, Windows 7,
>64 bits.
> Est-ce que tu as essayé cette procédure telle qu'elle est écrite avec
> l'adresse
> Internet qu'elle utilise? non

> Ceci étant dit, j'ai une connaissance limitée de ce type de truc!
> Est-ce que tu peux
> publier l'adresse de la page où tu éprouves une difficulté à extraire le
> codesource?
http://www.tierce-magazine.com/accueil/pid107-les-reunions-du-jour.html?day=tomorrow

> As-tu un message d'erreur, si oui, lequel?
>
> B ) Je ne connais pas "Firefox" et ce Fureteur internet n'est pas installé
> sur mon ordi.
le code source sur FF est facile à copier manuellement mais on ne peut pas
le modifier sur l'interface FF

>
> Une question toute bête, est-ce que le code est très différent d'un
> fureteur internet à
> l'autre? Le langage lui est le même... non?
>
Sub test()
Dim CodeSource As String, IE As Object
IE = CreateObject("InternetExplorer.Application") ' au second essai, j'ai
erreur automation erreur -214023706 (800704a6), aprés avoir placé un on
error resume next, elle n'en fini pas de boucler sur le While >Wend

IE.Visible = False ' Ou True
IE.Navigate URL:="http://www.google.com"
While IE.Busy
DoEvents
Wend
CodeSource = IE.Document.body.innerHTML 'à cette ligne la routine stop, elle
la passe en forçant pas à pas.
MsgBox CodeSource 'ok
Range("A1") = CodeSource ' § c'est ici que le message "Mémoire
insuffisante"(Erreur 7) ce produit.
End Sub
Ce à quoi ressemble une partie de se qui m' intérresse du code source sur
FF, il est au format texte et se
déploie sur une seule colonne dans Excel.
Je retire de ce code tous les "race_id":N° d'identification des liens
d'autres pages

href="/accueil/les-courses-avc/pid111-partants.html?race_id=806812">Prix de
Levallois</a></td>
<td class="col3">
</td>
<td class="col4"></td>
<td class="col4"></td> <td
class="col4">
</td>
<td class="col5"><strong>14h00</strong></td>
<td class="col6">
8 partants </td>
<td class="col7">
</td>
<td class="col8">
</td>
<td class="col9">
<div style="position:relative"><a href="javascript:void(0);"
class="pariez-link" rel="https://www.leturf.fr" title="Parier"><img
style="margin-left: 15px; position: relative; top: 1px;"
src="http://media.tierce-magazine.com/design/front_office_tiercemagazine/images/pict/parier_home.jpg"
alt="Parier"/></a>
<div class="bloc_pub_pariez">
<iframe src="" scrolling="no" frameborder="no" align="center" height
= "202px" width = "351px"></iframe>
</div>
</div>
</td>
</tr>
<tr class="statut_">
<td class="col1"><img
src="http://media.tierce-magazine.com/design/front_office_tiercemagazine/images/spacer.gif"
class="picto typeCourse course-GALOP" alt="Plat" title="Plat" /></td>
<td class="col2"><strong>3</strong>&nbsp;&nbsp;&nbsp;<a
href="/accueil/les-courses-avc/pid111-partants.html?race_id=806808">Prix de
Chaillot</a></td>


MichD

unread,
Apr 14, 2012, 10:29:28 AM4/14/12
to
Dans la fenêtre de l'éditeur de code, barre des menus / outils / référence /
décoche la bibliothèque suivante si elle est cochée : 'Microsoft Internet controls"

Le mieux teste cette procédure en utilisant un classeur tout neuf.

Il y a peut-être des nuances selon les différentes versions, mais je ne saurais te dire.
Tu devrais tenter ta chance sur des forums spécialisés sur cette application en
particulier.

Désolé.


--
MichD
---------------------------------------------------------------


Yopop

unread,
Apr 14, 2012, 11:16:06 AM4/14/12
to
Bonjour Denis et Fredo,

J'avais la même première erreur (Win7 32 bits et IE8) que Fredo sur :

CodeSource = IE.Document.body.innerHTML

Mais vu qu'en faisant F5, ca se termine bien, je soupçonne le IE.Busy de
rendre la main trop tot. En cherchant sur le net, j'ai remplacé par:

Do Until IE.readystate = 4
DoEvents
Loop

qui semble fonctionner. Pour la 2 eme erreur, ("Memoire insuffisante")
le code de ta page html fait plus de 105000 caractères. Un peu trop pour
une seule cellule ! Il faudrait découper avant.

j-p

MichD

unread,
Apr 14, 2012, 11:25:40 AM4/14/12
to
Merci pour toutes ces informations. J'espère que cela aidera Fredo P.


MichD
---------------------------------------------------------------


Gloops

unread,
Apr 14, 2012, 2:25:40 PM4/14/12
to
MichD a écrit, le 14/04/2012 16:29 :
> Dans la fenêtre de l'éditeur de code, barre des menus / outils / référence /
> décoche la bibliothèque suivante si elle est cochée : 'Microsoft Internet controls"
>
> Le mieux teste cette procédure en utilisant un classeur tout neuf.
>
> Il y a peut-être des nuances selon les différentes versions, mais je ne saurais te dire.
> Tu devrais tenter ta chance sur des forums spécialisés sur cette application en
> particulier.
>
> Désolé.
>
>

Bonjour,

J'ai aussi pensé à un code trop long pour tenir dans une seule cellule.

On pourrait afficher Len(CodeSource), pour avoir une idée ...

C'est vrai que cette explication mérite un peu de prudence : j'ai essayé
de mettre dans une cellule "début" + Space(40000000) + "fin" et tout ce
que je vois, c'est "début".
Alors j'affiche la longueur du contenu de la cellule : 32767.
Je ne me suis pas fait jeter, pourtant.

Si toutefois cette piste est la bonne, l'arborescence DCom a une
ramification suffisamment fine pour que ses éléments puissent tenir dans
des cellules Excel. On peut décomposer de plusieurs manières, ce que
j'ai fait ci-dessous n'est qu'un exemple.

Ne pas trop se priver d'utiliser l'explorateur d'objets, que dans
l'environnement de développement d'Excel on peut ouvrir avec la touche F2.

Voici ci-dessous un exemple pour mettre chaque noeud dans une cellule.

Cet exemple utilise deux références :
1 - dans la liste, "Microsoft HTML Object Library", apparaîtra dans
l'explorateur d'objets sous le nom MSHTML, et se trouve dans le fichier
C:\Windows\system32\mshtml.tlb

2 - dans la liste, "Microsoft Internet Controls", apparaîtra dans
l'explorateur d'objets sous le nom SHDocVw, et se trouve dans le fichier
C:\Windows\system32\ieframe.dll

(le chemin de fichier ne sert que si vraiment on n'arrive pas à trouver
l'intitulé dans la liste)

Je rappelle qu'on sélectionne les références par Outils / Références, à
partir de l'environnement de développement. Il s'agit de cocher les
références voulues, puis valider une fois que tout y est.


J'ai laissé une erreur d'incompatibilité de type, qui apparaît en
colonne C en face de l'élément concerné, de type img. J'ai l'impression
que cette erreur n'est pas bloquante, aussi je vais laisser creuser qui
voudra, ça serait dommage que je reste une heure dessus pour ne rien
sortir de plus.

===== Début module ======
Option Explicit

Dim L As Integer

Public Sub TestHtml()
Dim IE As New InternetExplorer
Dim IEDoc As HTMLDocument
Dim CodeSource As String
Dim C As Range
Dim N As Integer
Dim Elt As HTMLDTElement
On Error GoTo ErrTestHtml
DoEvents
Range("A1") = ""
IE.Navigate2 "google.html"
MsgBox "Navigation effectuée"
Set IEDoc = IE.document
Debug.Print "IE"
CodeSource = IEDoc.body.innerHTML
Debug.Print CodeSource
MsgBox Len(CodeSource)
'Range("A1") = CodeSource
L = 1
Set Elt = IEDoc.body
TraitementElement Elt
Exit Sub
ErrTestHtml:
MsgBox Err.Description, , Err.Number
Resume Next
End Sub

Private Sub TraitementElement(ByVal E As HTMLDTElement)
Dim N As Integer
Dim C As Range
On Error GoTo ErrTraitementElement
L = L + 1
Set C = Cells(L, 2)
C = E.outerHTML
For N = 0 To E.ChildNodes.Length - 1
TraitementElement E.ChildNodes(N)
Next
Exit Sub
ErrTraitementElement:
Cells(L, 3) = Err.Description
Resume Next
End Sub

==== Fin module =====

Gloops

unread,
Apr 14, 2012, 2:31:16 PM4/14/12
to
Gloops a écrit, le 14/04/2012 20:25 :
> IE.Navigate2 "google.html"
> MsgBox "Navigation effectuée"

Pendant que je testais ça, Yopop proposait, à la place de ce message :

Fredo P.

unread,
Apr 15, 2012, 3:38:47 AM4/15/12
to
Bonjour Yopop

qui semble fonctionner. Pour la 2 eme erreur, ("Memoire insuffisante")
> le code de ta page html fait plus de 105000 caractères. Un peu trop pour
> une seule cellule ! Il faudrait découper avant.

Quand je le fais manuellement à partir d' IE, çà ne pose pas de pb, le code
s'inscrit sur plusieurs cellule sur une seule colonne, alors?
je pense que c'est comme l'interface du VBA comme d'autres par ailleurs,
quand il manque un "Endif" ou un "Next" et que l'erreur est en amont, il
nous dit «o't'chose qui faudrait'?»

"Yopop" <ri...@ici.invalid> a écrit dans le message de news:
4f89949f$0$12494$ba4a...@reader.news.orange.fr...
> Bonjour Denis et Fredo,
>
> J'avais la même première erreur (Win7 32 bits et IE8) que Fredo sur :
>
> CodeSource = IE.Document.body.innerHTML
>
> Mais vu qu'en faisant F5, ca se termine bien, je soupçonne le IE.Busy de
> rendre la main trop tot. En cherchant sur le net, j'ai remplacé par:
>
> Do Until IE.readystate = 4
> DoEvents
> Loop
>
> >
> j-p


Fredo P.

unread,
Apr 15, 2012, 3:47:13 AM4/15/12
to

"MichD" <mich...@hotmail.com> a écrit dans le message de news:
jmc1ke$g1t$1...@speranza.aioe.org...
> Dans la fenêtre de l'éditeur de code, barre des menus / outils / référence
> /
> décoche la bibliothèque suivante si elle est cochée : 'Microsoft Internet
> controls"
Elle n'est pas

Fredo P.

unread,
Apr 15, 2012, 4:27:42 AM4/15/12
to
à propos de l'erreur 7 , je suis tombé sur ça
http://www.vbfrance.com/codes/OBTENIR-CODE-HTML-PAGE-WEB-FACILEMENT_6751.aspx

"Gloops" <glo...@zailes.invalid.org> a écrit dans le message de news:
jmcfpl$ug7$1...@nntp.pasdenom.info...

Fredo P.

unread,
Apr 15, 2012, 6:38:09 PM4/15/12
to
J'ai manqué de persévérance pour ce truc qui m'a paru un peu trop ardu pour
mes neurones
Que ce soit avec
Do Until IE.readystate = 4
DoEvents
Loop

ou avec

While IE.Busy
DoEvents
Wend
rien ne passe, ou alors, je manque de patience.

Gloops

unread,
Apr 16, 2012, 6:54:18 AM4/16/12
to
Et avec un MsgBox ?
C'est moins élégant, mais ça marche.

As-tu vérifié ce que ça donne en pas à pas ?





_______________________________________

MichD

unread,
Apr 16, 2012, 7:54:14 AM4/16/12
to
Bonjour,

Avec ceci, tu devrais pouvoir importer dans Excel tout le code source d'une adresse
Internet.

Copie ce qui suit dans un module standard :

Le code suivant ne requiert aucune addition d'une quelconque référence à ton projet VBA.

'-------------------------------------
Sub test()
Dim CodeSource As String, IE As Object
Dim TempFile As String
Set IE = CreateObject("InternetExplorer.Application")

TempFile = "c:\MichD.txt"

IE.Visible = False ' Ou True
IE.Navigate
URL:="http://www.tierce-magazine.com/accueil/pid107-les-reunions-du-jour.html?day=tomorrow"

Do Until IE.readystate = 4
DoEvents
Loop

CodeSource = IE.Document.body.innerHTML

Open TempFile For Output As #1
Print #1, CodeSource
Close #1

Open TempFile For Input As #1
Do While Not EOF(1)
Input #1, LaLigne
A = A + 1
Range("A" & A) = LaLigne
Loop
Close #1

Kill TempFile
IE.Quit

Gloops

unread,
Apr 16, 2012, 7:59:39 AM4/16/12
to
Fredo P. a écrit, le 16/04/2012 00:38 :
> J'ai manqué de persévérance pour ce truc qui m'a paru un peu trop ardu pour
> mes neurones
> Que ce soit avec
> Do Until IE.readystate = 4
> DoEvents
> Loop
>
> ou avec
>
> While IE.Busy
> DoEvents
> Wend
> rien ne passe, ou alors, je manque de patience.

Je viens de faire un essai, avec IE.Busy j'ai toujours l'erreur, en
revanche avec Do Until IE.ReadyState = READYSTATE_COMPLETE ça s'exécute
proprement.

Et j'ai bien vérifié que READYSTATE_COMPLETE vaut 4.

Il y a 5 valeurs, pour ReadyState. Je ne serais pas étonné que IE.Busy
corresponde à certaines de ces valeurs, mais qu'il en reste d'autres que
READYSTATE_COMPLETE dans celles qui ne sont pas concernées.

Maintenant, si le test avec IE.Busy est satisfaisant sur certaines
machines et pas sur d'autres, il est possible qu'il en aille de même de
celui avec ReadyState.

Ajouter une temporisation, après ?

Dim Dt As Date
Dt = Now + TimeValue("00:00:02")
Application.Wait Dt


Oui enfin c'est histoire d'essayer quelque chose ...

Et les deux secondes, c'est une valeur imaginée à la louche.
ça doit couvrir le temps entre le moment où IE retourne la valeur
attendue, et celui où il est effectivement en mesure de répondre à la
sollicitation pour retourner la source de la page.
Il faut des mecs balaises pour dire de quoi ça peut dépendre, en
revanche pour essayer de bricoler un truc qui puisse attendre le temps
qu'il faut, j'imagine que ça peut représenter plus de monde.
Quoi qu'on n'est pas au bout.



Gloops

unread,
Apr 16, 2012, 8:10:32 AM4/16/12
to
Gloops a écrit, le 16/04/2012 13:59 :
> Maintenant, si le test avec IE.Busy est satisfaisant sur certaines
> machines et pas sur d'autres, il est possible qu'il en aille de même de
> celui avec ReadyState.

A propos, quelle est la taille de CodeSource, finalement ?


Fredo P.

unread,
Apr 16, 2012, 5:32:35 PM4/16/12
to

"MichD" <mich...@hotmail.com> a écrit dans le message de news:
jmh196$vhk$1...@speranza.aioe.org...
> Bonjour,
>
> Avec ceci, tu devrais pouvoir importer dans Excel tout le code source
> d'une adresse
> Internet.
>
Bonjour MichDenis
Alors ça, tu remontes dans mon estime, c'est nickel!
On peut avoir la méthode de recherche ou connaitre la source?
si c'est pas secret bien sur!
Ou est ce par simple intuition?

MichD

unread,
Apr 16, 2012, 5:39:36 PM4/16/12
to
| Alors ça, tu remontes dans mon estime, c'est nickel!
| On peut avoir la méthode de recherche ou connaitre la source?
| si c'est pas secret bien sur!
| Ou est ce par simple intuition?

Je n'ai pas compris ta remarque. Il n'y a rien de secret, tout est dans la procédure!

Fredo P.

unread,
Apr 16, 2012, 5:54:40 PM4/16/12
to
Ce n'est pas sur la procédure qu'est posée la question mais sur comment tu
as pu trouvé cette procédure, si il ya eu une recherche sur la toile ou une
pure création avec pour seul soutient tes connaissances ou encore si la
recherche eu été sur librairie ou autre, voila c'est pas plus curieux que
ça.
Ceci pour peut être pouvoir moi même avoir la ressource de trouver sans être
obligé de venir sur mpfe
"MichD" <mich...@hotmail.com> a écrit dans le message de news:
jmi3im$ugc$1...@speranza.aioe.org...

MichD

unread,
Apr 16, 2012, 6:21:06 PM4/16/12
to
Dans ce cas-ci, la procédure est de moi.

La ligne difficile à trouver était celle-ci :
CodeSource = IE.Document.body.innerHTML

Pour le reste, comme la variable "CodeSource" contenait une longue
chaîne de caractères, j'ai tout simplement décidé de la copier dans un
fichier texte pour par la suite lire ce fichier ligne par ligne et la copier
dans Excel. En dernier lieu, il s'agit de supprimer le fichier texte qui a
été créé temporairement.

Dans plusieurs cas, l'explorateur de projets ("F2") de la fenêtre VBA peut
aider à trouver la propriété ou méthode d'un objet.

Le Web est une autre source. Si j'extrais une solution d'un site, je donne
habituellement la source en référence. Cependant, au cours des années,
j'ai moi-même une bibliothèque impressionnante de procédures... et souvent
de la difficulté à les retrouver... ;-)))

Voilà.


MichD
---------------------------------------------------------------



pom...pom...pom..

unread,
Apr 17, 2012, 3:08:56 AM4/17/12
to
Bonsour®

"Fredo P." a écrit
On peut avoir la méthode de recherche ou connaitre la source?
si c'est pas secret bien sur!

;o)))
n'est pas MVP qui veut...
Denis a accès aux librairies MSDN.

pom...pom...pom..

unread,
Apr 17, 2012, 3:14:53 AM4/17/12
to
Bonsour®

"MichD" a écrit
> Cependant, au cours des années,
> j'ai moi-même une bibliothèque impressionnante de procédures... et souvent
> de la difficulté à les retrouver... ;-)))

de la différence de :
savoir que l'on sait / montrer que l'on sait.
ta serviabilité en est la démonstration...

Daniel.j

unread,
Apr 17, 2012, 6:00:28 AM4/17/12
to
Pour en rajouter encore ...
Cette procedure envoie la source dans un fichier texte !
sFileName = "c:\ajeter\test.txt" ' A MODIFIER

(je sais plus du tout d'ou vient cette fonction)

====================================================================

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

Function DownloadPage(ByVal url As String, ByVal FileName As String) As
Boolean
Dim done As Boolean
Dim value As Long
On Error Resume Next
done = True
If Dir$(FileName) <> "" Then
Kill FileName
End If
value = URLDownloadToFile(0, url, FileName, 0, 0)
If Dir$(FileName) = "" Then
done = False
End If
DownloadPage = done
End Function

Sub Recup()
Dim bRet As Boolean
Dim sURL As String
Dim sFileName As String

sURL =
"http://www.tierce-magazine.com/accueil/pid107-les-reunions-du-jour.html?day=tomorrow"

sFileName = "c:\ajeter\test.txt" ' A MODIFIER

bRet = DownloadPage(sURL, sFileName)
If bRet Then
MsgBox "Téléchargement réussi."
Else
MsgBox "Erreur lors du téléchargement"
End If
End Sub

Daniel

--
VBAXL
http://dj.joss.free.fr/






"pom...pom...pom.." <nom...@live.fr.invalid> a écrit dans le message de
news: jmj4u5$1ks$1...@speranza.aioe.org...

MichD

unread,
Apr 17, 2012, 8:55:47 AM4/17/12
to
| Denis a accès aux librairies MSDN.

En fait, tu veux dire que j'aurais accès à un trésor que j'ignore encore?

MSDN est ouvert à tous sur le Web, non?

Dans les faits, je n'utilise pas cette ressource, mais je serais heureux que
tu m'apprennes quelque chose sur un avantage dont je bénéficierais!

;-))

--
MichD
---------------------------------------------------------------



Jacky

unread,
Apr 17, 2012, 10:41:33 AM4/17/12
to
Hello,

> tu m'apprennes quelque chose sur un avantage dont je bénéficierais!
MS ne met plus à disposition la dernière version d'office ???
;o)
--
Salutations
JJ


"MichD" <mich...@hotmail.com> a écrit dans le message de news: jmjp8j$l7r$1...@speranza.aioe.org...

MichD

unread,
Apr 17, 2012, 11:36:50 AM4/17/12
to
Oui bien sûr!

J'espère ne pas être le seul à utiliser la dernière version d'Office!

;-)

--
MichD
---------------------------------------------------------------


Fredo P.

unread,
Apr 17, 2012, 2:54:00 PM4/17/12
to
Voila , ce fut très instructif, merci à tous

"MichD" <mich...@hotmail.com> a écrit dans le message de news:
jmk2mj$f5r$1...@speranza.aioe.org...
0 new messages