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

Contribuez Discussion :

[Pilotage Internet Explorer] Comment attendre la mise à jour d'un élément d'une page web …


Sujet :

Contribuez

  1. #1
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut [Pilotage Internet Explorer] Comment attendre la mise à jour d'un élément d'une page web …

    Bonjour !

    • Le minimum de connaissances pour appréhender le sujet se trouve dans l'excellent tutoriel

    • Merci de poser dans cette contribution uniquement des questions relatives au code en démonstration.

    Pour tout sujet similaire, merci de créez votre discussion dans le forum dédié Macros et VBA Excel,
    là où il y a le plus d'intervenants et forcément avec le plus de chances d'obtenir une solution …

    • Cas d'itwoo dans sa discussion Pilotage Internet Explorer :

    une cotation est affichée par défaut avec un historique de trois mois sur le site NASDAQ.
    Or en pilotant IE pour requérir l'historique sur dix ans, la propriété ReadyState est inopérante
    (car active uniquement lors de la création de la page) lors de la mise à jour de l'élément (<table>) …

    Le premier réflexe est de temporiser la procédure de dix secondes par exemple.
    Oui mais si le site subit un ralentissement, ce sera bien insuffisant …
    Et si le projet a besoin d'effectuer différentes requêtes, par exemple un paramètre de six mois au lieu de dix ans,
    temporiser au maximum est préjudiciable lorsqu'une requête ne nécessite pas plus de trois secondes !

    • L'astuce est simple : elle consiste à attendre la valeur zéro de la propriété length d'une collection de l'élément.

    Mais encore faut-il pointer correctement la collection avant de boucler sur la propriété …
    Démonstration aérée & épurée de variable objet (pour suivre la hiérarchie des éléments via l'indendation),
    à copier directement dans le module d'une feuille de calculs :
    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
    Sub DemoNASDAQie()
        Const URL$ = "http://www.nasdaq.com/symbol/abbv/historical"
        Const TXT$ = "        Import en cours "
        Application.StatusBar = TXT & "…"
     
        With CreateObject("InternetExplorer.Application")
            .Navigate URL
            While .Busy Or .ReadyState < 4:  DoEvents:  Wend
     
            With .Document
                If InStr(.body.innerHTML, URL) Then
                    With .all("ddlTimeFrame"):  .Value = "10y":  .onchange:  End With
     
                    With .GetElementsByTagName("table")
                        With .Item(2).all:   While .Length:  DoEvents:  Wend:   End With
                        T$ = .Item(2).outerHTML
                    End With
                End If
            End With
     
            .Quit
        End With
     
        If T = "" Then
            Beep
        Else
            With CreateObject("HTMLFile")
                .Write T
     
                With .GetElementsByTagName("table")(0).Rows
                    ReDim VA(1 To .Length, 1 To .Item(0).Cells.Length)
     
                    For R& = 1 To .Length
                        Application.StatusBar = TXT & ": " & Format$(R, "@@@@")
     
                        With .Item(R - 1).Cells
                            For C& = 1 To .Length:  VA(R, C) = .Item(C - 1).innerText:  Next
                        End With
                    Next
                End With
            End With
     
            Application.ScreenUpdating = False:  [A2].Select:  ActiveWindow.FreezePanes = True
     
            With [B1].Resize(UBound(VA), UBound(VA, 2))
                With .Columns("B:E")
                    .HorizontalAlignment = xlRight:  .IndentLevel = 1:  .NumberFormat = "0.0000"
                End With
     
                With .Rows(1):  .Font.Bold = True:  .HorizontalAlignment = xlCenter:  End With
                                         .Columns(1).HorizontalAlignment = xlCenter:  .Value = VA
                If .Cells(2, 1).NumberFormat <> .Cells(3, 1).NumberFormat Then .Rows(2).Delete
            End With
        End If
     
        Application.StatusBar = False:  End
    End Sub
    L'astuce est en ligne n°15 (la précédente pointant sur la collection d'éléments table de la page).

    While .Length (old school style) est équivalent à While .Length <> 0

    Tenté de la simplifier ainsi : While .Item(2).all.Length > 0: DoEvents: Wend ?
    Mal vous en prendrait !
    Vous seriez face au dragon du Loch NES : une boucle sans fin ! (NES : Never Ending Story !)
    Car en pointant dans la boucle systématiquement sur la table visée et sa collection,
    la valeur retournée ne renvoie jamais zéro mais soit celle d'origine, soit celle du résultat de la requête.

    En verrouillant préalablement l'élément et sa collection dans la ligne n°15, zéro est bien renvoyé dans la boucle
    une fois l'élément à jour car ayant été modifié, le pointeur de son ancien état a été vidé …
    Il faut de nouveau cibler l'élément pour accéder à son nouveau contenu comme dans la ligne n°16 …

    Peu importe la collection pointée de l'élément, dans le cas d'une table, cells ou rows font aussi l'affaire …

    • Afin de se rendre compte de l'efficacité de cette astuce,
    remplacer le code "abbv" comportant à ce jour un historique de moins de deux ans
    dans l'adresse URL (ligne n°2) par "f" en disposant d'un de plus de dix ans : le temps d'exécution s'en ressent …

    • Les données de l'élément à jour peuvent directement être lues dans IE après cette boucle d'attente.

    Mais c'est bien plus long (+ 3 secondes pour un historique de dix ans) que de réinjecter le code HTML
    de l'élément dans une page locale hors IE puis d'y extraire les données (ligne n°16 et bloc de 27 à 41) …
    Deux astuces pour le prix d'une !

    Qui plus est dans ce cas de données en version anglo-saxonne (dates & séparateurs de milliers et décimal)
    vers une version Excel française, alimenter une variable tableau de type Variant
    laisse le loisir au VBA de les convertir automatiquement !

    __________________________________________________________________________________________________

    • Piloter IE est une méthode lente …

    Parfois une table est directement récupérable en VBA via l'objet QueryTable
    ou directement dans la feuille via le menu Données, Nouvelle requête sur le Web

    Lorsque ce n'est pas possible, il y a encore la méthode utilisant une librairie XMLHTTP, la plus rapide.
    En poursuivant la discussion d'itwoo, voir en page 7 le post #130 de Stéphane
    (Qwazerty l'auteur du tutoriel en préambule !) …

    Dans les pages suivantes est abordée une manière de rapatrier des données situées sur plusieurs pages web
    puis une adaptation rock 'n roll de patricktoulon (pages 10 & 11) pour accélérer le tout,
    mais là ce n'est pas vraiment pour débutant ! …

    A noter aussi en fin de la page 4 l'idée de Stéphane en pilotant IE de
    contrôler l'état de la mise à jour par le biais de la présence d'un gif animé :


    • Autres références utiles :


    ________________________________________________________________________________________________
    __
    Le but principal de l’enseignement mathématique est de développer certaines facultés de l’esprit et parmi elles l’intuition n’en est pas la moins précieuse.
    C’est par elle que le monde mathématique reste en contact avec le monde réel et, quand bien même les mathématiques pures pourraient s’en passer,
    il faudrait toujours y avoir recours pour combler l’abîme séparant le symbole de la réalité …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonsoir Marc

    j'étais tellement pressé de voir ca que malheureusement je suis déçu

    ce ne fonctionne pas ta boucle d'attente "boucle tant que c'est 0"

    je viens de l'essayer et pour 10 ans je me retrouve avec 450 lignes hors il y en a 2520

    j'ai compris ton principe mais trop hasardeux quand on sais que tout le monde n'a pas un ordi a réaction

    sur le pc portable j'obtiens 268 lignes
    sur le fixe relativement puissant j'obtiens 450 lignes
    et sur le gameur j'ai presque tout

    met des espions bien placé tu verra que j'ai raison

    quand la mise ajour de la page Nasdaq se fait elle se fait en plusieurs fois

    j'en avais fait le test déjà dans une simple boucle avec le getelement.......length

    et a chaque changement ta boucle a passer le premier est c'est donc arrété
    c'est pour ca que ca ne peut pas marcher ta solution tout du moins dans ce cas précis
    je vais examiner ton point de vue
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut Heu …

    Comme expliqué dans la contribution initiale, la boucle c'est tant que c'est différent de zéro ou à la rigueur supérieur à zéro !
    La page initiale chargée, il y a donc trois mois, la valeur est bien supérieure à zéro …
    En respectant la méthode, le pointeur passe à zéro une fois la mise à jour de l'élément effectué,
    donc la boucle est bien tant que c'est différent de zéro …

    Cela fonctionne pourtant bien de mon côté avec des PC portables bien plus lent que ton PC gamer !
    Tests sur un i3 et un i5, j'ai pas testé avec le i7 …

    C'est une adaptation d'une astuce trouvée pour une connaissance avec une page similaire,
    PC de bureautique classique, pas une machine très performante …

    Par défaut la démonstration est avec la cotation "abbv" qui n'a pas deux ans d'historique …
    Le "f" dispose de dix ans, t'as bien changé l'URL du code ?
    Je passe de l'une à l'autre sans souci, 23 secondes pour la cotation "f" sur le i5 en Wi-Fi …
    Je viens de tester avec succès en commutant le portable sur batterie et la fréquence abaissée à 1.5Ghz, pas de souci !

    A part la modification de la cotation, t'as laissé mon code tel quel ?
    Car selon comment est pointé l'élément - idem via une variable objet - il peut y avoir des surprises !

    A moins est-ce la version d'IE en cause ? v9 sur le i5, à vérifier pour les autres …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    Autant pour moi j'avais mal enlevé le abbv

    bon ca marche mais connaissant bien cette page par cœur maintenant ca n'est pas logique

    mais bon a essayer sur d'autre pages on verra bien
    c'est du bon boulot
    j'ai un peu remanier la partie tableau j'espère que tu m'en voudra pas j'ai tellement travaillé avec les tableaux et les dictionnaires qu'il me sortent pas les yeux

    enfin ca reste un peu long quand même pour ce genre de travaille une requete reste le meilleur moyen
    code remanier a ma sauce
    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
     
    Sub DemoNASDAQie()
        debut = T$
        Const URL$ = "http://www.nasdaq.com/symbol/f/historical"
        Const TXT$ = "        Import en cours "
        Application.StatusBar = TXT & "…"
        With CreateObject("InternetExplorer.Application")
            .Navigate URL
            While .Busy Or .ReadyState < 4: DoEvents: Wend
            With .Document
                If InStr(.body.innerhtml, URL) Then
                    With .all("ddlTimeFrame"): .Value = "10y": .onchange: End With
                    With .getelementsbytagname("table")
                        With .Item(2).all: While .Length: DoEvents: Wend: End With
                        T$ = .Item(2).outerhtml
                    End With
                End If
            End With
            .Quit
        End With
        If T = "" Then
            Beep
        Else
            With CreateObject("HTMLFile")
                .Write T
                faire = .ParentWindow.clipboardData.SetData("text", .body.innerhtml)
                nblignes = .getelementsbytagname("table")(0).Children(1).Children.Length
                nbcols = .getelementsbytagname("table")(0).Children(1).Children(1).Children.Length
            End With
     
            Application.ScreenUpdating = False
     
            With ActiveSheet
                [A2].Select
                ActiveWindow.FreezePanes = True
                [b1].Select
                .Paste
     
                With [b1].Resize(nblignes, nbcols)
                    With .Columns("B:E")
                        .HorizontalAlignment = xlRight: .IndentLevel = 1: .NumberFormat = "0.0000"
                    End With
                    With .Rows(1): .Font.Bold = True: .HorizontalAlignment = xlCenter: End With
                    .Columns(1).HorizontalAlignment = xlCenter:
                    If .Cells(2, 1).NumberFormat <> .Cells(3, 1).NumberFormat Then .Rows(2).Delete
                End With: End With
        End If
        Application.StatusBar = False: End
    End Sub
    sinon une toute petite requête fait aussi bien
    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
     
    Sub pageblanche2()
    Columns("a:f").ClearContents
    End Sub
    Sub truc()
     pageblanche2
     Application.ScreenUpdating = False
     Dim demandefichier As Object, code, debut, DataObj As Object
    debut = Time
    URL = "http://www.nasdaq.com/symbol/f/historical"
    Set demandefichier = CreateObject("Microsoft.XMLHTTP")
    demandefichier.Open "POST", URL, False
    demandefichier.setRequestHeader "Content-Type", "application/json"
    demandefichier.send "10y|false|F"
      With CreateObject("htmlfile")
      .write demandefichier.responsetext
     faire = .ParentWindow.clipboardData.SetData("text", .getelementsbytagname("table")(0).outerhtml)
     
     With Sheets(1)
            .Cells(1, 1).Select
            .Paste
        End With
    faire = .ParentWindow.clipboardData.ClearData("text")
    End With
    MsgBox "la requete a demaré a : " & debut & " et a terminé a : " & Time & vbCrLf & "elle aura donc duré : " & Format(Time - debut, "nn:ss") & " secondes"
    Application.ScreenUpdating = True
    bon en tout cas voila une bombinette bien placée
    joli boulot Merci
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut



    Tu as quand même réussi à me faire douter quelque peu !

    Si cette méthode est logique : c'est la nature de la programmation objet et d'une page web …
    Respecter la règle TBTO

    Évidemment c'est plus rapide via la méthode utilisant une bibliothèque XmlHttp,
    comme je l'ai déjà souligné en fin de mon message initial …

    Mais quand il n'y a pas d'autre moyen pour accéder à des données (login, identication, pages intermédiaires, …)
    cette contribution pourrait s'avérer utile …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re oui je suis d'accord avec toi

    mais je le repete ca ne devrait pas marcher

    fait en une avec dans la boucle l'inscription dans une cellule différente a chaque fois le length tu va avoir une grosse surprise

    mais il faut que j'ai l'occasion de la tester sur d'autre page


    au fait je l'avait oublié celle la bon elle commence a dater mais le principe est toujours le même


    il faudrait que je fasse aussi une contrib sur le/les clipboard outil très intéressant quand même
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut




    J'en suis à deux pages plus celle d'origine avec une problématique différente mais m'obligeant à revenir aux bases,
    m'amenant à contourner de manière équivalente un souci sur une page en attente ressemblant à celle du NASDAQ,
    enfin l'adaptation avec succès à cette dernière m'a conduit à cette contribution …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  8. #8
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut


    Patrick, j'ai testé ta version xml + clipboardData avec ma version xml récupérant les données
    via les collections rows & cells dans une variable tableau comme dans ma démonstration IE,
    franchement elles sont vraiment proches, deux / trois dixièmes de seconde d'écart en ta faveur …

    Mais ta version renvoie les données au format texte, les nombres comme les dates, restées elles aussi en anglais
    tandis que la mienne renvoie les données nickel au moyen d'une variable tableau Variant,
    conversion automatique du VBA ! Du reste j'avais omis de le préciser dans la contribution, c'est corrigé !

    En ajoutant du code pour convertir les données, l'écart serait réduit d'au moins un bon dixième, c'est donc du kif-kif !

    Par contre j'adopterais sans hésiter la méthode clipboardData pour récupérer uniquement du texte
    car c'est vrai cela simplifie bien le code …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  9. #9
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Citation Envoyé par patricktoulon Voir le message
    mais je le repete ca ne devrait pas marcher

    Initialement dans ma présentation :

    Citation Envoyé par Marc-L Voir le message
    En verrouillant préalablement l'élément et sa collection dans la ligne n°15, zéro est bien renvoyé dans la boucle
    une fois l'élément à jour car ayant été modifié, le pointeur de son ancien état a été vidé …
    Il faut de nouveau cibler l'élément pour accéder à son nouveau contenu comme dans la ligne n°16 …

    En poursuivant le fil de la discussion d'itwoo, Stéphane dans son post #94 de la page 5 :

    Citation Envoyé par Qwazerty Voir le message
    Celui-ci semble être rechargé lors du changement de page et donc la synchro entre la variable et l'élément de la page doit se casser
    Patrick, c'est exactement cela ! Voilà pourquoi cela me semble tout à fait logique.
    Et j'en suis arrivé là en menant une réflexion reprenant les bases de ce type de programmation …

    __________________________________________________________________________________________________
    Aller à l'essentiel, penser objet …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  10. #10
    Membre actif
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2013
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2013
    Messages : 411
    Points : 231
    Points
    231
    Par défaut questions
    Bonjour Marc,

    en 1° lieu peut être pourrais tu ajouter ce petit complément souligné à ta présentation si tu es d'accord et si j'ai bien compris:
    Le premier réflexe est de temporiser la procédure de mise à jour de la table de dix secondes par exemple.

    Actuellement j'essaie de vérifier ton post mais j'ai un probléme de boucle infinie mais pas à chaque fois
    Lors de certain lancement (aussi bien avec f que abbv) cela fonctionne en <1 mn, mais parfois ca ne passe pas (j'arréte aprés 1mn)
    Est ce qu'il faut attendre un long moment (3-4mn par exemple?) si connection lente tu crois que ca peut venir de ma connexion et que je n'attends pas assez (surtout pour 10 ans?)

    En tout cas cela bloque ici: With .Item(2).all: While .Length: DoEvents: Wend: End With
    ligne n°13 avec la variable .Length qui bloque de temps en temps...

    Comment fais tu pour suivre l'évolution avec le With CreateObject("InternetExplorer.Application")
    Il semble que tu ne veuilles pas introduire de variable objet du type set fichier_etude = CreateObject("InternetExplorer.Application") pour ne pas perturber...d'accord mais comment suis tu l'évolution dans les variables locales?

    A bientôt

  11. #11
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Bonjour,

    n'est-ce pas assez clair avec la phrase précédente « … lors de la mise à jour de l'élément » ?

    Sinon j'ai testé à 19h30 le code posté tel quel : 7,414 secondes pour charger l'historique complet de la cote abbv
    et 23,461 secondes pour l'historique sur 10 ans de la cote f

    Une boucle sans fin est due soit à la connexion soit à une erreur dans le code …
    Est-ce la connexion ? Peut-être car normalement avec IE c'est soit cela marche soit pas du tout mais toi tu es entre les deux !
    Chronomètre une procédure de Patrick ou de Stéphane utilisant une bibliothèque de requêtes (XmlHttp ou autre)
    puis indique-moi le temps nécessaire de ton côté et un lien sur le post du code afin de pouvoir comparer …

    La ligne indiquée est bien la n°15 - pourquoi de ton côté est-ce la 13 ? Qu'as-tu modifié ?! - servant à détecter
    la mise à jour de la table … Il suffit pourtant juste d'insérer dans le code en ligne n°9 .Visible = True rendant
    IE visible : ainsi tu peux constater l'attente de la mise à jour de la table grâce au gif animé …

    Afin de suivre l'évolution dans la fenêtre des variables locales j'utiliserais effectivement une variable pointant sur un objet
    accompagnée d'un stop, d'un point d'arrêt ou encore d'un espion …
    La présentation du code sans variable objet, grâce aussi à l'indentation,
    permet de suivre (visualiser schématiquement) la hiérarchie des objets de la page web.

    J'ai utilisé avec succès cette méthode sur d'autres pages dans lesquelles une requête via une bibliothèque ne passe pas,
    il faut juste adapter selon la page source …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  12. #12
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonjour tous les deux
    marc ca sert a rien j'ai eu moi aussi le même phénomène Ie10/Ie11 et peut être aussi le site lui même
    exemple :l'objet "xmlhttp" sans header de requête ca ne marche pas pourtant avec IE11 ca marche 2 coup sur 3
    de toute façon ca reste une méthode pas ordinaire avec un contexte a adapter au cas par cas la encore
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  13. #13
    Membre actif
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2013
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2013
    Messages : 411
    Points : 231
    Points
    231
    Par défaut
    Bonjour,

    C'est bien la ligne n°13 qui bloque mais comme tu l'indiques cela doit venir de ma connexion Wifi qui saute par moment (c'était le cas hier) donc soit il faut attendre plus, soit VBA se perd suite à cela...je ne sais pas...mais en temps normal ca marche...

    Pour le reste je regarde...

    Pour les explications tu sais toi tu balades mais nous pas forcément donc parfois un peu plus c'est pas de refus

    Bonne journée

    Bonjour Marc,

    Peux tu faire l'expérience suivante:
    Comme pas moyen de mettre .Visible=True en ligne n°9 je l'ai mis comme suit:

    .Navigate URL: .Visible = True (ligne n°6)

    avec un point d'arrêt dessus pour voir s'afficher IE

    puis pour vérifier la ligne n°13 With .Item(2).all: While .Length: DoEvents: Wend: End With
    mis un point d'arret dessus aussi...
    et bien en relancant avec F8 ou F5, VBA tourne en boucle infinie ici !!!donc apparemment ce n'est pas la connection wifi car si le code n'a pas de point d'arrêt et qu'il est lancé avec F5 tout se passe normalement...alors qu'avec les 2 points d'arrêt ca bloque....

    Voici les variables locales:
    + : Me : : Feuil1/Feuil1
    : VA : : Variant()
    : TXT : " Import en cours " : String
    : R : 0 : Long
    : URL : "http://www.nasdaq.com/symbol/abbv/historical" : String
    : T : "" : String
    : C : 0 : Long

    Si j'ai bien compris ici pas moyen comme pas mis de pointage objet d'avoir l'aperçu détaillé de l'évolution dans la page avec les divers objets affichés en variable locale...donc il faut d'abord faire un repérage classique avec aperçu objet du type set fichier=... puis ensuite relever l'architecture de la page et faire comme tu le fais c'est bien ça?

    A bientôt

    Bonjour Marc,

    Cela ne vient-il pas peut être du fait que si la table charge plus vite que VBA n'arrive de .onchange à With .Item(2).all: While .Length: DoEvents: Wend: End With alors .Length <> 0 est déjà vrai, c'est la longueur de la nouvelle table mise à jour. Il me semble que c'est le probléme que nous rencontrions (mais pas à chaque fois, et qu'il fut trés difficile de trouver et corriger jusqu'à l'idée de la requête de Qwaz qui utilisant une autre méthode supprime cette incertitude) lors du chargement des données qui étaient réparties sur plusieurs pages chez euronext pour l'historique (certaines pages étaient mangées a cause de la différence de vitesse d'analyse entre VBA, IE, et l'affichage de la page web) la cassure/déconnexion entre la page, la donnée IE dont parlait Qwaz...et que tu cites un peu plus haut. Cela marche mais parfois un cas rare produit l'erreur.
    De même pour le Nasdaq Qwaz repéra le gif animé indiquant la fin du processus (comme tu le soulignes) car avant cela sur un grand nombre de valeurs et de tests lancés à la suite sans discontinuer il y avait 1-2% d'erreurs en utilisant un paramétre comme celui ci .Length.
    Donc pour une page l'erreur reste trés peu probable mais si tu le fais sur un grand nombre tu cours un petit risque je crois...
    Qu'en penses tu?

    par contre ton idée de créer VA pour récupérer les datas tout comme le clipboard de Patrick ca semble trés complémentaire suivant le cas rencontré et c'est tip top ca

    A+

  14. #14
    Membre actif
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2013
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2013
    Messages : 411
    Points : 231
    Points
    231
    Par défaut Mise en forme question
    Bonjour Marc,

    Pour ta mise en forme du tableau des data sur la feuille excel qui est épatante peux tu m'expliquer 2-3 points stp?
    Comme tu n'utilises pas de pointeur type set ..=.. sur l'objet il n'y a quasi pas d'info en variable locale donc j'ai du mal à suivre certains passages...
    cette partie va permettre de récupérer les datas au format HTML contenues dans la table T
    With .GetElementsByTagName("table")(0).Rows Comment sais tu qu'il s'agit de table(0) ?

    ReDim VA(1 To .Length, 1 To .Item(0).Cells.Length) Mais comment fais tu pour savoir item(0).cells.length ?
    ici je ne vois rien pour le trouver si pas d'affichage en variable locale?

    Application.StatusBar = TXT & ": " & Format$(R, "@@@@")
    Peux tu développer un peu ici aussi stp R ça c'est ok mais pourquoi 4 @ ???

    Merci

  15. #15
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Patrick, j'en suis à une dizaine de pages web dont certaines en réponse sur d'autres forums, toujours avec succès …
    C'est vrai que je n'ai pas demandé à connaitre leur version d'IE …
    Utilisant principalement Firefox, je ne met pas à jour IE, mon ordinateur de tests dispose d'Excel 2003 et IE9.
    Je vérifierais ce week-end lors du retour du portable disposant d'Excel 2007 sa version d'IE …
    Soit la version d'IE est à prendre en compte - et donc j'aurais eu beaucoup de bol jusqu'à présent ! -
    soit c'est juste une question de respecter la programmation objet,
    méthode alors ordinaire car la logique de la programmation objet reste immuable …
    Sinon la qualité de la connexion serait-elle en cause ?


    itwoo, je vais tenter de répondre à tes trois posts dans l'ordre …

    1) De mon côté la ligne n°9 est vide, le .Navigate est en ligne n°7 et la boucle en n°15 !
    Ce n'est plus tout à fait le même code alors …
    Et de mon côté avec le .Navigate en ligne n°9, IE s'affiche déjà sans point d'arrêt !

    Mettre le point d'arrêt sur la boucle peut empêcher la détection du changement d'état de l'objet, mauvaise idée !
    Utiliser plutôt Debug.Print : j'affiche des données sans variable objet, encore faut-il bien pointer sur l'objet !
    Ainsi j'ai pu vérifier le changement d'état de l'objet, ses propriétés étant réinitialisées,
    peu importe alors si c'est .Length ou une autre !

    Afin d'être sûr du code, ouvrir un nouveau classeur et y copier mon code tel quel dans le module d'une feuille de calculs.
    La seule modification concerne le code de la valeur boursière dans l'URL (abbv, f, …)
    et d'ajouter si besoin le .Visible = True en ligne 7 ou 9, et rien d'autre ! …
    Modifier un code pour ensuite se plaindre qu'il ne fonctionne pas, Patrick m'a déjà fait le coup !

    Je n'ai jamais rencontré de souci avec les pages "abbv" et "f";
    si tu as d'autres codes où tu rencontres le souci, je veux bien tester de mon côté.

    2)Je ne vois pas comment la table peut se charger plus vite que le VBA vu les temps mesurés,
    à moins qu'il ne s'agisse d'un code erroné ou venant d'être créé ?

    Le problème que vous aviez rencontré venait du pointage lui-même : il faut respecter la hiérarchie objet;
    la manière de pointer est vraiment cruciale, exemple du post #15 de ta discussion …

    L'astuce, non en fait c'est un mauvais terme car c'est juste l'essence de la programmation objet !
    C'est en revoyant mes bases sur un vieux langage objet que j'ai été mis sur la voie de la solution pour une connaissance …
    Je reprends : comme indiqué dans le post initial, " l'astuce " consiste à verrouiller le pointage de l'objet avant la boucle,
    sinon cela ne peut fonctionner (j'ai pourtant prévenu dans la présentation), juste une question de logique objet.
    Ce n'est pas la propriété .Length qui pose problème mais comment est pointé l'objet ! …

    Le test est sur le NASDAQ simple. Pour EuroNext je n'ai pas testé vu le travail mené par Stéphane et Patrick,
    le sujet d'origine portant sur le NASDAQ …

    Le principe est de boucler tant que .Length est différent de zéro car c'est seulement lors de son passage à zéro
    que la table est à jour, zéro voulant dire que le pointeur a été "cassé" suite à cette mise à jour …
    Pour obtenir les données mises à jour, il faut de nouveau pointer sur l'objet, comme la ligne suivant la boucle.

    Quand les données ne posent pas de souci de conversion, j'utilise comme Patrick le Presse-Papiers.
    Bien qu'il est possible à postériori de convertir les données en notation anglaise vers la française (TextToColumns),
    je préfère utiliser une variable tableau de type Variant car, VBA étant nativement en anglais,
    il effectue de facto automatiquement la conversion notation anglaise vers française, dates comme nombres
    (en fait paramétrage régional de Windows), allégeant ainsi le code …

    3)En fait quand je développe soit j'active les références idoines pour utiliser des variables Object en liaison anticipée
    soit je crée des variables en liaison tardive.

    Exemple de modification du code des lignes n°5 & 6 en liaison tardive :

    Set IE = CreateObject("InternetExplorer.Application") .
    With IE

    Donc évidemment pour savoir quels éléments pointer ou récupérer, j'étudie la structure de la page web
    au moyen de l'outil d'inspection intégré au navigateur et au travers de variables pointant sur des objets …
    Cela fonctionne même avec un élément iFrame !

    Une table d'une page web est constituée comme une feuille de calculs d'Excel :
    des cellules (.Cells) subdivisées en lignes (.Rows) par colonnes (.Rows.Cells) …
    Tout est donc visualisable via la fenêtre des Variables locales

    Quant au B-A-BA de l'utilisation de la fonction Format, le "@" représente un caractère, juste un style d'affichage …

    _________________________________________________________________________________________________
    We are all very ignorant, what happens is that not all ignore the same things … (Albert Einstein)
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  16. #16
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Précision :

    Citation Envoyé par itwoo Voir le message
    With .GetElementsByTagName("table")(0).Rows Comment sais tu qu'il s'agit de table(0) ?
    Là ce n'est même plus une histoire d'observer via des variables car en fait en ligne n°16
    seul le code HTML de la table contenant les données a été copié dans la variable texte T
    afin de l'injecter dans un fichier HTML local - astuce, là il en s'agit bien d'une, décrite dans la contribution
    permettant d'accélérer le traitement de cette table - donc, dans cette ligne n°31,
    forcément il ne peut s'agir que de la première table ! (le premier élément d'une collection étant le zéro …)


    Que ce soit en pilotant IE ou via une bibliothèque de requêtes, il est possible de sortir d'une boucle d'attente
    en gérant un pseudo Timeout … De mon côté, je le paramétrerais à 30 - 35 secondes vu mes temps relevés
    mais ne connaissant pas les tiens en fonctionnement normal et aussi, serais-tu intéressé ?
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  17. #17
    Membre actif
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2013
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2013
    Messages : 411
    Points : 231
    Points
    231
    Par défaut re
    Bonjour Marc,

    Merci pour les infos (pas évident de reproduire ton VA mais ca devrait aller),

    Pour la partie avec le timeout que proposes tu, si je comprends bien c'est de forcer VBA à sortir aprés un certain temps?...par contre ca m'a donné une idée pour un timer pour le test à la place du point d'arrêt:

    Pour le code c'est bien le tien...je ne l'ai pas touché c'est le tien juste ajouté comme tu me l'as indiqué .Visible (pour voir IE s'afficher et mis 2 points d'arrêt pour les tests) donc gardons ton code initial sans .Visible, mais cette fois sans point d'arrêt...

    Pour rappel:
    les points d'arrêt furent mis pour te montrer l'endroit du blocage et ses raisons ligne n°15

    La où cela différe dans l'idée c'est que tu indiques:
    Mettre le point d'arrêt sur la boucle peut empêcher la détection du changement d'état de l'objet, mauvaise idée !
    La je ne peux pas répondre je n'en sais rien concernant VBA ou IE

    Pour le test le point d'arrêt fut mis volontairement en ligne n°15 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With .Item(2).all: While .Length: DoEvents: Wend: End With
    Et bien dans ce cas tu boucles éternellement et il ne me semble pas que cela soit de la faute du point d'arrêt mais plutôt le fait que si IE charge plus vite que VBA alors ta condition ligne n°15 implique de boucler indéfiniment car elle est déjà remplie 10y c'est long à charger pour IE donc peux probable d'avoir une erreur dans ce cas mais si tu mets une période courte 1mn ou que tu fais un test sur une période rapide ou même que tu places beaucoup de code entre le onchange et ta condition cela va apparaitre...voir même si raisonnement poussé à l'extrême si tu enchaines les fichiers ton VBA sera déjà au prochain fichier alors que IE lui sera toujours à celui d'avant!!!

    et si tu mettais un timer de 60 secondes pour voir entre le onchange et la condition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    If InStr(.body.innerHTML, URL) Then
                    With .all("ddlTimeFrame"): .Value = "10y": .onchange:   End With
     
            h = Timer
            Do While Not (Timer - h) > 60
            Loop
          '  MsgBox ("Fin du Timer")
     
                    With .GetElementsByTagName("table")
                        With .Item(2).all:   While .Length:  DoEvents:  Wend:   End With
                        T$ = .Item(2).outerHTML
                    End With
                End If
    et bien ici ca boucle à l'infini...et cette fois il n'y a pas de point d'arrêt ton code n'est pas changé juste ralenti pour t'indiquer la possibilité d'une erreur qui peut se produire est ce que tu es d'accord?

    A bientôt

  18. #18
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Bonjour,

    j'ai pu testé plusieurs fois ce matin sur un poste disposant d'IE 11 avec la contribution telle quelle : pas de souci …
    Par contre c'est bien plus rapide : 15,6s (valeur f lors de la première tentative donc sans cache, boucle 9s)
    contre 19,9s sur un poste à configuration / connexion équivalente sous IE 9 (boucle 10s) …


    Code à tester avec un Timeout au sein de la boucle :
    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
    Sub TestNASDAQtimerIE()
        Const URL$ = "http://www.nasdaq.com/symbol/f/historical", _
              TXT$ = "        Import en cours "
        Application.StatusBar = TXT & "…"
     
        With CreateObject("InternetExplorer.Application")
            .Navigate URL
            While .Busy Or .ReadyState < 4:  DoEvents:  Wend
     
            With .Document
                If InStr(.body.innerHTML, URL) Then
                    D! = Timer:  F! = D + 20
                    With .all("ddlTimeFrame"):  .Value = "10y":  .onchange:  End With
     
                    With .GetElementsByTagName("table")
                        With .Item(2).all
                            Do While .Length
                               If Timer < D Then F = F - 86400: D = 0
                               If Timer > F Then F = 0: Exit Do
                            Loop
                        End With
     
                        If F Then F = Timer - D ':T$ = .Item(2).outerHTML
                    End With
                End If
            End With
     
            .Quit
        End With
     
        MsgBox IIf(F, "Va tutto bene !" & vbLf & vbLf & "Boucle : " & _
               Format$(F, "0.000s"), "Echec !   Timeout …"), _
               vbInformation, Space$(13) & "NASDAQ"
        Application.StatusBar = False:  End
    End Sub
    Je l'ai lancé des dizaines de fois sur des postes avec IE9, un peu sur IE11 : que des "Va tutto bene !" …

    Comme de mon côté la boucle prend dix secondes, le Timeout est à 20 en ligne n°12.
    Si de ton côté c'est plus long, commence par tester avec 60 …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  19. #19
    Membre actif
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2013
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2013
    Messages : 411
    Points : 231
    Points
    231
    Par défaut re
    Bonjour,

    Ok je regarde ton timeout (et aussi ton debug.print ce WE)pour voir ce que c'est (mais ce n'est pas à cet endroit que tu as des cas possible d'erreur...car tu n'as pas mis de temps additionnel pour amplifier volontairement l'erreur entre le .onchange et ta condition donc tu ne peux pas voir l'erreur qui peut se produire parfois suivant la situation)
    Il faut que tu regardes de ton côté le timer comme inséré ici dans ton code original et pour volontairement retarder ta condition pour que la table finisse de se charger avant que VBA n'arrive à ta condition, comme ca entre le .onchange et la condition tu devrais détecter la boucle infinie sur ta ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With .Item(2).all:   While .Length:  DoEvents:  Wend:   End With
    Est ce que tu as fait le test? est ce que tu la détectes?
    si non met 120 ou plus pour accentuer le temps pour détecter la boucle infinie...car elle est bien là présente aussi bien avec f que abbv et dans 100% des cas si tu augmentes le timer pour la faire ressortir...(du moins ici ca ne marche jamais comme cela vba et IE tourne à l'infini)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    If InStr(.body.innerHTML, URL) Then
                    With .all("ddlTimeFrame"): .Value = "10y": .onchange:   End With
     
     'c'est ici que tu as une erreur possible suivant ce que tu fais entre le onchange et ta condition si IE va plus vite que VBA
            h = Timer
            Do While Not (Timer - h) > 60
            Loop
          '  MsgBox ("Fin du Timer")
     
                    With .GetElementsByTagName("table")
                        With .Item(2).all:   While .Length:  DoEvents:  Wend:   End With
                        T$ = .Item(2).outerHTML
                    End With
                End If

    bonne aprem

  20. #20
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Citation Envoyé par itwoo Voir le message
    […] mais plutôt le fait que si IE charge plus vite que VBA …
    Franchement je ne vois pas comment à moins d'un code inexistant ou d'une nouvelle cotation boursière,
    et encore ... Ou bien d'une connexion THD du genre 1000 Mo !
    De mon côté la boucle prend en moyenne dix secondes pour la cotation f; si tu as d'autres codes à tester …

    Sous IE9, en modifiant le test du message précédent, j'ai juste réussi à produire un semblant de boucle infinie
    mais après la boucle ! Il fallait cliquer sur la fenêtre d'Excel pour voir le message s"afficher, j'en ai perdu mon latin !
    Après avoir comparé le test n°2 avec le précédent, c'est en fait un conflit logique inter-objet d'applications,
    impossible d'intervenir via Excel tant que l'application IE est active;
    je l'ai compris en voyant les icônes en haut à droite de la fenêtre d'Excel discrètement clignoter


    Citation Envoyé par itwoo Voir le message
    (pas évident de reproduire ton VA mais ca devrait aller)
    Une table HTML est constituée de lignes et de colonnes comme une plage d'Excel,
    cela tombe plutôt bien pour copier une table dans une feuille de calculs !
    Donc pour créer une variable tableau aux dimensions de la table,
    il faut connaitre le nombre de lignes et le nombre de colonnes de cette table :

    • Ligne n°30 : la collection des lignes de la table est pointée (objet table.Rows).

    • Ligne n°31 : création de la variable tableau
    - .Length = le nombre de lignes (.Length se rapportant directement à .Rows de la ligne 30)
    - .Item(0).Cells.Length = le nombre de colonnes.
    En décomposant : .Item(0) se rapportant à .Rows de la ligne 30 : 1er élément, première ligne.
    .Cells : les cellules (ou colonnes) de cette ligne. Et avec .Length, le nombre de colonnes donc …

    Et là pas besoin d'adaptation, c'est le principe de toute table HTML !
    Tout comme parcourir chaque ligne pour en extraire les cellules …
    Utiliser une variable tableau est vraiment utile pour la conversion de données en notation anglaise vers la française.

    Sinon utiliser directement le Presse-Papiers est une autre voie, définir la plage en texte avant la copie
    puis reste à convertir dates et nombres via TextToColumns par exemple …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

Discussions similaires

  1. [MySQL] Comment extraire des données dans un fichier .svc depuis une page web
    Par pierrot10 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 18/12/2013, 12h02
  2. Réponses: 1
    Dernier message: 08/07/2009, 11h52
  3. [XL-2003] Faire mise à jour fichier excel stocké sur une page web
    Par fidecourt dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/04/2009, 17h12
  4. Comment ouvrir Word ou Acrobat Reader à partir d'une page web ?
    Par Kuuei dans le forum Général Conception Web
    Réponses: 4
    Dernier message: 17/05/2006, 15h18
  5. Comment empêcher la mise à jour d'un contrôle à l'écran ?
    Par JojoLaFripouille dans le forum Composants VCL
    Réponses: 4
    Dernier message: 19/09/2003, 12h52

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