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