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 :

Comment optimiser les données web avec QueryTables.Add ? (freeze+lenteur) [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 93
    Par défaut Comment optimiser les données web avec QueryTables.Add ? (freeze+lenteur)
    Bonjour à tous !

    Voilà j'ai deux problèmes dont un très handicapant. J'ai plusieurs macros qui cherchent des données sur internet avec la fonction "QueryTables.Add".

    Lors de l'exécution, excel fige et la fenêtre s'affiche prioritairement sur windows, c'est à dire que je ne peux utiliser mes autres applications comme firefox normalement, c'est même impossible lors de certaines phases de la récupération

    Le second problème qui reste secondaire, concerne le temps de récupération qui est très long, même si je sélectionne qu'une table. J'ai vu qu'il y a un tas de paramètres pour la fonction query mais même après avoir tout mis sur false il n'y a aucun résultat positif.

    Mon principale problème reste le premier car en fin de compte il rend inutile mon programme quand je suis sur mon ordinateur.

    Merci pour vos soluces !

  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
    Bonjour,

    Après le pilotage d'Internet Explorer, l'objet QueryTable est effectivement le plus lent,
    tout dépend de l'ordinateur, de la version d'Excel et de la célérité de la connexion …
    La semaine dernière la même procédure via QueryTable dans trois lieux différents a donné de sacrés écarts de temps :
    10 minutes, 5 minutes et une minute et 15 secondes …

    Il n'y a pas d'optimisation, il y a juste un bon paramétrage pour obtenir le résultat attendu …

    Donc pour accélérer, en sachant décoder une page Web (HTML) et si elle le permet,
    oublier QueryTable au profit d'une bibliothèque comme MSXML2.XMLHTTP ou encore Microsoft.XMLHTTP
    L'ordinateur aux 10 minutes a besoin de seulement 45 secondes via une bibliothèque !
    Celui aux 1'15'' n'en prend plus que 25 secondes …

    Consulter le tutoriel VBA et développement Web.

    Un exemple parmi d'autres du forum : récupérer des données Internet

    __________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 93
    Par défaut
    Merci

    Il n'y a pas de solution quand au freeze lors de l'actualisation avec query ?

    J'ai XML v6.0 et 3.0 dans mon excel 2013, il y a-t-il une grande différence ?

    Je vais voir ce que je peux faire avec ces bibliothèques. Mais vu mon niveau je crois que je vais googleliser sec. Le tuto à l'air complet toutefois.

    On verra !

    @plus !

    Pour la rapidité et l'utilisation de XML c'est un autre monde pour moi. Je donne l'exemple de ma macro query que je voudrais transposer en XML.

    Que puis je faire pour lancer un peu la même chose, c'est a dire d'écrire sur une feuille des données d'une requête web avec XML, puis de chercher l'information qui m'intéresse et la reporter sur ma feuille principale ?

    En fait c'est surtout la première partie sur le lancement de la requête qui m’intéresse, la seconde est déjà faites

    Merci beaucoup !



    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
     
     With Sheets("2").QueryTables.Add(Connection:="URL;https://www.google.fr/" _
            , Destination:=Sheets("2").Range("$A$1"))
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .BackgroundQuery = True
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .WebSelectionType = xlAllTables
            .WebFormatting = xlWebFormattingNone
            .WebPreFormattedTextToColumns = True
            .WebConsecutiveDelimitersAsOne = True
            .WebSingleBlockTextImport = False
            .WebDisableDateRecognition = False
            .WebDisableRedirections = False
            .Refresh BackgroundQuery:=True
        End With
     
     
            If IsEmpty(Sheets("2").Range("$A$1")) Then
     
                Sheets("Feuil1").Range("$B$1") = "Vide"
     
            End If
     
     
        For ligne = 1 To 1000
     
            If Left(Sheets("2").Range("$A$1").Cells(ligne, 1), 32) = "France" Then
     
                Sheets("Feuil1").Range("$B$1") = Sheets("2").Range("$A$1")
     
            End If
     
        Next

  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

    Tout dépend de la structure de la page Web (HTML) et des données à récupérer …

    Dans l'exemple, voir les posts #28 & #33.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 93
    Par défaut
    salut !

    j'ai trouvé un code, qui fait apparemment la même chose que query sauf en 100 fois plus rapide et sans freeze, il me manque que la destination de la table.

    Comment choisir la feuille et la cellule de destination des données à l'image de "Destination:=Sheets("2").Range("$A$1")" du code query, qu'elle est la modification à faire dans le code ci-dessous? (j'ai pas compris tout le code notamment for i et j et autres mais ça fonctionne bien)

    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Sub essai()
     
    Dim IE As InternetExplorer
    Dim maPageHtml As HTMLDocument
    Dim Htable As IHTMLElementCollection
    Dim maTable As IHTMLTable
    Dim j As Integer, i As Integer
    Dim Cible As String
     
    Set IE = CreateObject("InternetExplorer.Application")
    IE.Visible = False
     
    IE.navigate "http://www."
        Do Until IE.readyState = READYSTATE_COMPLETE
        DoEvents
    Loop
     
    Set maPageHtml = IE.document
    Set Htable = maPageHtml.getElementsByTagName("table")
    Set maTable = Htable(0)
     
    For i = 1 To maTable.Rows.Length
     
        For j = 1 To maTable.Rows(i - 1).Cells.Length
     
            Cible = maTable.Rows(i - 1).Cells(j - 1).innerHTML
     
            If Left(Cible, 8) = "<A href=" Then
                ActiveSheet.Hyperlinks.Add Cells(i, j), Mid(Cible, 10, InStr(10, Cible, ">") - 11)
            Else
                Cells(i, j) = maTable.Rows(i - 1).Cells(j - 1).innerText
            End If
        Next j
    Next i
     
    End Sub

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/05/2009, 18h00
  2. [AC-2003] importation de donnée excel vers access : comment optimiser les tables ?
    Par pshd22 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 31/03/2009, 18h17
  3. comment récupérer les données d'une paramètre avec cplex
    Par debalgo dans le forum Intelligence artificielle
    Réponses: 1
    Dernier message: 18/06/2008, 12h32
  4. Comment traiter les données reçues avec WinSock ?
    Par Shredder dans le forum Web & réseau
    Réponses: 3
    Dernier message: 01/10/2007, 13h54
  5. Réponses: 10
    Dernier message: 13/08/2007, 16h12

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