Importer données web à partir d'une url concaténée
Un tentative
Sub requete_post() Dim obj As New DataObject For i = 1 To 5 With CreateObject("MSXML2.XMLHTTP") .Open "POST", Sheets("URL").Range("A1").Value, False .setRequestHeader "Content-Type", "application/x-www-form-urlencoded" .Send "__EVENTTARGET=ctl00$ContentPlaceHolderMain$PagerFooter&__EVENTARGUMENT=" & i & "&__VIEWSTATEGENERATOR=37C7F7E6" If .Status = 200 Then txt = "<table" & Split(Split(.responseText, "<table")(3), "</table>")(0) & "</table>" obj.SetText txt obj.PutInClipboard ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count) ActiveSheet.Paste Selection.Delete End If End With Next End Sub
Bonjour Steelson,
Un grand merci c'est parfait
ReBonjour Steelson,
Désolé de vous solliciter encore.
Le code fonctionne sans soucis pour récupérer l'ensemble des pages ( clubs de plus de 41 joueurs)
(1 page= Liste de 40 Joueurs)
par contre l'import bug pour un club de moins de 40 j soit une page ?
Faut il placer une condition (else) dans la bouche IF... end If ?
merci de votre aide
Effectivement, j'ai été un peu vite et j'ai fixé le nombre de pages à 5 !
Change ceci en fonction du nombre de pages :
For i = 1 To 5
Je vais faire une recherche automatique sur le nombre de pages concernées ... à suivre, pas avant demain matin.
Effectivement, j'ai été un peu vite et j'ai fixé le nombre de pages à 5 !
Change ceci en fonction du nombre de pages :
For i = 1 To 5
Je vais faire une recherche automatique sur le nombre de pages concernées ... à suivre, pas avant demain matin.
Ok Steelson merci
Effectivement j'ai réussi à changer le nombre de pages pour des clubs à plus de 200 Jo ( 5 pages *40)
mais si le club recherché a de 1 à 40 jo soit une page la l'import bug.
J'ai reussi à bricoler un code ou je rentre le N° du club (1er question du post sur les lien concaténés)
pour ma recherche je ne connais pas à l'avance le nombre
de Joueurs donc le nombre de page.
j'ai donc fixer un nombre maxi de 10 pages qui couvre l'ensemble des recherches
pour resumer For 1 = To 10 fonctionne sauf For 1 to 1 !!
Bonjour à tous,
Pour compléter l'excellente solution de Steelson, voici une p'tite fonction pour récupérer le nb de pages :
Function NbPages(site As String) As Integer
Dim Html As New HTMLDocument, Elem As Object
With CreateObject("WINHTTP.WinHTTPRequest.5.1")
.Open "GET", site, False
.send
Html.body.innerHTML = .responseText
End With
On Error Resume Next
For Each Elem In Html.getElementsByTagName("a")
If IsNumeric(Elem.innerText) Then NbPages = Elem.innerText
Next Elem
End Function
Du coup j'ai "panaché" les 2 méthodes dans cette proposition
Est-ce que ça fonctionne?
Pierre
Bonjour à tous,
Pour compléter l'excellente solution de Steelson, voici une p'tite fonction pour récupérer le nb de pages :
Function NbPages(site As String) As Integer Dim Html As New HTMLDocument, Elem As Object With CreateObject("WINHTTP.WinHTTPRequest.5.1") .Open "GET", site, False .send Html.body.innerHTML = .responseText End With On Error Resume Next For Each Elem In Html.getElementsByTagName("a") If IsNumeric(Elem.innerText) Then NbPages = Elem.innerText Next Elem End Function
Du coup j'ai "panaché" les 2 méthodes dans cette proposition
Est-ce que ça fonctionne?
Pierre
Bonsoir Pierre
Impeccable.
Encore merci à vous et à Steelson.
Rapidité efficacité c'est top !
Bonjour Dralla & Pierre
Je propose une version qui rassemble toutes les données dans un seul onglet.
Elle devrait aussi pouvoir interroger plusieurs clubs.
J'ai repris bien sûr le code de Pierre qui permet d'obtenir le nombre de pages
Bonjour Dralla & Pierre
Je propose une version qui rassemble toutes les données dans un seul onglet.
Elle devrait aussi pouvoir interroger plusieurs clubs.
J'ai repris bien sûr le code de Pierre qui permet d'obtenir le nombre de pages
Bonjour Steelson
Merci de votre proposition. pour onglet unique
Apres test pas de soucis pour les clubs de plus de 40 membres par contre si moins de 40
pas d'affichage ?
exp http://www.echecs.asso.fr/ListeJoueurs.aspx?Action=JOUEURCLUBREF&ClubRef=320
erreur 1004 " Un tableau ne peut pas en chevaucher un autre"
Ok il faut donc faire comme Pierre, le premier tableau doit être lu via la méthode GET.
Je vais modifier.
Comme tu m'as donné une autre URL, j'ai aussi pu mettre au point le "multi-clubs"
Sub requete_post()
Dim obj As New DataObject
Dim ws As Worksheet
For Each ws In Worksheets
ws.Select
iRow = 4
ws.Cells(iRow, 1).CurrentRegion.ClearContents
ws.Cells(iRow, 1).Select
nPages = NbPages(ws.Range("A1").Value)
iTable = IIf(nPages > 1, 3, 2)
For i = 1 To WorksheetFunction.Max(1, nPages)
With CreateObject("MSXML2.XMLHTTP")
If i = 1 Then
.Open "GET", ws.Range("A1").Value, False
.send
Else
.Open "POST", ws.Range("A1").Value, False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.send "__EVENTTARGET=ctl00$ContentPlaceHolderMain$PagerFooter&__EVENTARGUMENT=" & i & "&__VIEWSTATEGENERATOR=37C7F7E6"
End If
If .Status = 200 Then
txt = "<table" & Split(Split(.responseText, "<table")(iTable), "</table>")(0) & "</table>"
obj.SetText txt
obj.PutInClipboard
ws.Paste
Selection.Delete 'suppression des shapes
End If
End With
If i > 1 Then ws.Rows(iRow).Delete 'suppression en-tête inutile
iRow = ws.Cells(Rows.Count, 1).End(xlUp).Row + 1
ws.Cells(iRow, 1).Select
Next
ws.ListObjects.Add(xlSrcRange, Range("$A$4").CurrentRegion, , xlYes).Name = "T_" & ws.Name
Range("T_" & ws.Name & "[#All]").Select
ws.ListObjects(1).TableStyle = "TableStyleMedium2"
Next
End Sub
Function NbPages(site As String) As Integer
' Pierre56
Dim Html As New HTMLDocument, Elem As Object
With CreateObject("WINHTTP.WinHTTPRequest.5.1")
.Open "GET", site, False
.send
Html.body.innerHTML = .responseText
End With
On Error Resume Next
For Each Elem In Html.getElementsByTagName("a")
If IsNumeric(Elem.innerText) Then NbPages = Elem.innerText
Next Elem
End Function
Comme tu m'as donné une autre URL, j'ai aussi pu mettre au point le "multi-clubs"
Sub requete_post() Dim obj As New DataObject Dim ws As Worksheet For Each ws In Worksheets ws.Select iRow = 4 ws.Cells(iRow, 1).CurrentRegion.ClearContents ws.Cells(iRow, 1).Select nPages = NbPages(ws.Range("A1").Value) iTable = IIf(nPages > 1, 3, 2) For i = 1 To WorksheetFunction.Max(1, nPages) With CreateObject("MSXML2.XMLHTTP") If i = 1 Then .Open "GET", ws.Range("A1").Value, False .send Else .Open "POST", ws.Range("A1").Value, False .setRequestHeader "Content-Type", "application/x-www-form-urlencoded" .send "__EVENTTARGET=ctl00$ContentPlaceHolderMain$PagerFooter&__EVENTARGUMENT=" & i & "&__VIEWSTATEGENERATOR=37C7F7E6" End If If .Status = 200 Then txt = "<table" & Split(Split(.responseText, "<table")(iTable), "</table>")(0) & "</table>" obj.SetText txt obj.PutInClipboard ws.Paste Selection.Delete 'suppression des shapes End If End With If i > 1 Then ws.Rows(iRow).Delete 'suppression en-tête inutile iRow = ws.Cells(Rows.Count, 1).End(xlUp).Row + 1 ws.Cells(iRow, 1).Select Next ws.ListObjects.Add(xlSrcRange, Range("$A$4").CurrentRegion, , xlYes).Name = "T_" & ws.Name Range("T_" & ws.Name & "[#All]").Select ws.ListObjects(1).TableStyle = "TableStyleMedium2" Next End Sub Function NbPages(site As String) As Integer ' Pierre56 Dim Html As New HTMLDocument, Elem As Object With CreateObject("WINHTTP.WinHTTPRequest.5.1") .Open "GET", site, False .send Html.body.innerHTML = .responseText End With On Error Resume Next For Each Elem In Html.getElementsByTagName("a") If IsNumeric(Elem.innerText) Then NbPages = Elem.innerText Next Elem End Function
Merci Steelson cette fois cela fonctionne quel que soit le nombre de joueurs dans le club.
Merci à toi et Pierre pour l'aide précieuse.
Comme tu m'as donné une autre URL, j'ai aussi pu mettre au point le "multi-clubs"
Sub requete_post() Dim obj As New DataObject Dim ws As Worksheet For Each ws In Worksheets ws.Select iRow = 4 ws.Cells(iRow, 1).CurrentRegion.ClearContents ws.Cells(iRow, 1).Select nPages = NbPages(ws.Range("A1").Value) iTable = IIf(nPages > 1, 3, 2) For i = 1 To WorksheetFunction.Max(1, nPages) With CreateObject("MSXML2.XMLHTTP") If i = 1 Then .Open "GET", ws.Range("A1").Value, False .send Else .Open "POST", ws.Range("A1").Value, False .setRequestHeader "Content-Type", "application/x-www-form-urlencoded" .send "__EVENTTARGET=ctl00$ContentPlaceHolderMain$PagerFooter&__EVENTARGUMENT=" & i & "&__VIEWSTATEGENERATOR=37C7F7E6" End If If .Status = 200 Then txt = "<table" & Split(Split(.responseText, "<table")(iTable), "</table>")(0) & "</table>" obj.SetText txt obj.PutInClipboard ws.Paste Selection.Delete 'suppression des shapes End If End With If i > 1 Then ws.Rows(iRow).Delete 'suppression en-tête inutile iRow = ws.Cells(Rows.Count, 1).End(xlUp).Row + 1 ws.Cells(iRow, 1).Select Next ws.ListObjects.Add(xlSrcRange, Range("$A$4").CurrentRegion, , xlYes).Name = "T_" & ws.Name Range("T_" & ws.Name & "[#All]").Select ws.ListObjects(1).TableStyle = "TableStyleMedium2" Next End Sub Function NbPages(site As String) As Integer ' Pierre56 Dim Html As New HTMLDocument, Elem As Object With CreateObject("WINHTTP.WinHTTPRequest.5.1") .Open "GET", site, False .send Html.body.innerHTML = .responseText End With On Error Resume Next For Each Elem In Html.getElementsByTagName("a") If IsNumeric(Elem.innerText) Then NbPages = Elem.innerText Next Elem End Function
Merci Steelson cette fois cela fonctionne quel que soit le nombre de joueurs dans le club.
Merci à toi et Pierre pour l'aide précieuse.
Bonjour Steelson.
une question concernant les liens hypertext : ils sont perdus lors de l'importation.
( ils s'effacent lors du chargement des pages)
Existe t il un moyen de les conserver ?
si oui je vous remercie .
Cordialement.
Bonjour Steelson.
une question concernant les liens hypertext : ils sont perdus lors de l'importation.
( ils s'effacent lors du chargement des pages)
Existe t il un moyen de les conserver ?
Ces liens ? http://www.echecs.asso.fr/FicheJoueur.aspx?Id=761395
ok je vais regarder , je ne savais pas que c'était utile !
Bonjour Steelson.
une question concernant les liens hypertext : ils sont perdus lors de l'importation.
( ils s'effacent lors du chargement des pages)
Existe t il un moyen de les conserver ?
Ces liens ? http://www.echecs.asso.fr/FicheJoueur.aspx?Id=761395
ok je vais regarder , je ne savais pas que c'était utile !
Bonjour Steelson.
Oui ces liens ( fiche Joueur) .
Mais aussi plus généralement d'autres liens dans d'autre requetés ?
pour ne pas qu'ils se perdent lors de l'importation
Le lien est représenté par le petit carré bleu.
Le lien est représenté par le petit carré bleu.
Merci Steelson pour la proposition, malheureusement le code bug
Application.CommandBars("Format Object").Visible = False
Grace à votre aide du début de post j'ai réussi à concaténer les liens pour pouvoir importer en fonction du numero du club
il m''est donc pas nécessaire de faire une recherche en multiclub ( 2 dans l'exemple)
1 seul suffirait.
mais pour pouvoir importer de 1 à 5 pages web (selon la taille du club) sous forme de tableau
(comme vos propositions plus haut dans le post le permet)
mais
en intégrant les liens ( petits carrés bleus"
Le lien est représenté par le petit carré bleu.
Merci Steelson pour la proposition, malheureusement le code bug
Je n'ai aucun bug.
Le bug se produit-il dans le fichier que j'ai posté ou bien après duplication de la macro dans un autre fichier ?
Dans le fichier posté
à l'ouverture sans l'enregistrer
Curieux !! car aucune macro n'est lancée en ouverture ...
Pas grave, supprime cette ligne de la macro ...
Curieux !! car aucune macro n'est lancée en ouverture ...
Pas grave, supprime cette ligne de la macro ...
bonjour Steelson, Bonjour Pierre
Avec les différents codes que vous m'avez proposés, j'essaye d'en mixer un pour pouvoir :
Importer la liste des joueurs d'un club quelconque en conservant les liens hypertexte de la rubrique infos.
Le code qui permet de conserver les "shapes" étant imbriqué dans le code d'importation , je n'arrive pas à le
récupérer pour pouvoir l'integrer ailleurs.
Merci de votre aide