IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Problème import tableau depuis web


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2018
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 21
    Par défaut Problème import tableau depuis web
    Bonsoir, j'ai beaucoup avancer grâce au magnifique tuto d'internet et je parviens presque à faire ce que je souhaite avec le vba. Seul un problème subsiste c'est que lorsque j'importe un tableau de données dans excel et bien au bout d'un moment tout fout le camp. Je m'explique :
    La macro ouvre une page web / se connecte ouvre une autre page de résultat de donnée / j'importe ces données. Des fois c'est nickel dès fois les résultats se décale. je relance la macro ça se décale encore plus.
    On dirait qu'il y a un problème dans mes variables. Au bout d'un moment elles deviennent folles.
    Pour la m^me Macro lancées 2 fois d esuite je n'ai pas le m^me résultat qui apparait. OUF

    Pouvez vous me secourir, je dors sur ce trucs depuis des jours. Merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    'Option Explicit
    Sub Educaplay()
     
     Dim MyHTML_Element As IHTMLElement
     Dim MyHTML_Element2 As IHTMLElement
     Dim MyURL As String
     'Dim ele As Object
     Dim htmlselectelElement As HTMLGenericElement
     'Dim Nb As Integer
     Dim MyBrowser As InternetExplorer
     Dim HTMLDoc As HTMLDocument
     Dim ie As SHDocVw.InternetExplorer
     
    Dim Nombre_colone As Integer
    Dim Nombre_Ligne As Integer
    Dim Nombre_R As Integer 'Nb de résultats
    Dim k As Integer 'chiffre pour remplir le tableau
    Dim Valeur As Date
    Dim i As Integer
    Dim j As Integer
     
     
     
     
     
     On Error GoTo Err_Clear
     MyURL = "https://fr.educaplay.com/login/"
     Set MyBrowser = New InternetExplorer
     MyBrowser.Silent = True
     MyBrowser.Navigate MyURL
     MyBrowser.Visible = True
     Do
     Loop Until MyBrowser.ReadyState = READYSTATE_COMPLETE
     Set HTMLDoc = MyBrowser.Document
     HTMLDoc.all.user.Value = "*************" 'Enter your email id here
     HTMLDoc.all.pass.Value = "********" 'Enter your password here
     For Each MyHTML_Element In HTMLDoc.getElementsByTagName("button")
     If MyHTML_ID.Type = "loginNormal" Then MyHTML_Element.Click: Exit For
     Next
    Err_Clear:
     If Err <> 0 Then
     Err.Clear
     Resume Next
     End If
     
     'start a new browser instance
        Set objIE = New InternetExplorer
        'make browser visible
        objIE.Visible = True
     
     objIE.Navigate "https://fr.educaplay.com/fr/miEducaplay.php?action=resultadosGrupo"
    Do While objIE.Busy = True Or objIE.ReadyState <> 4: DoEvents: Loop
     
     
     
    'Sélection de la ligne correspondant à 1TCB 2017-2018
    Set IEDoc = objIE.Document
    'oDoc.getElementsByName("idGrupoBusqueda")(0).Value = "149524" '1TCB 2017-2018
    IEDoc.parentWindow.execScript "POST", "javascript"
    IEDoc.getElementsByName("idGrupoBusqueda")(0).Value = "292868" 'TCB 2018 -2021 ==============CHANGEMENT CODE GROUPE EDUCAPLAY
    IEDoc.forms(1).submit
    Do While objIE.Busy = True Or objIE.ReadyState <> 4: DoEvents: Loop
     
     
     
     
     
    'Worksheets(Feuil1).Range("A:ZZ").ClearContents
     
     
     
    'Valeur = 0
    ' Valeur = Timer 'temporisation pour le rafraichissement de la page
    '    Do While Timer < Valeur + 7
    '    DoEvents
    '    Loop
    '
     
     
    Set HTML = objIE.Document '========!!!!!!!!!!!LIGNE OBLIGATOIRE POUR LIRE TABLEAU!!!!!!!!!!=============
     
     
     
     
     
     
     
     
    '======================Boucle pour mise à jour page======================
     
    ' j = 2
    ' i = 2
    ' k = 0
     
            'recherche le nombre de ligne elève
            Nombre_Ligne = HTML.getElementsByTagName("thead")(1).Children.Length
    'boucle pour ecrire nom des élèves dans ligne colonne 1 tableau
    For j = 2 To (Nombre_Ligne + 2)
     
            'emplacement ecriture nom eleve
            Worksheets("FEuil1").Cells(j, 1) = HTML.getElementsByTagName("thead")(1).Children(j - 2).innerText
            'MsgBox Nombre_Ligne
    Next j
     
            'recherche le nombre de colonne machine
            Nombre_colone = HTML.getElementsByTagName("tr")(0).Children.Length
            'MsgBox Nombre_colone
            'boucle pour ecrire nom des machines dans colonne tableau
    For i = 2 To (Nombre_colone + 2)
     
            'emplacement ecriture nom machine
            'Worksheets("FEuil1").Cells(1, i) = HTML.getElementsByTagName("th")(i - 2).innerText
            Worksheets("FEuil1").Cells(1, i) = HTML.getElementsByTagName("tr")(0).Children(i - 2).innerText
    Next i
     
     
     
    For j = 2 To Nombre_Ligne + 1
          For i = 2 To (Nombre_colone + 1)
            'Nombre_R = HTML.getElementsByTagName("td").Length
     'To Nombre_R
            'remplissage avec résultat
            Worksheets("FEuil1").Cells(j, i) = HTML.getElementsByTagName("td")(k).innerText
    k = k + 1
          Next i
    Next j
     
    'Set MyObject = Nothing
     
     
    objIE.Close
    'Set objIE = Nothing
    'Set objIE.Document = Nothing
    End Sub



    PS :je suis débutant

  2. #2
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Bonjour,

    Pour comprendre ce qui se passe, il faut faire du dépannage en pas à pas.
    Mettre un point d'arrêt sur une ligne (faire ALT + F9 sur la ligne) et dérouler le programme avec F8 ou fn+F8 et observer ce qui se passe.

    Pour commencer mettez un point d'arrêt sur la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     For j = 2 To Nombre_Ligne + 1
    , lancer la macro et au point d'arrêt, poursuivez avec F8 ou fn + F8

    Rappel:
    F8 ou fn + F8: Exécution du programme en pas à pas
    F5 ou fn + F5: Exécution du programme dans son intégralité ou bien s'arrête au prochain point d'arrêt rencontré

    Cdlt

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2018
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 21
    Par défaut J'ai essayé mais en vain
    Bon j'ai essayé main en vain, je ne comprend pas du tout ce qui se passe.
    je relance 2 à trois fois la macro et cela continue de remplir mon tableau en corrigeant certaines erreur et en supprimant d'autre.
    Et au bout de 4 à 5 fois quand on croit que le tableau est rempli correctement cela re-deraille.
    Je désespère

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 242
    Par défaut
    Bonjour,

    Si tu veux garder un tant soit peu la maîtrise de ton code, il faut éviter d'inhiber les erreurs !
    Commence donc par virer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    On Error GoTo Err_Clear
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Err_Clear:
     If Err <> 0 Then
     Err.Clear
     Resume Next
     End If
    Car il est fort probable que ce soit l'origine du comportement bizarre lors de l'exécution de ta macro.
    Du coup, tu vas sûrement avoir des erreurs, que tu devras corriger au lieu de les ignorer !


    Par exemple, je te trouve bien optimiste en espérant à tous les coups récupérer directement le texte que tu souhaites avec une instruction comme celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("FEuil1").Cells(j, 1) = HTML.getElementsByTagName("thead")(1).Children(j - 2).innerText
    Parce que là, pour chaque ligne de ton tableau, tu récupères l'ensemble des tableaux de la page

    Il vaut mieux procéder par étapes : d'abord récupérer la collection de thead, puis, si la collection récupérée n'est pas vide, identifier l'élément que tu veux (est-ce toujours celui qui a pour index 1 ?), et ensuite, mais seulement lorsque tu es sûr d'avoir identifié le tableau que tu veux aspirer, tu peux boucler pour récupérer les lignes que tu souhaites.

    Et si tu fais comme ça, il n'y a pas de raison pour que tu aies besoin d'utiliser un On Error.

  5. #5
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2018
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 21
    Par défaut Suite explication
    RE-Bonjour,
    En faite j'obtiens avec le code présenté exactement le tableau recherché à un détail près c'est que les score se décale de manière aléatoire dans le tableau.
    A partir de la 6e ligne des résultats c'est n'importe quoi. Aucune fiabilité
    JE pense que c'est soit pb de page web qui ne se rafraichit pas assez vite. J'ai essayé de mettre des tempo en vain
    Ou un probleme de variable à reseter.
    Mais comme j'ai codé comme un "porcinet" impossible d'enlever les on error sinon je passe m^me pas la page de l'authentification.
    J'ai essayer de repartir sur des bases propre sur une connection login mais j'ai des message d'erreur 91 "pas compris"!!!!

    JE sais que le mieux serait de reprendre depuis le début

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 242
    Par défaut
    Bizarre ton choix de fermer les yeux dès la première erreur. Voici une piste pour la corriger :
    Dans ta boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each MyHTML_Element In HTMLDoc.getElementsByTagName("button")
     If MyHTML_ID.Type = "loginNormal" Then MyHTML_Element.Click: Exit For
    Next
    d'où sort MyHTML_ID ? on peut imaginer que MyHTML_Element conviendrait mieux.
    De plus, en y regardant d'un peu plus près, loginNormal semble plutôt correspondre à une propriété id d'un formulaire, donc tu devrais pouvoir remplacer toute cette boucle For Each ... Next par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HTMLDoc.getElementById("loginNormal").Submit
    Je n'ai pas testé, mais ça devrait t'aider dans un premier temps à te passer de ton On Error....

    Au pire, si tu ne parviens pas à corriger l'erreur que tu veux inhiber lors de ton étape de connexion, tu places l'instruction On Error Goto 0 dans ton code dès que tu as passé cette étape qui plante.

    Entre temps, continue à te plonger dans le tuto dont tu parles, ça ne peut que t'aider à progresser.

    PS : vu que malgré l'erreur de connexion tu accèdes au tableau, c'est que soit tu es déjà connecté, soit le site est paramétré pour se souvenir de toi et te connecter automatiquement, soit il n'y a pas besoin de se connecter ! Et que donc tu n'as pas forcément besoin de gérer la connexion au site dans ton code...

  7. #7
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2018
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 21
    Par défaut Suggestion réalisé et fonctionne en partie
    Merci Zenpbb pour ton aide j'ai fait ce que tu m'as dit et cela a supprimé les erreurs de départ.
    Mais j'ai toujours un problème sur ma boucle de récupération des notes qui s'arrête en cours d’exécution avec une erreur 424 objet requis. Je n'obtiens simplement les 5 premières lignes de résultat. Ça bloque à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("FEuil1").Cells(m, l) = HTML.getElementsByTagName("table")(0).Children(2).Children(m - 2).Children(l - 2).innerText
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    '======================Boucle pour mise à jour page======================
     
    Dim Nombre_colone As Integer
    Dim Nombre_Ligne As Integer
    Dim Nombre_R As Integer 'Nb de résultats
    Dim k As Integer 'chiffre pour remplir le tableau
    Dim Valeur As Date
    Dim I As Integer
    Dim j As Integer
    Dim l As Integer
    Dim m As Integer
     
     
     
     Worksheets("Feuil1").Cells.Select
    Selection.Delete Shift:=xlUp
     
     
    '======================IMPORT NOTE EDUCAPLAY CLASSE 1======================
     
     
            'recherche le nombre de ligne elève
            Nombre_Ligne = HTML.getElementsByTagName("thead")(1).Children.Length
    'boucle pour ecrire nom des élèves dans ligne colonne 1 tableau
    For j = 2 To (Nombre_Ligne + 1)
     
            'NN = HTML.getElementsByTagName("thead")(1).Children(9).innerText
            'emplacement ecriture nom eleve
            'NN = Worksheets("FEuil1").Cells(j, 1)
            Worksheets("FEuil1").Cells(j, 1) = HTML.getElementsByTagName("thead")(1).Children(j - 2).innerText
            'MsgBox NN
     
    Next j
            'recherche le nombre de colonne machine
            Nombre_colone = HTML.getElementsByTagName("tr")(0).Children.Length
            'MsgBox Nombre_colone
            'boucle pour ecrire nom des machines dans colonne tableau
    For I = 2 To (Nombre_colone + 1)
     
            'emplacement ecriture nom machine
            'Worksheets("FEuil1").Cells(1, i) = HTML.getElementsByTagName("th")(i - 2).innerText
            Worksheets("FEuil1").Cells(1, I) = HTML.getElementsByTagName("tr")(0).Children(I - 2).innerText
     
     
    'note eleve
    'Worksheets("FEuil1").Cells(j, I) = HTML.getElementsByTagName("table")(0).Children(2).Children(j - 2).Children(I - 2).innerText
    'Worksheets("FEuil1").Cells(j, I) = NN
     
     
    Next I
     
    Application.Wait (Now + TimeValue("0:00:01"))
     
    Nombre_Ligne1 = HTML.getElementsByTagName("table")(0).Children(2).Children().Length
    Nombre_colone1 = HTML.getElementsByTagName("table")(0).Children(2).Children(0).Children().Length
     
    For m = 2 To Nombre_Ligne1 + 1
          For l = 2 To Nombre_colone1 + 1
     
     
            'remplissage avec résultat
     
        Worksheets("FEuil1").Cells(m, l) = HTML.getElementsByTagName("table")(0).Children(2).Children(m - 2).Children(l - 2).innerText
    'k = k + 1
     
     
     
          Next l
     
    Next m

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Importer un tableau depuis une page Web
    Par Barahni dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/02/2017, 12h46
  2. Réponses: 1
    Dernier message: 04/01/2012, 17h12
  3. Problème d'import de projet web Java
    Par L'aigle de Carthage dans le forum Développement Web en Java
    Réponses: 1
    Dernier message: 14/09/2011, 15h46
  4. Problème d'importation de projet web dans eclipse 3.4
    Par sinfos dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 01/08/2009, 20h10
  5. Réponses: 0
    Dernier message: 29/05/2009, 13h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo