VBA: recopier du contenu de pages Web__

Anonyme
2010-07-04T11:18:25+00:00

Bonjour,

J'ai une tâche fastidieuse dont VBA pourrait aisément (pas pour moi!) se charger :

Une application statistique sort ses résultats sur plusieurs fenêtres internet explorer. Je dois tout regrouper sur une seule feuille.

Je sélectionne une fenêtre IE, ctrl+A, retour dans Excel (range A1), Ctrl+C, range A ??? dernière cellule, fermer la fenêtre IE et je recommence ce scénarion une dizaine de fois.

Le pilotage de IE n'est pas très clair (j'ai bien essayé une fonction EnumWindows mais sans trop de succès).

Je fais donc appel à l'équipe de ce nouveau forum (qui, j'espère, est la même que surhttps://www.microsoft.com/office/community/fr-fr/default.mspx?dg=microsoft.public.fr.excel&lang=fr&cr=FR qui semble désespérément vide).

Merci


René Delcourt

Microsoft 365 et Office | Excel | Pour la maison | Windows

Question verrouillée. Cette question a été migrée à partir de la Communauté Support Microsoft. Vous pouvez voter pour indiquer si elle est utile, mais vous ne pouvez pas ajouter de commentaires ou de réponses ni suivre la question.

0 commentaires Aucun commentaire
Réponse acceptée par l’auteur de la question
Anonyme
2010-07-10T18:59:27+00:00

J'allais oublier, il se peut dans ton cas que le nombre de "Tab" soit différent de 39. Par exemple, j'ai la barre d'outils "Google" d'installer dans l'interface d'Internet Explorer si ton environnement est différent, le nombre de tab risque aussi d'être différent... à toi d'effectuer le décompte dans l'interface que tu utilises en utilisant toujours le même point de départ ! C'est là tout le plaisir !

;-))


MichD


Cette réponse a-t-elle été utile ?

0 commentaires Aucun commentaire
Réponse acceptée par l’auteur de la question
Anonyme
2010-07-10T18:51:39+00:00

Dans l'exemple précis de cette page :

http://jacxl.free.fr/cours_xl/cours_xl_jac.html#accueil_finances

Tu modifies ce bout de code des Sendkeys comme suit dans

la procédure proposée : (Déclare la variable A as integer)

Do While a <= 39

    SendKeys "{TAB}"

    DoEvents

    a = a + 1

Loop

SendKeys "%EA"

SendKeys "%EC"

Et avant d'appeler l'exécution du code, tu sélectionnes l'adresse internet dans la barre d'adresse d'Internet Explorer.

En principe quand tu colles l'adresse dans Internet Explorer, dès que tu arrives sur la page, tu comptes le nombre de fois que tu dois appuyer sur la touche "Tab" avant que la section désirée devienne active. En théorie, cela fonctionne. Le problème est celui-ci... qu'est-ce qui se passe si l'usager a sélectionné un élément de la page ? Combien de fois faut-il appuyer sur la touche "Tab" à partir de la section déjà sélectionnée afin que la bonne section de la fenêtre qui nous intéresse soit activée ? Cela devient très aléatoire !

La programmation par Sendkeys est celle du dernier recours. Afin d'être capable de réussir de répéter la même séquence positivement, il faut s'assurer que l'on exécute toujours les mêmes manoeuvres dans les mêmes séquences et s'assurer aussi que l'usager ne jouera pas de la souris pendant l'exécution de la procédure.

En dernier lieu,  il faut modifier cette séquence pour chaque site internet particulier.

Voilà ce qui est possible de faire lorsque le site est structuré à partir d'objets "Cadre".

Si les données du site sont dans des tableaux, c'est beaucoup plus facile, car on peut

utiliser une QueryTable sur le site et employé la propriété du Querytable  .WebTables = "x"

x étant l'occurrence du tableau que l'on peut calculer en utilisant la source du code de la page!


MichD


"rdelcourt" a écrit dans le message de groupe de discussion : *** Adresse électronique supprimée pour cause de confidentialité ***...

Bonjour et merci pour ton retour d'abdication :-)

Formidable! Respect!

Après avoir testé la chose, j'ai imbriqué ton code dans celui où j'étais bloqué. Ainsi, il détecte tous les Titre IE qui contiennent "?????" et copie le contenu du presse papier dans une feuille Excel, l'un à la suite de l'autre.

Pour mon test, j'ai pris le site de Frédéric Sigeonneau, ouvert quelques codes VBA (un seul frame) et retrouvé tout leur contenu dans une feuille excel...heureux!

Comme je n'ai pas l'application en question à la maison, j'ai continué le test en prenant un site à plusieurs frames (http://jacxl.free.fr/cours_xl/cadres.html?ex=) et là...je ne retrouve pas le texte "Perfectionnement Excel" mais, je suppose, ceux du premier frame.

Je présume que dans tous les paramètres de ton code, il y en a bien un qui permettra d'atteindre le deuxième ou le troisième frame, non?

Voici le mariage des codes (perfectible, je suppose, mais je n'ose plus trop y toucher...tan que ça tourne!) :

Option Explicit

Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long

Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

Private Declare Function GetDesktopWindow Lib "user32" () As Long

Private Declare Function GetWindow& Lib "user32" (ByVal hwnd&, ByVal wCmd&)

Private Declare Function GetWindowLong& Lib "user32" Alias "GetWindowLongA" (ByVal hwnd&, ByVal nIndex&)

Private Declare Function GetWindowText& Lib "user32" Alias "GetWindowTextA" (ByVal hwnd&, ByVal lpString$, ByVal aint&)

Private Const mconMAXLEN = 255

Public Const SW_HIDE = 0

Public Const SW_SHOWNORMAL = 1

Public Const SW_NORMAL = 1

Public Const SW_SHOWMINIMIZED = 2

Public Const SW_SHOWMAXIMIZED = 3

Public Const SW_MAXIMIZE = 3

Public Const SW_SHOWNOACTIVATE = 4

Public Const SW_SHOW = 5

Public Const SW_MINIMIZE = 6

Public Const SW_SHOWMINNOACTIVE = 7

Public Const SW_SHOWNA = 8

Public Const SW_RESTORE = 9

Public Const SW_SHOWDEFAULT = 10

Public Const SW_MAX = 10

Dim hwnd&

'Dans un module

Dim ouverte() As String

Dim temp As String

Public sSave As String

Private Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long

Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Boolean

'Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long

Public Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Boolean

    Dim Ret As Long

    Ret = GetWindowTextLength(hwnd)

    sSave = Space(Ret)

    GetWindowText hwnd, sSave, Ret + 1

    If sSave Like "Formation*" Then

        Activer_Voir_Fenêtre

    End If

    'continue enumeration

    EnumWindowsProc = True

End Function

Sub test()

EnumWindows AddressOf EnumWindowsProc, ByVal 0&

End Sub

Sub Activer_Fenêtre(MaFenêtre As String)

Dim Style&, Title$, i&

Dim A As Integer

hwnd = 0

hwnd = GetWindow(GetDesktopWindow(), 5)

Do While hwnd

  Title = GetCaption(hwnd)

  If Len(Title) Then

    If GetWindowLong(hwnd, -16) And &H10000000 Then

      If InStr(1, Title, MaFenêtre, 1) Then

        AppActivate Title

        Exit Sub

      End If

    End If

  End If

  hwnd = GetWindow(hwnd, 2)

Loop

End Sub

Private Function GetCaption(hwnd&) As String

Dim i%, Buffer$: Buffer = String$(254, 0)

i = GetWindowText(hwnd, Buffer, 255)

If i Then GetCaption = Left$(Buffer, i)

End Function

Sub Activer_Voir_Fenêtre()

Dim T As Double, Voir_Fenêtre As String

'Tu dois indiquer pour la variable "Voir_Fenêtre"

'au moins une partie de ce qu'affiche la barre de

'titre de l'application Internet dont tu veux extraire

'tes données. Ce contenu peut provenir du contenu

'une cellule d'une feuille de calcul où d'une procédure.

'Tu peux faire comme moi et le coder en dur si c'est une

'constante...

'***********Variables à définir*******************

Voir_Fenêtre = sSave

'*************************************************

Call Activer_Fenêtre(Voir_Fenêtre)

If hwnd = 0 Then Exit Sub

'Ajoute une feuille dans le classeur où se fera la copie

'Sheets.Add after:=Sheets(Sheets.Count)

DoEvents

'SetForegroundWindow Hwnd

'SW_SHOWDEFAULT tu peux remplacer par une

'des constantes énumérées pour l'état de

'la fenêtre

ShowWindow hwnd, 1

'Les lettres utilisées dans la commande Sendkeys sont celles utiles

'pour l'application "Windows Internet Explorer" qui représente

'les commandes du menu "Édition" - Tout sélectionner - copier

'Si tu utilises un autre fureteur internet, il faudra adapter

'les lettres des commandes Sendkeys

SendKeys "%ES"

SendKeys "%EP"

'Selon la puissance du processeur et de sa connexion internet

'on peut augmenter le délai. Pour ce faire on remplace 1 par le

'nombre de secondes que durera le délai.

T = Timer + 1

Do While Timer <= T

    DoEvents

Loop

'copier le contenu du presse-papier

ActiveSheet.Paste

    ActiveCell.SpecialCells(xlLastCell).Offset(1, 0).Select

'Permet de revenir à la fenêtre Excel

Call Activer_Fenêtre(ThisWorkbook.Name)

SetForegroundWindow hwnd

'Tu peux modifier 3 pour une autre constante numérique

'définit dans le haut du module pour déterminer la

'fenêtre de l'application Excel

ShowWindow hwnd, 3

'MsgBox "Opération Terminé."

End Sub


René Delcourt

Cette réponse a-t-elle été utile ?

0 commentaires Aucun commentaire

32 réponses supplémentaires

  1. Anonyme
    2010-07-04T13:12:36+00:00

    L'adresse mentionnée n'est pas accessible !


    MichD


    "rdelcourt" a écrit dans le message de groupe de discussion : *** Adresse électronique supprimée pour cause de confidentialité ***...

    Merci pour la suggestion.

    J'ai trouvé un début de solution : dans : La page Web est-elle ouverte ? <http://social.answers.microsoft.com/Forums/fr-FR/officeexcelfr/thread/421a9001-f5c6-4a00-87e1-9a4b0307de8d/page_ouverte.html>

    Il me manque cependant 2 éléments :

    1. Parcourir les pages ouvertes qui commencent    par (Like) et non pas le nom entier comme le propose la fonction.
    2. Agir sur cette page avec Ctrl+A et Ctrl+C pour faire Ctrl+V dans Excel (contrairement au Ctrl+C de ma question).

    René Delcourt

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire
  2. Anonyme
    2010-07-04T13:08:21+00:00

    Merci pour la suggestion.

    J'ai trouvé un début de solution : dans : La page Web est-elle ouverte ?

    Il me manque cependant 2 éléments :

    1. Parcourir les pages ouvertes qui commencent par (Like) et non pas le nom entier comme le propose la fonction.
    2. Agir sur cette page avec Ctrl+A et Ctrl+C pour faire Ctrl+V dans Excel (contrairement au Ctrl+C de ma question).

    René Delcourt

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire
  3. Anonyme
    2010-07-04T12:45:01+00:00

    Bonjour,

    As-tu consulté ce site :

    http://jacxl.free.fr/cours_xl/cadres.html?ex=


    MichD


    "rdelcourt" a écrit dans le message de groupe de discussion : *** Adresse électronique supprimée pour cause de confidentialité ***...

    Bonjour,

    J'ai une tâche fastidieuse dont VBA pourrait aisément (pas pour moi!) se charger :

    Une application statistique sort ses résultats sur plusieurs fenêtres internet explorer. Je dois tout regrouper sur une seule feuille.

    Je sélectionne une fenêtre IE, ctrl+A, retour dans Excel (range A1), Ctrl+C, range A ??? dernière cellule, fermer la fenêtre IE et je recommence ce scénarion une dizaine de fois.

    Le pilotage de IE n'est pas très clair (j'ai bien essayé une fonction EnumWindows mais sans trop de succès).

    Je fais donc appel à l'équipe de ce nouveau forum (qui, j'espère, est la même que surhttps://www.microsoft.com/office/community/fr-fr/default.mspx?dg=microsoft.public.fr.excel&lang=fr&cr=FR qui semble désespérément vide).

    Merci


    René Delcourt

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire