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 :

[Excel 2010] Problème de récupération d'URL variable


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Néant
    Inscrit en
    Septembre 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Néant
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2017
    Messages : 9
    Par défaut [Excel 2010] Problème de récupération d'URL variable
    Bonjour à tous,

    Je travaille sur un projet pour lequel je dois télécharger un fichier excel sur le site d'EDF ("Toutes les versions de chaque indisponibilité (.xlsx)") puis extraire et exploiter certaines données.

    J'utilisais ce simple morceau de code qui marchait parfaitement, pour ouvrir directement le fichier dans excel sans le télécharger, à l'aide de l'URL récupérée sur la page avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fichier = "https://www.edf.fr/doaat/export/light/all-versions?1510242467"
    Workbooks.Open fichier
    Je me suis cependant aperçu que le nombre à la fin de l'URL variait en permanence, me faisant ainsi travailler avec un fichier qui n'était pas à jour. J'ai donc opté pour une solution où je récupère directement l'URL sur le code source de la page avec la fonction suivante (récupérée sur cette page) dans un module à part. Les arguments sont le texte présent au milieu de l'URL qui me permet de détecter où celle-ci est présente dans le code source et le nombre de caractère que je conserve pour les concaténer à l'URL que je veux ouvrir dans Excel.
    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
    Option Explicit
     
    Private Function ExctractSourceCode(LienURL As String)
        With CreateObject("MSXML2.XMLHTTP")
            .Open "GET", LienURL, False
            .Send
            If .ReadyState = 4 Then
                If .Status <> 200 Then
                    ExctractSourceCode = CVErr(xlErrNA)
                Else
                    ExctractSourceCode = .ResponseText
                End If
            Else
                ExctractSourceCode = CVErr(xlErrNA)
            End If
        End With
    End Function
     
    Public Function ExtractURL(Link As String, Length As Integer)
     
        Dim MonLienURL As String
     
        MonLienURL = "https://www.edf.fr/groupe-edf/qui-sommes-nous/activites/optimisation-et-trading/listes-des-indisponibilites-et-des-messages/liste-des-indisponibilites"
        CodeHTML = ExctractSourceCode(MonLienURL)
     
        Link = Mid(CodeHTML, InStr(CodeHTML, Link), Length) 'Récupère le code en chiffres qui caractérise la variation temporelle de l'URL
     
    End Function
    Fonction que j'appelle dans ma procédure comme ceci pour concaténer le bon nombre à la fin du début de l'URL, qui lui ne varie pas et ouvrir un lien à jour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       Dim FileVersion As String
        Call ExtractURL(FileVersion, 23)
        fichier = "https://www.edf.fr/doaat/export/light/" & FileVersion
        Workbooks.Open fichier
    Hélas, ça ne fonctionne pas, je constate que le fichier s'ouvre bien, mais bloqué à certains moments de la journée, sans afficher les dernières mises à jour... Et quand j'exécute le code pas à pas, l'URL ne varie pas et c'est toujours le même nombre qui m'est renvoyé.

    Peut-être que la recherche de l'URL dans le code source est l'endroit qui ne va pas et qu'il me renvoie un URL fixe mais j'ai cherché sur la page et je n'ai pas trouvé d'autre occurrence.

    Avez-vous des idées quant à l'origine du problème ?

    Merci d'avoir pris le temps de me lire,

    Aiklad

  2. #2
    Expert éminent
    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
    Par défaut
    'soir !

    L'origine du problème vient du code lisant le code brut de la page avec un numéro du fichier inscrit en dur
    or le lien du fichier est mis à jour via du JScript lors du chargement effectif de la page dans un navigateur …

    ___________________________________________________________________________________________________________
    Je suis Paris, New-York, Mogadicio, Barcelone, London, Manchester, Egypte, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  3. #3
    Membre régulier
    Homme Profil pro
    Néant
    Inscrit en
    Septembre 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Néant
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2017
    Messages : 9
    Par défaut
    Citation Envoyé par Marc-L Voir le message
    'soir !

    L'origine du problème vient du code lisant le code brut de la page avec un numéro du fichier inscrit en dur
    or le lien du fichier est mis à jour via du JScript lors du chargement effectif de la page dans un navigateur …

    ___________________________________________________________________________________________________________
    Je suis Paris, New-York, Mogadicio, Barcelone, London, Manchester, Egypte, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …
    Effectivement, dit comme ça, il y a peu de chance que ça marche...

    Merci pour l'éclairage, je vais tenter une autre approche donc.

    Cordialement,

    Aiklad

  4. #4
    Expert éminent
    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
    Par défaut


    Avant d'évoquer une autre approche pilotant Internet Explorer, que donne déjà ceci de ton côté :

      Workbooks.Open "https://www.edf.fr/doaat/export/light/all-versions"   ? …

  5. #5
    Membre régulier
    Homme Profil pro
    Néant
    Inscrit en
    Septembre 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Néant
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2017
    Messages : 9
    Par défaut
    Citation Envoyé par Marc-L Voir le message


    Avant d'évoquer une autre approche pilotant Internet Explorer, que donne déjà ceci de ton côté :

      Workbooks.Open "https://www.edf.fr/doaat/export/light/all-versions"   ? …
    Hum intéressant, ça semble me donner le fichier à jour. Je teste plusieurs fois cet après-midi et je te dis ce qu'il en est.

    Par curiosité, quelle différence avec le "https://www.edf.fr/doaat/export/light/all-versions?1510311816" que j'utilisais et comment as-tu eu l'idée de tronquer la fin variable de l'URL ?

    Cordialement,
    Aiklad

    EDIT : après un test à 13h30, il s'avère que l'utilisation de ce lien entraîne le même problème d'ouverture d'un fichier qui n'est pas à jour. Par exemple, à cette heure là, la dernière indisponibilité est pour Bouchain 7 sur le site et celle du fichier ouvert par la macro avec le lien "https://www.edf.fr/doaat/export/light/all-versions" est restée pour Havre 4.

    Je vais donc effectivement me pencher sur de la navigation avec Internet Explorer pour l'instant. Si quelqu'un a une meilleure idée je suis preneur.

    Merci pour ton aide Marc-L.

  6. #6
    Membre régulier
    Homme Profil pro
    Néant
    Inscrit en
    Septembre 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Néant
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2017
    Messages : 9
    Par défaut Solution trouvée
    Rebonjour,

    Je pense avoir résolu mon problème en passant par une navigation sur Internet Explorer. Je pense que le code est loin d'être parfait mais ça fonctionne chez moi pour l'instant, l'URL varie bien et m'ouvre un fichier à jour.

    Un problème cependant : si je n'ajoute pas la ligne avec le Application.Wait, l'URL est à nouveau bloqué sur une valeur, sûrement car la page n'a pas le temps de charger complètement malgré le While IE.Busy. Je n'ai pour l'instant pas le courage d'élucider ça mais je pense le faire prochainement.

    J'ai donc modifié ma fonction ExctractURL comme suit :
    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
    Public Function ExtractURL(Link As String, Length As Integer)
     
        Dim CodeSource As String
        Dim IE As Object
        Set IE = CreateObject("InternetExplorer.Application")
     
    'On est obligé de lancer une navigation pour trouver l'URL car il varie à chaque chargement de page par javascript
        IE.Visible = False
        IE.Navigate url:="https://www.edf.fr/groupe-edf/qui-sommes-nous/activites/optimisation-et-trading/listes-des-indisponibilites-et-des-messages/liste-des-indisponibilites"
        While IE.Busy
            DoEvents
        Wend
        Application.Wait Now + 0.05 / 60 / 24 'Ajout d'une attente supplémentaire car sinon le code renvoie à nouveau une URL toujours identique
        CodeSource = IE.Document.body.innerHTML
     
        Link = Mid(CodeSource, InStr(CodeSource, Link), Length) 'Récupère le code en chiffres qui caractérise le fichier au moment de la procédure
     
        IE.Quit
     
    End Function
    En espérant que cela soit utile à quelqu'un d'autre.

    Cordialement,
    Aiklad

  7. #7
    Expert éminent
    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
    Par défaut
    Citation Envoyé par aiklad Voir le message
    si je n'ajoute pas la ligne avec le Application.Wait, l'URL est à nouveau bloqué sur une valeur, sûrement car la page n'a pas le temps de charger complètement malgré le While IE.Busy.
    Busy & ReadyState d'IE correspondent juste au chargement du code initial de la page
    mais pas aux diverses requêtes JScript de mise à jour comme par exemple pour ton lien.
    C'est pour cela souvent je conseille d'observer le comportement d'une page Web avant de commencer à coder …


    Citation Envoyé par Marc-L Voir le message
    Avant d'évoquer une autre approche pilotant Internet Explorer
    Effectivement il suffit d'une pause après le chargement initial de la page pour voir le lien à jour.
    De mon côté avec une pause d'une seconde - Sleep de Windows car parfois Wait peu poser problème avec IE - souvent
    le lien est à jour mais parfois non. Il suffit de l'augmenter un peu et voilà le tour serait joué …
    Et c'est là l'erreur car une pause valable à un instant T peut s'avérer insuffisante un autre jour selon l'état de charge de l'ordinateur,
    de la bande passante, du réseau local, du site, du hamster s'arrêtant de pédaler ne fournissant plus assez de courant au routeur, …
    Nombre de fois où j'ai publié des codes fonctionnant bien de mon côté sur différents ordinateur (i3, i5 & i7)
    et versions de Windows mais qui échouaient du côté de membres de forums même chevronnés !

    Logiquement juste en observant la page, il suffit de repérer la présence ou l'absence d'un élément,
    parfois sa réinitialisation ou comme ici la mise à jour de la valeur de l'élément et pour cela, une pause est inutile.
    Mais voilà il y a encore un risque de boucle sans fin lorsque - ici peut-être hypothétiquement - il n'y a pas de mise à jour
    car le fichier en dur dans le code initial de la page correspondrait en fait à la dernière mise à jour …

    Donc la meilleure solution est un hybride des deux approches précédentes :
    attente de la mise à jour de l'élément mais limité par un délai maximum …
    Dans l'exemple suivant ce délai est fixé à cinq secondes dans la ligne de code n°9 :

    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
    Sub DemoIE()
       Const URL = "https://www.edf.fr/groupe-edf/qui-sommes-nous/activites/optimisation-et-trading/listes-des-indisponibilites-et-des-messages/liste-des-indisponibilites"
        With CreateObject("InternetExplorer.application")
                    On Error GoTo Fin
                 .Navigate URL
           While .Busy And .ReadyState < 4:  DoEvents:  Wend
            With .Document.all
                    T$ = .zoneLinks.getElementsByTagName("A")(0).href
                    VD = Now + #12:00:05 AM#
                    On Error Resume Next
                While Now < VD And .zoneLinks.getElementsByTagName("A")(0).href = T
                Wend
                    On Error GoTo Fin
                    Workbooks.Open .zoneLinks.getElementsByTagName("A")(0).href
            End With
    Fin:
           If Err.Number Then Beep
                 .Quit
        End With
    End Sub
    La ligne de code n°11 pouvant déclencher une erreur en tombant pile-poil au moment de la mise à jour
    il serait inopportun de remonter la ligne n°12 au niveau de cette ligne n°11 …

    ___________________________________________________________________________________________________________

         Merci de cliquer sur en bas à droite de chaque message ayant aidé …

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut re
    @Marcl

    chez moi la bonne balise "a" n'est pas la première donc ce n'est pas la zero c'est pour cela que je suis passé par le parent qui lui ne change pas

    comme précisé dans mon code en commentaire : ajouter peu être une gestion d'attente sur le length voir sur la valeur du HREF avec un timer
    mais comme l'url est complète le lien est a jour quand il est accessible c'est bien le dernier

    après honnêtement après avoir tester 10 fois a intervalle différents la requête téléchargeusse (code n°1) renvoie toujours les dernières mises a jour le fichier créé est bon

    temps d'exécution indiscutable
    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

  9. #9
    Membre régulier
    Homme Profil pro
    Néant
    Inscrit en
    Septembre 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Néant
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2017
    Messages : 9
    Par défaut
    Re,

    Désolé pour la lenteur de la réponse mais j'étais pris par d'autres impératifs.

    Citation Envoyé par Marc-L Voir le message
    Busy & ReadyState d'IE correspondent juste au chargement du code initial de la page
    mais pas aux diverses requêtes JScript de mise à jour comme par exemple pour ton lien.
    C'est pour cela souvent je conseille d'observer le comportement d'une page Web avant de commencer à coder …
    Et c'est un bon conseil, je tacherai de m'en souvenir !

    Citation Envoyé par Marc-L Voir le message
    Effectivement il suffit d'une pause après le chargement initial de la page pour voir le lien à jour.
    De mon côté avec une pause d'une seconde - Sleep de Windows car parfois Wait peu poser problème avec IE - souvent
    le lien est à jour mais parfois non. Il suffit de l'augmenter un peu et voilà le tour serait joué …
    Et c'est là l'erreur car une pause valable à un instant T peut s'avérer insuffisante un autre jour selon l'état de charge de l'ordinateur,
    de la bande passante, du réseau local, du site, du hamster s'arrêtant de pédaler ne fournissant plus assez de courant au routeur, …
    Nombre de fois où j'ai publié des codes fonctionnant bien de mon côté sur différents ordinateur (i3, i5 & i7)
    et versions de Windows mais qui échouaient du côté de membres de forums même chevronnés !
    Je te concède volontiers que ce n'est pas du tout une solution durable. C'était en attendant de trouver une solution convenable. Cela a d'ailleurs causé quelques bugs quand la connexion internet avait un coup de moins bien et mettait plus de temps à charger la page.

    J'ai regardé ce tuto de Qwazerty (très bien pour les novices !) dont une partie traite de l'extraction du code source d'une page web mais je n'arrivais pas à extraire la partie qui m'intéressait, que tu as bien réussi à identifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T$ = .zoneLinks.getElementsByTagName("A")(0).href
    Je pense que ça pourra me rendre bien des services à l'avenir. J'ai testé ton code et il marche parfaitement, un grand merci pour le coup de main et le temps que tu y as passé.

    Merci également à Patrick pour le temps consacré et sa solution proposée.

    Cordialement,
    Aiklad

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

Discussions similaires

  1. Excel 2010 problème macro
    Par hugh33 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 13/05/2014, 15h16
  2. Réponses: 0
    Dernier message: 04/04/2014, 07h22
  3. [ZF 1.9] problème de récupération id URl dans la partie form
    Par hadesjack dans le forum Zend Framework
    Réponses: 10
    Dernier message: 29/09/2009, 16h23
  4. Réponses: 5
    Dernier message: 25/05/2007, 10h22
  5. Réponses: 11
    Dernier message: 16/05/2007, 15h10

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