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 :

Accélérer une requête sur des multiples pages 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 Accélérer une requête sur des multiples pages Web
    Salutations à vous, lecteurs !
    • Préambule.

    Si vous êtes sur un MAC, l'astuce fonctionne uniquement sur Windows, désolé …

    Si vous n'êtes pas développeur, comme le disait Michel (Colucci) : « Circulez, y a rien à voir ! »
    J'entends par développeur, non pas une personne dont c'est forcément le métier, mais quelqu'un
    ayant des connaissances de programmation en langage VB et dérivés comme ici le VBA et le VBScript,
    prenant le temps d'analyser un problème, consultant l'aide intégrée au VBA d'Excel
    ou allant chercher l'information dans MSDN, sachant adapter une procédure à ses besoins …
    • Références.

    Manipuler les chaînes de caractères en VB6 et VBA Excel
    Les bases du HTML
    VBA et développement Web
    Introduction au langage VBScript

    Si vous êtes roi du Copier / Coller sans utiliser deux neurones, encore une fois, passez votre chemin !
    Car le code fonctionne uniquement pour le cas concret choisi pour la démonstration;
    l'astuce devant être forcément adaptée au cas par cas selon les données à récupérer et l'architecture des pages Web …
    • Pollution.

    Merci de ne pas polluer cette discussion si vous n'arrivez pas à adapter cette astuce,
    créez votre discussion dans le sous-forum Macros et VBA Excel afin d'y présenter clairement vos difficultés …
    • Introduction.

    Pour récupérer des données sur des pages Web, mieux vaut éviter le pilotage d'Internet Explorer
    car c'est la manière la plus lente et souvent fastidieuse, bref à utiliser en dernier recours …

    Si la page Web s'y prête, Excel est doté depuis longtemps d'une méthode pour effectuer une requête sur le Web,
    soit directement depuis le menu d'une feuille de calculs soit au sein d'une procédure VBA (QueryTable).
    Cette méthode est très pratique lorsque les données sont organisées en tableau par exemple, mais si
    les données se trouvent sur plusieurs pages Web, elle s'avère lente aussi, certes moins que l'instanciation d'IE
    mais bien moins rapide que d'utiliser une librairie comme par exemple MSXML2 …

    Récemment j'ai eu le cas d'un résultat d'une requête sur un site financier réparti sur 101 pages web !
    Le site étant assez véloce, moins d'une minute est nécessaire pour récupérer les données de toutes ces pages
    par l'utilisation d'une telle librairie alors qu'il en faut presque dix via de multiples QueryTable !
    (Les temps au fil de cette discussion n'y sont qu'à titre indicatif car ils varieront selon la configuration du PC,
    la version d'Excel et la rapidité de la connexion Internet …)

    Mais dans le cas d'un site lent, la durée se chiffre en minutes …
    Et si le temps d'exécution pouvait être encore divisé par deux au moins ?
    • Avant principe, une p'tite histoire …

    La reine d'une colonie a confié la récolte journalière d'un nectar particulier à l'une de ses abeilles.
    Les aller-retour entre chaque fleur et le nid épuisant cette dernière, la reine de lui dire :
    « Tu es responsable de la récolte de ce divin nectar, mais tu as le droit de te faire aider par tes sœurs ! »

    Par analogie, une abeille est une procédure et une fleur, une page Web,
    tout comme le nectar est une donnée et le nid, une feuille de calculs d'un classeur Excel …
    • Principe.

    Au lieu de laisser une procédure mono-tâche s'acquitter à elle seule de récupérer les données séquentiellement
    dans chaque page Web une à une, mieux vaut lancer en parallèle autant de procédures que de pages Web !
    Une procédure VBA, mono-tâche, lance des requêtes VBScript sous Windows, multi-tâches lui …
    • Limitations.

    Si vous ne disposez pas de droits d'accès suffisants, comme souvent le cas en entreprise,
    il se peut qu'il faille autoriser la procédure VBScript ou être dans l'impossibilité de l'exécuter !

    Le nombre de procédures VBScript est limité par la taille disponible au sein de la mémoire vive
    mais une procédure occupant environ 4Mo de RAM, il y a de la marge !

    L'exécution peut être ralentie par d'autres applications actives comme une messagerie par exemple …
    • Avant illustration, démonstration de la procédure mono-tâche.

    Prenons le cas concret de parisdauphine dans sa discussion récupérer des données Internet
    devant, dans les pages Web d'un site lent en liens hypertexte en colonne A,
    extraire une date et la placer en colonne E, la fameuse cinquième colonne …

    Les codes suivants sont situés dans le module de la feuille de calculs contenant les données.

    Face à la lenteur du site et aux milliers de liens, la procédure traite une page écran à la fois depuis la position de la ligne
    de la cellule active, si la cellule en colonne A contient un lien hypertexte et si la date n'est pas renseignée en colonne E.
    Voir la procédure Demo utilisant la librairie MSXML2, la progression des pages étant indiquée en bas à gauche
    dans la barre d'état, un message indiquant la durée du traitement ponctuant la fin de cette procédure :
    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
    Const TITRE$ = "      Récupération de dates"
     
    Private Declare Function InternetCheckConnectionA Lib "Wininet" (ByVal SITE$, ByVal one&, _
                                                                     ByVal zero&) As Boolean
     
    Function WebOK(Optional ByVal URL$ = "http://www.msn.com") As Boolean
                P& = InStr(9, URL, "/"):  If P Then URL = Left$(URL, P)
             WebOK = InternetCheckConnectionA(URL, 1, 0)
    End Function
     
     
    Function WebExtract$(PAGE$, ByVal AFTER$)
        With CreateObject("MSXML2.XMLHTTP")
            .Open "POST", PAGE, False
            .send
     
            If .Status = 200 Then
                SP = Split(.responseText, AFTER)
                If UBound(SP) > 0 Then WebExtract = Split(SP(1), "<")(0)
            End If
        End With
    End Function
     
     
    Private Sub Demo()
        S = Timer:  R& = ActiveCell.Row:  If Cells(R, 1).Hyperlinks.Count = 0 Then Beep: End
        If WebOK(Cells(R, 1).Hyperlinks(1).Address) = False Then Beep: End
        Me.Shapes("Boutons").Visible = False:   ActiveWindow.ScrollRow = R
     
        For R = R To R + ActiveWindow.VisibleRange.Rows.Count - 2
            If Cells(R, 5).Value = "" And Cells(R, 1).Hyperlinks.Count Then
                                  P% = P% + 1
               Application.StatusBar = "Page " & P
                   Cells(R, 5).Value = WebExtract(Cells(R, 1).Hyperlinks(1).Address, _
                                                  "End of placement</td><td>")
            End If
        Next
     
        If P Then
            S = Format(Timer - S, " (0.000s)"):  Application.StatusBar = False
            Debug.Print "Demo" & S:  MsgBox "Opération achevée …" & S, vbInformation, TITRE
        Else
            Beep
        End If
     
        Me.Shapes("Boutons").Visible = True:  End
    End Sub
    Le site nécessitant environ 4 secondes par page, cette procédure a besoin de plus de 120 secondes pour 31 lignes …
    Et si les abeilles s'en mêlent ?
    • Illustration, Let It Bee !

    L'heureuse parisdauphine va récupérer une procédure sur mesure encore plus véloce !
    Quoique pas si chanceuse vu son Office ou son ordinateur lui jouant de sales tours …

    Cette astuce utilise la même librairie mais cette fois-ci en multi-tâches via Windows.
    Tout comme le fameux film de Tarentino, elle est scindée en deux parties :
    la première ascendante (LetItBee), après la génération du fichier VBScript, lui transmet l'adresse de chaque page Web
    et la cellule en retour, la seconde descendante via l'évènement Worksheet_Change après chaque mise à jour
    décompte les procédures en cours de traitement. Ne pas s'inquiéter s'il paraît ne rien se passer,
    suivre l'évolution toujours dans la barre d'état, les données vont finir par arriver groupées !
    A noter la fin identique au film …
    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
    Const TITRE$ = "      Récupération de dates"
     
    Private BeeC%, BeeL$, BeeT!
     
     
    Sub AfficheBoutons(Optional BeeMIA As Boolean = True)
        Me.Shapes("Boutons").Visible = True:  Application.StatusBar = False
        If BeeMIA Then MsgBox "Bee Missing In Action !" & vbLf & vbLf & "Vérifiez les liens, " & _
                              "la lenteur de réponse du site …", vbExclamation, TITRE
        On Error Resume Next
        Kill BeeL:  End
    End Sub
     
     
    Sub Been(SHEDULE As Boolean)
        Static TS
        If SHEDULE Then TS = Now + 0.0007
        Application.OnTime TS, Me.CodeName & ".AfficheBoutons", , SHEDULE
    End Sub
     
     
    Private Sub LetItBee()
        BeeT = Timer:  Me.Shapes("Boutons").Visible = False:  Been True
     
        With ThisWorkbook
            BeeL = .Path & "\Bee - " & Split(.Name, ".")(0) & " - " & Me.Name & " .vbs"
     
            SC = Array("On Error Resume Next", "With CreateObject(""MSXML2.XMLHTTP"")", _
                       "If Err.Number Then WScript.Quit 1", _
                       ".open ""POST"",WScript.Arguments(0),False", _
                       "If Err.Number Then WScript.Quit 2", ".send", "If .status=200 Then " & _
                       "SP=Split(.responseText,""End of placement</td><td>""): " & _
                       "If UBound(SP)>0 Then T=Split(SP(1),""<"")(0)", "End With", _
                       "GetObject(,""Excel.Application"").Workbooks(""" & .Name & _
                       """).Worksheets(""" & Me.Name & """)." & _
                       "Range(WScript.Arguments(1))" & ".Value=T")
        End With
     
        F% = FreeFile
        Open BeeL For Output As #F
        Print #F, Join(SC, vbNewLine)
        Close #F
     
        SC = """" & BeeL & """ ":  R& = ActiveCell.Row:  ActiveWindow.ScrollRow = R
     
        With CreateObject("WScript.Shell")
            For R = R To R + ActiveWindow.VisibleRange.Rows.Count - 2
                If Cells(R, 5).Value = "" And Cells(R, 1).Hyperlinks.Count Then
                    .Run SC & Cells(R, 1).Hyperlinks(1).Address & " " & Cells(R, 5).Address
                    BeeC = BeeC + 1:  Application.StatusBar = "Let It Bee : " & Format(BeeC, "@@")
                End If
            Next
        End With
     
        If BeeC = 0 Then Been False: Beep: AfficheBoutons False
    End Sub
     
     
    Private Sub Worksheet_Change(ByVal Target As Range)
        If BeeC And Target.Column = 5 Then
            BeeC = BeeC - 1:  Application.StatusBar = "Let It Bee : " & Format(BeeC, "@@")
     
            If BeeC = 0 Then
                S$ = Format$(Timer - BeeT, " (0.000s)"):  Been False:  Debug.Print "LetItBee" & S
                MsgBox "Opération achevée …" & S, vbInformation, TITRE:  AfficheBoutons False
            End If
        End If
    End Sub
    Pour 31 lignes, cette astuce a besoin d'à peine 20 secondes, au moins 6 fois moins !
    Les temps de chaque procédure figurent aussi dans la fenêtre Exécution de l'environnement VBA …
    • En pièce jointe un fichier contenant les liens hypertexte et un bouton par procédure.


    • Conclusion.

    Espérant cette astuce vous apporte de la célérité dans vos applicatifs
    et vous avoir fait sourire avec l'une des références disséminées !

    ♫ There is still a chance that they will see ♪
    ♪ There will be an answer, let it be ♫
    ♫ Let it be, let it be, let it be, let it be ♪
    Fichiers attachés Fichiers attachés
    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
    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

    Mise à jour du code affiché et de la pièce jointe pour simplification :

    même si le site rame, c'est rare qu'il ne renvoie pas de page
    et réorganisation du code VBScript pour éviter les abeilles manquantes …
    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)

  3. #3
    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 marc en fait si on regarde bien le code tu t'es trop inspiré de la discution de paris dauphine ce qui rend ta fonction assez difficile a modifier pour un debutant

    tu devrais revoir quelques lignes afin de la rendre le plus generique possible
    peut etre ajouter des arguments d'ans les fonction et dans leur apel afin qu'il n'est plus qu'a modifier ces arguments
    par exemple au lieu d'ecrire en dur dans le code les range utilisé ,une variable declaré et instruite en amont afin que l'on est pas a trier dans les lignes de code pour adapter
    moi je la comprend bien parceque j'ai suivi la discution de paris dauphine mais ca n'est peut etre pas le cas de tout le monde


    c'est mon avis

    ca reste une super idée

    j'ai qu'un pouce a chaque doigt vu tes pouces combien m'en reste il ?
    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

  4. #4
    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

    Merci Patrick !

    Sur le principe, je suis tout à fait d'accord avec ton point de vue !

    Mais dans ce cas précis, l'astuce consistant à externaliser les requêtes en en créant une générique en .vbs
    à partir d'une ressource Web, demandant donc un développement spécifique au cas par cas, à quoi bon …

    Effectivement, cette astuce s'adresse aux développeurs aguerris car, pour gagner du temps,
    faut bien mettre les mains dans le cambouis ! Il reste toujours les solutions classiques …

    L'utilisant concrètement passant d'une procédure nécessitant presque 10 minutes à moins de 25 secondes,
    je l'avais déjà publiée sur un site anglo saxon où elle a été bien appréciée …

    J'ai préféré attendre un cas concret - c'est plus formateur à mon sens - pour la proposer sur ce site,
    et bien m'en a pris vu les retours : j'aurais bien aimé avoir les opinions négatives
    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)

  5. #5
    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
    marc
    pas si spéciphique que ca si on regarde de plus pres

    puisque en fait tout se fait dans le vbs

    donc dans le vba
    creation du vbs avec
    requette et argument transmis (url,les head de la requette ,la plage )'voir meme les mettre en optional pour pouvoir s'en passerau cas ou se serait une requette simple dans une url avec une page simplifiée et combien meme si il y en aurait qu'une se serait toujours plus rapide

    et dans le vba ne garder que l'apel
    sub test
    let it be(argument1,argument2,argument3,ect.......)
    end sub
    je vais m'y interrésser de plus pret ca merite que l'on sy atarde c'est un bon sujet
    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

  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
    bonjour marc

    je pense justement que ces retours negatifs sont du au fait que c'est trop personaliser sur 1 cas je ne vois que ca c'est pour ca que je disais plus haut d'essayer de la rendre plus generique

    mais l'idée reste nikel
    une derniere question
    apres le travail de chaque vbs comment et il suprimé? car a chaque tour de boucle le nom change avec le range on se retrouve donc avec autant de .vbs que boucle

    edit:Autant pour moi je n'avais pas vu le kill BeeL
    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


    Citation Envoyé par Marc-L Voir le message
    A noter la fin identique au film …
    Kill Bill ‼ (ligne n°11)

    Un seul fichier .vbs générique, comme quoi … (voir lignes n°26, 44 & 49)
    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
    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
    Citation Envoyé par Marc-L Voir le message

    Kill Bill ‼ (ligne n°11)

    Un seul fichier .vbs générique, comme quoi … (voir lignes n°26, 44 & 49)
    a non! chaque fichier porte un nom bien différent mais c'est la variable beel qui change
    en fin j'ai pris une autre direction tu la verra dans la proposition dans l'autre post
    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
    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, comme déjà indiqué par deux fois avant ta demande,

    - la première dès la présentation initiale :

    Citation Envoyé par Marc-L Voir le message
    la première ascendante (LetItBee), après la génération du fichier VBScript,
    lui transmet l'adresse de chaque page Web et la cellule en retour
    - la seconde dans le post #4 :

    Citation Envoyé par Marc-L Voir le message
    l'astuce consistant à externaliser les requêtes en en créant une générique en .vbs
    Ma procédure ne crée donc qu'un seul fichier texte générique en .vbs,
    chaque requête l'appelant en lui passant des paramètres.

    La variable BeeL ne change jamais car c'est le chemin d'accès à ce fichier unique .vbs !
    Je t'ai pourtant indiqué les numéros de lignes à regarder dans mon précédent post …

    Il ne peut y avoir donc qu'une seule suppression de l'unique fichier .vbs
    soit lorsque le compteur des abeilles retourne à zéro soit lorsque le timer se déclenche …

    Pour vérifier c'est simple : mettre un point d'arrêt après la génération des requêtes sur la ligne n°55
    puis contrôler le nombre de fichiers .vbs créés et, évidemment, il n'y en aura qu'un seul !

    Le but étant de gagner du temps, valait donc mieux éviter de créer autant de fichiers .vbs que de requêtes, un seul suffit !

    __________________________________________________________________________________________
    Définition Taser : instrument utilisé afin de mieux faire passer le courant entre la police et la jeunesse !

    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
    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
    re
    tu injecte donc des argument l'ors du RUN
    car SC en premier lieu est le codesource de beel par le array
    et devient ensuite le beel + argument

    je l'ignorais que l'on pouvait injecter des argument dans un vbs

    je suppose que comme ca le même fichier peut être instancié 1000 fois sans perturber les précédentes instanciations
    c'est bien ca?
    car pendant la boucle les demarrage de chaque instanciations se superpose
    je suppose que ca avoir avec "join" dans l'écriture du fichier n'est ce pas ?


    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
    With ThisWorkbook
            BeeL = .Path & "\Bee - " & Split(.Name, ".")(0) & " - " & Me.Name & " .vbs"
     
            SC = Array("On Error Resume Next", "With CreateObject(""MSXML2.XMLHTTP"")", _
                       "If Err.Number Then WScript.Quit 1", _
                       ".open ""POST"",WScript.Arguments(0),False", _
                       "If Err.Number Then WScript.Quit 2", ".send", "If .status=200 Then " & _
                       "SP=Split(.responseText,""End of placement</td><td>""): " & _
                       "If UBound(SP)>0 Then T=Split(SP(1),""<"")(0)", "End With", _
                       "GetObject(,""Excel.Application"").Workbooks(""" & .Name & _
                       """).Worksheets(""" & Me.Name & """)." & _
                       "Range(WScript.Arguments(1))" & ".Value=T")
        End With
     
        F% = FreeFile
        Open BeeL For Output As #F
        Print #F, Join(SC, vbNewLine)
        Close #F
     
        SC = """" & BeeL & """ ":  R& = ActiveCell.Row:  ActiveWindow.ScrollRow = R
     
        With CreateObject("WScript.Shell")
            For R = R To R + ActiveWindow.VisibleRange.Rows.Count - 2
                If Cells(R, 5).Value = "" And Cells(R, 1).Hyperlinks.Count Then
                    .Run SC & Cells(R, 1).Hyperlinks(1).Address & " " & Cells(R, 5).Address
    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

  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

    Comme un fichier de commandes .bat / .cmd peut recevoir des paramètres,
    cela aurait été vraiment dommage d'en priver le VBScript !

    La variable SC devient juste le chemin du fichier .vbs entre guillemets suivi d'un espace,
    utile pour le Run, histoire de gagner un millième de seconde à chaque requête …

    Chaque appel de ce fichier .vbs crée un nouveau processus indépendant dans Windows et donc en multi-tâches,
    le VBA étant seulement le donneur d'ordres …
    La limite est donc la quantité de mémoire vive disponible mais avec 4 Mo par processus, il y a de quoi faire !

    Non, Join sert juste à insérer un retour à la ligne entre chaque élément du tableau
    pour générer le texte du fichier .vbs sur le disque dur …

    __________________________________________________________________________________________
    Voiture : invention ingénieuse permettant de contenir 110 chevaux dans le moteur et un âne au volant !
    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
    ok j'ai compris
    il ne peut pas y avoir d'incidence alors
    lorsque x instances sont en route

    effectivement ca simplifie la tache

    je continu ma version pour itwoo avec chaque vbs separé qui fonctionne pour le moment
    j'ai reussi a rapatrier les code source des 74 pages en 7 secondes sur mon ordi fixe mais bon ya pas de mérite c'est gameur
    carte mere vitesse coproc 1800 fsb
    procc 4 giga 4 cœur
    mémoire 32 giga corsaire utilisable
    Windows 7 64 bits
    je ne force pas donc
    je suis en train de faire la partie "PARSER" car sur ce cas on est dans des fichier JS et non des html et c'est la partie qui dure le plus longtemps finalement
    les vbs sont créés dans un dossier créé aussi dynamiquement
    je supprime le dossier a la fin

    mais je reviendrais sur ta méthode le code en sera moins long
    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
    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
    je viens d'aboutir aune première version du fichier Euronext ALL equities pour itwoo avec un seul fichier vbs
    cette reponse
    c'est vraiment
    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

  14. #14
    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
    Salut Marc

    comme je l'ai dit dans nos précédents echanges

    il y a aussi l'utilisation d'un module classe x fois instancié simultanément ca n'a pas le merite de faire aussi vite qu'un vbs externe instancié x fois mais j'ai pensé que ca pouvait etre intéréssant de le signaler

    j'ai fait un petit exemple
    ,je ne suis pas aller jusqu'à mettre en places les tableaux mais le code montre quelques astuces interréssantes

    tout dabors on était parti sur une boucle vba faisant toute les requetes ca durait environ 18 minutes
    j'ai donc repris ce système mais en metant la requete dans une classe
    ensuite l'instanciation multiple se fait dans une boucle dans le module standard de base par des variables typée
    l'avantge aussi sur le principe c'est que la premiere requete servant a comptabiliser le nombre de pages n'est plus necessaire
    mon je te montre une ebauche
    code a mettre dans un module standard
    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
     
    Public page(300) As codesource
    Dim codes(300)
    Public Type codesource
        code As Variant
    End Type
    Public NBPAGES As Long
    Sub lance_les_requete()
        debut = Time
        Do
            Set page(i).code = New ReqEuroNext
            cel = i * 20 + i + 1
            sindex = i * 20
            codes(i + 1) = page(i).code.EXT_ALL_EQTIES(sindex)
            Set page(i).code = Nothing
            i = i + 1
        Loop Until i = NBPAGES
        MsgBox "operationcmmencée a : " & debut & vbCrLf & "terminé a " & Time & vbCrLf & "duré :" & Format(Time - debut, "nn:ss") & vbCrLf & "  il y a " & i & "  pages"
        MsgBox codes(3)
    Set code = Nothing
    End Sub
    code a mettre dans un module classe nommé ReqEuroNext

    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
     
    ublic Function EXT_ALL_EQTIES(sindex) As String
         Application.ScreenUpdating = False
        Dim DemandeFichier As Object, URL As String
        Set DemandeFichier = CreateObject("Microsoft.XMLHTTP")  'instancie l'object
        URL = "https://europeanequities.nyx.com/pd/stocks/data?formKey=nyx_pd_filter_values:1006ef55d4998cc0fad71db6a6f38530"
        'On génère la 1 ere requête afin d'obtenir les 20  1ere ligne ainsi que le nombre de page
        DemandeFichier.Open "POST", URL, False
         DemandeFichier.setRequestHeader "Accept", "application/json, text/javascript, */*"
        DemandeFichier.setRequestHeader "Accept-Encoding", "gzip , deflate"
        DemandeFichier.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"  'Ajouté
        DemandeFichier.setRequestHeader "Content-Length", "231"  'Ajouté
        DemandeFichier.setRequestHeader "Cache-Control", "no-cache"  'Ajouté
        DemandeFichier.setRequestHeader "Accept-Language", "fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3"
        DemandeFichier.setRequestHeader "Connection", "keep-alive"    'Modifié, espace retiré "keep -alive"
        DemandeFichier.setRequestHeader "Host", "europeanequities.nyx.com"
        DemandeFichier.setRequestHeader "Pragma", "no-cache"  'Ajouté
        DemandeFichier.setRequestHeader "Referer", "https://europeanequities.nyx.com/fr/equities-directory"
        DemandeFichier.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.0; rv:29.0) Gecko/20100101 Firefox/29.0"
        'on envoie la requete avec un idisplaystart= a 0
      DoEvents
       DemandeFichier.send "sEcho=5&iColumns=7&sColumns=&iDisplayStart=" & sindex & "&iDisplayLength=20&iSortingCols=1&iSortCol_0=0&sSortDir_0=asc&bSortable_0=true&bSortable_1=false&bSortable_2=false&bSortable_3=false&bSortable_4=false&bSortable_5=false&bSortable_6=false"
       ' on détermine le nombre de page a télécharger en récupérant le iTotalRecords dans la première page et en divisant par 20
        NBPAGES = Round(Val(Split(Split(DemandeFichier.responsetext, "iTotalRecords"":")(1), ",")(0)) / 20)
        EXT_ALL_EQTIES = DemandeFichier.responsetext
     End Function
    ca n'a pas la vélocité du vbs mais ca peut être une alternatif en cas d'autorisation d'accès sur disque capricieuse
    résultat 1.45 minute les 74 pages contre 18minutes pour la boucle simple dans un module standard
    ce qui prouve bien qu'Excel peut être multitâches même si il est moins véloce
    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

  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

    VBA est malheureusement bien mono-tâche sauf en rusant via un API (CreateThread) ou encore en externalisant …

    L'avantage des bibliothèques XmlHttp est vraiment leur rapidité
    - je viens de terminer la conversion d'une procédure IE : 39 requêtes en 6s contre au moins 150 avec IE (!) -
    mais VBA reste de l'interprété séquentiel …

    Dans la discussion d'itwoo, as-tu regardé le post #186 en page 10 de Stéphane, serait-ce une pépite ?

    Dans le code de ton module de classe, merci de m'expliquer la présence des lignes n°3 & 21.
    Et si cela ne fonctionne pas sans DoEvents, c'est justement que côté multi-tâches, ce n'est pas vraiment cela.

    L'utilisation d'un module de classe reviendrait à lancer une tâche en parallèle mais c'est grâce aussi
    aux processeurs multi-cœurs car, dix ans en arrière avec la version 2003 en programmant de la sorte,
    je ne suis pas sûr du résultat …

    En tout cas c'est une approche intéressante !
    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
    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 juste pour info suite à une mauvaise manip:
    ici test pour voir WebOk si mauvaise URL => WebOk = false

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(R, 1).Hyperlinks(1).Address = "Bonjour"
    surprise cette adresse reste en mémoire même aprés avoir quitté excel(mais pour la remettre à jour suffit de venir ici la rechercher ) ...où sont stockés les hyperlinks dans excel?

  17. #17
    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




    Salut itwoo !

    Je ne comprends pas ton message par manque d'éléments et aussi vis à vis de cette contribution,
    ne te serais-tu pas trompé de discussion ?

    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)

  18. #18
    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,

    C'est à titre d'info pour connaitre les caractéristiques si elles existent des hyperlinks pour savoir s'il existe un peu comme avec IE
    un set du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Set Iedoc = Ie.document
     
    set test_hyperlink = 
    set_tableau_hyperlink =
    Parce que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox "n° lien hypertext= " & Cells(R, 1).Hyperlinks.Count
    Mais ici il faut faire et chercher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox "adresse URL= " & Cells(R, 1).Hyperlinks(1).Address
    car
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox "adresse URL= " & Cells(R, 1).Hyperlinks.Address
    'ne marche pas!!!

    Merci

  19. #19
    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





    Hyperlinks étant une collection rattachée à la feuille de calculs, un index est donc nécessaire pour accéder à un de ses éléments,
    un objet Hyperlink (une fois pointé, pas de souci pour accéder à ses caractéristiques via ses propriétés).

    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)

  20. #20
    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
    ok c'est noté c'est nickel...merci

Discussions similaires

  1. Réponses: 22
    Dernier message: 10/07/2011, 17h49
  2. Affichage du résultat d'une requête sur la même page html
    Par hanadi_09 dans le forum Développement Web en Java
    Réponses: 9
    Dernier message: 24/10/2010, 08h18
  3. [AC-2002] Envoi d'une requête sur une page web
    Par pier.antoine dans le forum VBA Access
    Réponses: 2
    Dernier message: 26/09/2009, 14h45
  4. [MySQL] Affichage des résultats d'une requête sur plusieurs pages
    Par leloup84 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/10/2006, 13h24
  5. Sous-Formulaire basé sur une requête nécessitant des paramètes
    Par nicou50 dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 02/09/2006, 22h18

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