Importer données web à partir d'une url concaténée

Bonjour à toutes et tous

Totalement néophyte en macro VBA, je sollicite votre aide pour la création d'une macro dont l'objectif est:

d’importer des données (Résultats tournois) à partir d'une page web :

http://www.echecs.asso.fr/Resultats.aspx?URL=Tournois/Id/XXXXX/XXXXX&Action=Cl"

L’adresse de la page web doit être concaténée car elle intègre une variable "XXXXX"

qui correspond au N° du tournoi

je précise que l'essai d'importation par données/ A partir du Site Web

ne fonctionne pas car il m'est impossible de copier l'adresse concaténée dans l'adresse de requête

Apres diverses recherches (merci aux contributeurs des forums!!) j'ai bien réussi à trouver et à adapter 2 macros :

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

pour ouvrir une page à partir d'une adresse concaténée

Sub Import()

Dim RetVal As Long

RetVal = Shell("C:\Program Files\Internet Explorer\iexplore.exe " & Range("I10").Text, 1)

End Sub

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

L’'autre pour importer ( à partir d'un navigateur choisi) dans une feuille Excel

Sub Import°R()

With ActiveSheet.QueryTables.Add(Connection:= _

"URL;http://www.echecs.asso.fr/Resultats.aspx?URL=Tournois/Id/46590/46590&Action=Cl", _

Destination:=Range("a20"))

.BackgroundQuery = True

.Refresh BackgroundQuery:=False

End With

End Sub

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

Malheureusement mon incompétence ne me permet pas d'écrire une macro qui mixerait

les 2 opérations: importer à partir d'une adresse concaténée.

Merci d'avance pour votre aide si vous pensez avoir une solution.

Bonjour,

Il y a d'autres méthode que PowerQuery.

Celle-ci par exemple : l'adresse du site est en A1

Pierre

Bonjour Pierre

Un grand merci pour votre réponse réactive est efficace.

C'est exactement ce que j'essayais d'obtenir.

Très cordialement

Bonjour Pierre

Petite question concernant le code

quels paramètres modifier pour pouvoir importer des résultats supérieurs à 40 lignes ( tournoi à plus de 40 participants)

car dans ce cas la recherche affiche une page vide ?

Merci de votre aide

Très Cordialement.

Il y a d'autres méthode que PowerQuery.

Celle-ci par exemple : l'adresse du site est en A1

hum ... un inconditionnel ! comme moi ! mais c'est vrai que parfois, souvent même, une artillerie légère suffit !

Bonjour,

Pour info le code proposé est "générique" pour toute page html contenant des tableaux structurés avec des balises <td> et <tr>

Ce qui est le cas pour la page :

http://www.echecs.asso.fr/Resultats.aspx?URL=Tournois/Id/46590/46590&Action=Cl

(34 lignes de résultat)

ou pour celle-ci :

http://www.echecs.asso.fr/Resultats.aspx?URL=Tournois/Id/47866/47866&Action=Cl

(95 lignes de résultat)

Si une Url ne renvoie rien, il faut regarder la structure de la page qui est possiblement différente (balises <ul> <li> par exemple?).

Quelle est cette Url?

Pierre

Edit : bonjour Steelson!

Bonjour,

Super. J'aurais besoin de quelques choses de similaire.

Pour mettre mes stocks à jour depuis le site d'un de mes fournisseurs ( près de 6000 produits ).

Je voudrais mettre L'URL de la page produit en colonne A pour récupérer la référence du produit en colonne B et "stock" ou "rupture de stock" en colonne C.

Je croiserais ensuite les données avec ma BDD pour mettre mes stock à jour.

L'accès au site se fait par une authentification.

Jusqu'à présent, je scrappe le site mais c'est très long et je ne peux pas faire ça tous les jours.

Ce code n'est pas compatible avec des sites à accès protégé.

...Et ce n'est pas possible de modifier? De rentrer les identifiants directement dans le code par exemple?

C'est tout à fait possible de faire une double interrogation : une première souvent en POST pour envoyer le login, et ensuite une interrogation du site contenant les données.

Je ne trouve plus un des cas traités ici, je pense qu'il s'agit de ce long post https://forum.excel-pratique.com/viewtopic.php?f=2&t=96803, j'ai conservé le fichier (qui ne fonctionnera que si tu en connais les identifiants !)

Il faudrait donc que tu donnes le code source de la page de login. Maintenant que la méthode est rodée sur le cas d'AlienFall cela devrait être plus simple (si la méthode de login est bien la même).

Bonjour,

Pour info le code proposé est "générique" pour toute page html contenant des tableaux structurés avec des balises <td> et <tr>

Ce qui est le cas pour la page :

http://www.echecs.asso.fr/Resultats.aspx?URL=Tournois/Id/46590/46590&Action=Cl

(34 lignes de résultat)

ou pour celle-ci :

http://www.echecs.asso.fr/Resultats.aspx?URL=Tournois/Id/47866/47866&Action=Cl

(95 lignes de résultat)

Si une Url ne renvoie rien, il faut regarder la structure de la page qui est possiblement différente (balises <ul> <li> par exemple?).

Quelle est cette Url?

Pierre

Edit : bonjour Steelson!

Bonsoir Pierre

merci de votre réponse.

voici ll'URL qui renvoie une page vide

http://www.echecs.asso.fr/Resultats.aspx?URL=Tournois/Id/43900/43900&Action=Cl

(tournoi de 130 lignes)

Bonjour,

C'est curieux sur mon PC, voici ce que ça donne.

Est-ce dû à la version d'Excel? (2016 pour moi)

Pierre

Bonjour,

Chez moi c'est aussi Pierre.

Je pense plutôt à une absence de connexion internet pour DRALLA. J'avais aussi regardé le code source qui était bien codé.

Bonjour,

Chez moi c'est aussi Pierre.

Je pense plutôt à une absence de connexion internet pour DRALLA. J'avais aussi regardé le code source qui était bien codé.

Merci de votre aide

La version est excel 2007

l'importation fonctionne sans soucis pour des liens de tournois avec peu de participants mais comme dit précédemment

pour des importations de tableaux longs rien ne s'affiche. ??

C'est curieux.

J'ai pu emprunter un PC avec Excel 2007 et je constate en effet une différence d'interprétation du html par xl2007 et par xl2016, que j'ai du mal à m'expliquer.

Ceci étant dit, en contournant la difficulté, voici une version spéciale Excel 2007 qui semble fonctionner (sous 2007 et sous 2016)

Est-ce que ça fonctionne chez toi?

Pierre

Bonjour Pierre

Félicitations cela fonctionne sans soucis, sans limite du nombre de ligne.

Encore merci

C'est curieux.

J'ai pu emprunter un PC avec Excel 2007 et je constate en effet une différence d'interprétation du html par xl2007 et par xl2016, que j'ai du mal à m'expliquer.

Ceci étant dit, en contournant la difficulté, voici une version spéciale Excel 2007 qui semble fonctionner (sous 2007 et sous 2016)

Est-ce que ça fonctionne chez toi?

Pierre

Bonjour Pierre

Permettez moi une nouvelle question au spécialiste.

Grace à votre code précédent je récupère des listes sans limite du Nombre de ligne

par contre, comment contourner une pagination pour récupérer le listing complet ?

http://www.echecs.asso.fr/ListeJoueurs.aspx?Action=JOUEURCLUBREF&ClubRef=960

affiche les 4O premières lignes du listing pour avoir accès aux 40 suivantes il faut cliquer sur la pagination

etc

(toutes les pages ont la même URL impossible donc de récupérer par blocs et de coller )

question naïve: doit on ajouter un code en fin de l'url ?

Merci de votre aide.

Dralla

(toutes les pages ont la même URL impossible donc de récupérer par blocs et de coller )

Il y a une form et un passage de paramètre en POST

<form name="aspnetForm" method="post" action="ListeJoueurs.aspx?Action=JOUEURCLUBREF&amp;ClubRef=960" id="aspnetForm">

avec une fonction quand on clique sur le n° de page

<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['aspnetForm'];
if (!theForm) {
    theForm = document.aspnetForm;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script>

Je te laisse avec Pierre (je vais regarder en parallèle de mon côté, mais mon code est sans doute moins pertinent).

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

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

Rechercher des sujets similaires à "importer donnees web partir url concatenee"