Problème import données Web VBA

Bonjour à tous,

Je rencontre un petit problème lorsque je lance ma macro pour importer des données depuis un site web. (le fichier est en attaché)

Mon classeur comporte deux feuilles, une première "Stats" comprenant une cellule A5 dans laquelle on choisi un nom dans la liste déroulante, une cellule F5 qui fait apparaître l'adresse url en lien avec le nom en A5, puis dessous une plage de cellules dans laquelle sont importées les données. La deuxième feuille comporte la liste de nom, avec le lien associé.

Tous les liens mènent vers le même site, le même type de tableau, seules les données du tableau diffèrent.

Lorsque je sélectionne le 1er nom de ma liste déroulante, je lance la macro, aucun problème l'import de données s'effectue correctement (je fais également supprimer la feuille qui s'est créée pour l'import de données + la requête pour ne pas bloquer mes prochaines demandes). Pour le 2ème nom, aucun problème également.

Par contre, pour le 3ème et 4ème, au moment de l'import de données, la macro ne semble pas reconnaître certaines colonnes, alors qu'il s'agit strictement du même tableau que les deux premiers.

Auriez-vous une solution ?

En vous remerciant par avance pour votre aide.

16test.xlsm (29.61 Ko)

Bonjour,

Une proposition Power Query (à adapter) avec un soupçon de VBA et non une solution VBA avec Power Query !

Cdlt.

39boogiedoogle.xlsm (31.66 Ko)

Bonjour Jean-Eric, et merci pour ta réponse.

Je viens de voir ton fichier. L'idée me semble bonne, cependant lorsque je sélectionne le nom dans la liste déroulante, l'erreur "les données n'ont pas pu être récupérées de la base de données" s'affiche.

Sinon effectivement je pourrais adapter ce type de format pour contourner mon problème via la VBA (sauf si quelqu'un saurait d'où vient ce problème).

Bonjour,

J'ai le même soucis,

en attendant, une autre version

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A5")) Is Nothing Then Exit Sub
Dim obj As New DataObject
    ActiveSheet.Cells.UnMerge
    Range("A11").CurrentRegion.Offset(1, 0).ClearContents
    DoEvents
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", [F5], False
        .Send
        If .Status = 200 Then
                txt = "<table" & Split(Split(.responseText, "<table")(8), "</table>")(0) & "</table>"
                obj.SetText txt
                obj.PutInClipboard
                Range("A11").Select
                ActiveSheet.Paste
        End If
    End With
End Sub
19test.xlsm (39.70 Ko)

Bonjour Steelson, merci également pour votre réponse. Effectivement sur votre fichier le code fonctionne parfaitement et on se rapproche clairement de ce que je recherche, il me manque simplement une petite chose.

Avec ma macro, j'effectuais des changements sur mon tableau : j'effectuais un tri décroissant sur la colonne G, et je ne conservais que les 10 dernières données ; en clair, seule une partie du tableau initial est conservée. Auriez-vous une idée pour effectuer ce type de manipulation ?

Merci encore pour votre aide;

Steelson, j'ai essayé d'appliquer ce code dans un autre fichier excel dans lequel j'ai beaucoup de mises en forme, lors de l'activation du code, je me retrouve avec des cellules "défusionnées", des alignements décalés etc...faut-il peut-être, pour contourner ce problème, ainsi que résoudre mon problème précédent de récupération précises des données, que le tableau importé se créé dans une nouvelle feuille, pour ensuite effectuer un collage spécial de valeurs sur mon tableau principal ?

Désolé pour le dérangement je débute à peine dans la macro il y a sûrement des évidences qui m'échappent

Pour re-coller à la place des anciennes valeurs j'ai dû défusionner car le tableau en ligne comporte malheureusement parfois et parfois pas des fusions dans la table.

On va attendre la réponse de Jean-Eric, sa solution est plus actuelle et professionnelle.

Je regarderai ce soir le code que je t'ai proposé pour éviter tout cela !

C'est très sympa merci !

Re,

Vérifie tes options de Power Query.

Mon Excel est en anglais (pour le moment), mais tu dois pouvoir t'y retrouver :

iso4217

Sinon, il faut que toutes les tables aient le même index ou que les noms des ces dernières soient identiques (!?).

A te relire.

Cdlt.

Re Jean-Eric,

Donc c'est ok j'ai réglé le niveau de Confidentialité comme indiqué sur ton image, et effectivement la macro fonctionne.

Concrètement, sur les tables, les index ou leur noms importent peu, car lorsque j'effectue l'importation de données sur mon fichier initial, seules les données "intérieures" sont copiées ; les index sont déjà présents sur la ligne juste au-dessus de la ligne sur laquelle je copie mes données (j'espère que mon explication n'est pas trop confuse).

Ce qui m'intéresse, c'est d'importer les 10 lignes de données (donc hors index) après avoir effectué un tri décroissant de la seconde colonne G
Merci encore.

Juste pour clore la proposition VBA

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A5")) Is Nothing Then Exit Sub
Dim obj As New DataObject

    Range("A11").CurrentRegion.Offset(1, 0).ClearContents
    DoEvents
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", [F5], False
        .Send
        If .Status = 200 Then
                txt = "<table" & Split(Split(.responseText, "<table")(8), "</table>")(0) & "</table>"
                obj.SetText txt
                obj.PutInClipboard
                Range("A11").Select
                ActiveSheet.Paste
        End If
    End With

    ' suppression lignes
    For i = Cells(Rows.Count, 1).End(xlUp).Row To 13 Step -1
        If Cells(i, 1) = "Rk" Then Rows(i).Delete Shift:=xlUp
    Next
    der = Cells(Rows.Count, 1).End(xlUp).Row
    If der - 10 > 13 Then Rows("13:" & der - 10).Delete Shift:=xlUp

    ' tri
    der = Cells(Rows.Count, 1).End(xlUp).Row
    Range("A12:AD" & der).Select
    ActiveWorkbook.Worksheets("Stats").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Stats").Sort.SortFields.Add Key:=Range("G13:G" & der) _
        , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Stats").Sort
        .SetRange Range("A12:AD" & der)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

End Sub
16test.xlsm (29.03 Ko)

Re,

Ton lien comporte x tables variables.

Celle qui nous intéresse est la table 2019-20...

Quel est le nom de la colonne qui doit être triée et que nommes-tu Index ?

Souhaites-tu un top 10 après le tri de cette colonne ?

Doit-on modifier le format des champs ? Des calculs sont-ils à envisager avant ou après le chargement dans la feuille de calcul ?

iso4217

Merci Steelson pour ton retour, effectivement on s'y approche aussi, sauf que j'ai besoin des 10 premières lignes après le tri décroissant de la colonne G (j'avoue c'est précis)

Jean-Eric, je réponds point par point :

Effectivement les données sont dans la table 2019-20

Le nom de la colonne qui doit être triée de façon décroissante est la colonne nommée G (la deuxième)

Effectivement, après un tri décroissant de la colonne nommée G, je souhaite isoler les 10 premières lignes de données.

Dans l'idéal, le format des champs doit être le même que lorsque l'on fait un collage spécial par valeur (afin de n'avoir que les nombres dans les cellules et aucune autre mise en page), mais je pense que si ce n'est pas le cas ça doit être suffisant.

Pour ce qui est des calculs, tout est déjà en place dans mon fichier principal avec des formules déjà placées sur d'autres cellules, j'ai juste à coller les 10 lignes de données afin que tous les calculs se fassent automatiquement.

Merci en tout cas pour le temps pris c'est très sympa

P.S. : Du coup j'ai essayé de me servir de ton tout premier fichier qui était très bien, j'ai juste eu à faire un truc décroissant sur la colonne G, et à chaque fois que je sélectionnais un nouveau nom dans la liste déroulante, le tri décroissant restait en place, c'était parfait. Simplement, j'ai essayé de faire en sorte que le nom dans la liste déroulante s'affiche par rapport à la cellule d'une autre chose feuille, tout simplement en faisant par exemple "=Feuil1!A5", sauf que ça ne s'affiche pas (j'aurais tenté).

Re,

Une mise à jour pour le tri et le Top 10.

Cdlt.

Merci Steelson pour ton retour, effectivement on s'y approche aussi, sauf que j'ai besoin des 10 premières lignes après le tri décroissant de la colonne G (j'avoue c'est précis)

j'effectuais un tri décroissant sur la colonne G, et je ne conservais que les 10 dernières données

10 premières ou 10 dernières ?

de toute façon tu peux manipuler la macro ci-dessous à ta guise (ma valeur ajoutée est plus sur la récup des infos du site)

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A5")) Is Nothing Then Exit Sub
Dim obj As New DataObject

    Range("A11").CurrentRegion.Offset(1, 0).ClearContents
    DoEvents
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", [F5], False
        .Send
        If .Status = 200 Then
                txt = "<table" & Split(Split(.responseText, "<table")(8), "</table>")(0) & "</table>"
                obj.SetText txt
                obj.PutInClipboard
                Range("A11").Select
                ActiveSheet.Paste
        End If
    End With

    ' suppression lignes
    For i = Cells(Rows.Count, 1).End(xlUp).Row To 13 Step -1
        If Cells(i, 1) = "Rk" Then Rows(i).Delete Shift:=xlUp
    Next

    ' tri
    der = Cells(Rows.Count, 1).End(xlUp).Row
    Range("A12:AD" & der).Select
    ActiveWorkbook.Worksheets("Stats").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Stats").Sort.SortFields.Add Key:=Range("G13:G" & der) _
        , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Stats").Sort
        .SetRange Range("A12:AD" & der)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

    ' on conserve les 10 premiers
    der = Cells(Rows.Count, 1).End(xlUp).Row
    If der > 23 Then Rows("23:" & der).Delete Shift:=xlUp

End Sub
11test.xlsm (29.13 Ko)

Si la version de Jean-Eric te satisfait, reste là-dessus (ma mise à jour est juste faite pour ne pas laisser traîner une version en écart par rapport à ta demande).

Bonjour messieurs et merci pour vos 2 fichiers,

Steelson désolé pour ma confusion, sans tri il s'agissait effectivement des 10 dernières (les plus récentes en fait). Ta solution réponds également à ma demande, merci pour le temps pris

Jean-Eric, ton fichier convient très bien je vois qu'en plus je peux étendre la liste, les noms et tableaux s'ajoutent automatiquement c'est top, il y a simplement 2 petites choses que j'aimerais pouvoir faire pour vraiment le rendre parfait (si cela est possible) :

- Je souhaite que la cellule B4 (Sélection), récupère le nom de la liste sur une autre feuille via par exemple =Feuil1!A5 ; lorsque je le le fait, le nom apparaît bien dans la cellule Sélection, mais le tableau ne se charge pas, aurais-tu une solution ?

- Je souhaite créer plusieurs copies de cette feuille Stats, afin que par exemple, dans ma Feuil1, le nom en A5 aille se copier dans la feuille Stats, puis un autre nom en A10 aille se copier dans une autre feuille Stats2 par exemple etc...de la sorte, je pourrais copier les données de chaque feuille Stats, dans mon tableau récap en Feuil1.

Merci encore pour votre aide c'est très sympa.

Bonjour,

Je crains de ne pas comprendre tes questions.

Reprends mon dernier fichier, intègre tes demandes.

Envoie ce nouveau fichier.

Cdlt.

Désolé pour la confusion Jean-Eric, voici le fichier avec le tableau récap dans lequel je souhaite mettre les données, ainsi que des explications (je l'espère plus précises) de ce que je recherche.

Encore une fois, merci d'avance pour votre aide.

18boogiedoogle-v2.xlsm (108.19 Ko)

Bonjour Jean-Eric,

As-tu pu voir avec ce nouveau fichier si ma demande était plus claire ?

Merci pour ton aide

Bonjour à tous,

Jean-Eric, je me suis finalement servi de ton dernier fichier, et adapté à mes besoins, et pour le coup ça m'a beaucoup aidé, merci beaucoup !

Une petite question, j'essaie dans le Power Query de changer la table, or j'ai beau vérifier toutes les étapes que tu as mises, je n'arrive pas à trouver à quel moment tu as sélectionné celle-ci...Pourrais-tu m'aider ?

Encore merci.

Rechercher des sujets similaires à "probleme import donnees web vba"