Contrôler Internet Explorer

7ider5

XLDnaute Nouveau
Bonjour,

J'utilise excel pour contrôler Internet Explorer.
J'ouvre bien ma page, je navigue dedans pour remplir les cases qui vont bien, je clique sur un bouton pour calculer un résultat. Là, une nouvelle page s'ouvre avec mes résultat.
Comme j'ai plusieurs pages ouvertes je recherche celle qui m'intéresse et copie son code source pour traitement ultérieur.
Ensuite je ferme toutes les pages.

Problèmes:

- Le code source de la page est bien affectée à la variable Resultat quand je tourne en débug, mais si je met un point d'arrêt après l'affectation de la variable, je me rend compte qu'elle est vide.

- La methode IE.Quit renvoie apparemment une erreur qui semble finir prématurément ma boucle For, elle ne ferme donc qu'une page web, pas les autres.

- Pour la méthode MiseEnForme, j'ai du déclarer ma variable et tant que Variant ce j'obtenais l'erreur "Type d'argument Byref incompatible" en la déclarant comme une String...

Avec vous des idées des erreurs commises?
Merci. Cordialement,

Pierre

Voici le source

Code:
Sub BtRecherche_Click()
    Application.ScreenUpdating = False
    
    AjoutReferences
    
    Dim i As Integer
    Dim Resultat As String
    Dim ville As String
    Dim appIE As InternetExplorer
    Dim HTMLDoc As HTMLDocument
    Dim oHTML_Element As IHTMLElement
    Dim winShell As New ShellWindows
    Dim sURL As String
    Set appIE = New InternetExplorer
 
    
    'Ancienne adresse
    'sURL = "http://re.jrc.ec.europa.eu/pvgis/apps3/pvest.php?lang=fr&map=europe"
    'Nouvelle adresse
    sURL = "http://re.jrc.ec.europa.eu/pvgis/apps4/pvest.php"
 
    appIE.Silent = True
    appIE.Navigate sURL
    appIE.Visible = True
 
    Do  'Attend que la page soit bien chargée
    Loop Until appIE.ReadyState = READYSTATE_COMPLETE
    
    Set HTMLDoc = appIE.Document
    
    ' Liste des objets présents sur la page
    i = 0
    For Each oHTML_Element In HTMLDoc.getElementsByTagName("input")
        Range("A" & 10 + i) = oHTML_Element.Type
        Range("B" & 10 + i) = oHTML_Element.ID
        Range("C" & 10 + i) = oHTML_Element.Title
        Range("D" & 10 + i) = oHTML_Element.ClassName   'Tagname = "INPUT"
        Range("E" & 10 + i) = oHTML_Element.getAttribute("Name")
        i = i + 1
    Next
    Range("A" & 10 + i) = "terminé"
    
    'Recherche la barre de texte et ecris l'adresse
    For Each oHTML_Element In HTMLDoc.getElementsByTagName("input")
        If oHTML_Element.getAttribute("name") = "address" Then oHTML_Element.setAttribute "value", "rouen": Exit For
    Next
    
    'Recherche du boutton "Search" et clic
    For Each oHTML_Element In HTMLDoc.getElementsByTagName("input")
        If oHTML_Element.getAttribute("value") = "Search" Then oHTML_Element.Click: Exit For
    Next
    
    Do  'Attend que la page soit bien chargée
    Loop Until appIE.ReadyState = READYSTATE_COMPLETE
    
    'Clic sur les CheckBox pour choisir les options
    For Each oHTML_Element In HTMLDoc.getElementsByTagName("input")
        If oHTML_Element.ID = "optrad" Then oHTML_Element.Click
        If oHTML_Element.ID = "selectrad" Then oHTML_Element.Click
        If oHTML_Element.ID = "optincl" Then oHTML_Element.Click
        If oHTML_Element.ID = "degreedays" Then oHTML_Element.Click
    Next
    
    'Recherche du bouton "Calculer" et clic
    For Each oHTML_Element In HTMLDoc.getElementsByTagName("input")
        If oHTML_Element.ID = "MRchoicesubmit" Then oHTML_Element.Click: Exit For
    Next
    
    Do  'Attend que la page soit ouverte
    Loop Until appIE.ReadyState = READYSTATE_COMPLETE
    
    'Dim Cadre As Frame
    'Recherche la bonne page et récupère les données
    For Each appIE In winShell
        If Right(appIE.LocationURL, 10) = "MRcalc.php" Then
            appIE.Visible = True
            Set HTMLDoc = appIE.Document
            Resultat = HTMLDoc.documentElement.innerHTML
        End If
    Next appIE
    ville = "Rouen"
    
    'Mise en forme des données
    MiseEnForme Resultat', ville
    
    Range("A100") = Resultat
    
    'Fermeture des fenetres
    For Each appIE In winShell
        If Left(appIE.LocationURL, 4) = "http" Then appIE.Quit
    Next appIE
    
    'appIE.Quit 'ferme les fenetres
    Set appIE = Nothing
    Application.ScreenUpdating = True
End Sub
 
'Ajout les références nécéssaires à l'utilisation de la macro
Sub AjoutReferences()
    On Error GoTo Handler
    ThisWorkbook.VBProject.References.AddFromFile ("C:\Windows\System32\mshtml.tlb") 'Microsoft HTML Object Library
    ThisWorkbook.VBProject.References.AddFromFile ("C:\Windows\System32\shdocvw.dll") 'Microsoft internet Controls
 
Handler:
    If Err.Number = 32813 Then
    Else: MsgBox Err.Number & vbLf & Err.Description
    End If
End Sub
 
Sub MiseEnForme(Buffer As Variant) ', ville As String)
 
    Dim Tableau As String
    Dim Longitude, Latitude As String
    Dim Altiture, Inclinaison, Pombrage As Double
    Dim Deb, Fin As Integer
    
    
    'Recherche de la position
    Deb = InStr(1, Buffer, "Location:")
    Fin = InStr(Deb, Buffer, ",")
    Latitude = Mid(Buffer, Deb + 10, Fin - Deb)
    Deb = Fin
    Fin = InStr(Deb + 1, Buffer, ",")
    Longitude = Mid(Buffer, Deb, Fin - Deb)
    
    
 
End Sub
 

PMO2

XLDnaute Accro
Re : Contrôler Internet Explorer

Bonjour,

J'ai repris votre code et j'ai 2 propositions

1) Chercher les infos avec HTMLDoc.documentElement.innerHTML

Code:
'### Ville à adapter ###
Const VILLE As String = "marseille"
'#######################

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function PostMessage& Lib "user32" Alias "PostMessageA" ( _
  ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long)

Private Const WM_CLOSE = &H10
       
Sub RechercheIE()
Dim i As Integer
Dim Resultat As String
Dim sURL As String
Dim appIE As Object             'InternetExplorer
Dim HTMLDoc As Object           'HTMLDocument
Dim oHTML_Element As Object     'IHTMLElement
Dim winShell As Object          'New ShellWindows
Dim S As Worksheet
Dim SH As Shape
Dim T()
Dim j&
Dim var
Set appIE = CreateObject("InternetExplorer.Application")
Set winShell = CreateObject("Shell.Application").Windows
sURL = "http://re.jrc.ec.europa.eu/pvgis/apps4/pvest.php"
appIE.Silent = True
appIE.Navigate sURL
appIE.Visible = True
Do  'Attend que la page soit bien chargée
Loop Until appIE.ReadyState = 4   'READYSTATE_COMPLETE
Set HTMLDoc = appIE.Document
    
'''    ' Liste des objets présents sur la page
'''    i = 0
'''    For Each oHTML_Element In HTMLDoc.getElementsByTagName("input")
'''        Range("A" & 10 + i) = oHTML_Element.Type
'''        Range("B" & 10 + i) = oHTML_Element.ID
'''        Range("C" & 10 + i) = oHTML_Element.Title
'''        Range("D" & 10 + i) = oHTML_Element.ClassName   'Tagname = "INPUT"
'''        Range("E" & 10 + i) = oHTML_Element.getAttribute("Name")
'''        i = i + 1
'''    Next
'''    Range("A" & 10 + i) = "terminé"
    
'Recherche la barre de texte et ecris l'adresse
For Each oHTML_Element In HTMLDoc.getElementsByTagName("input")
  If oHTML_Element.getAttribute("name") = "address" Then
    oHTML_Element.setAttribute "value", VILLE
    Exit For
  End If
Next oHTML_Element
'Recherche du boutton "Search" et clic
For Each oHTML_Element In HTMLDoc.getElementsByTagName("input")
  If oHTML_Element.getAttribute("value") = "Search" Then
    oHTML_Element.Click
    Exit For
  End If
Next oHTML_Element
Do  'Attend que la page soit bien chargée
Loop Until appIE.ReadyState = 4   'READYSTATE_COMPLETE
'Clic sur les CheckBox pour choisir les options
For Each oHTML_Element In HTMLDoc.getElementsByTagName("input")
  If oHTML_Element.ID = "optrad" Then
    oHTML_Element.Click
  End If
  If oHTML_Element.ID = "selectrad" Then
    oHTML_Element.Click
  End If
  If oHTML_Element.ID = "optincl" Then
    oHTML_Element.Click
  End If
  If oHTML_Element.ID = "degreedays" Then
    oHTML_Element.Click
  End If
Next oHTML_Element
'--- Retardateur 500 millièmes de seconde ---
Sleep 500
'Recherche du bouton "Calculer" et clic
For Each oHTML_Element In HTMLDoc.getElementsByTagName("input")
  If oHTML_Element.ID = "MRchoicesubmit" Then
    oHTML_Element.Click
    Exit For
  End If
Next oHTML_Element
'Recherche la bonne page et récupère les données
Do
  For Each appIE In winShell
    If Right(appIE.LocationURL, 10) = "MRcalc.php" Then
      appIE.Visible = True
      Set HTMLDoc = appIE.Document
      Resultat = HTMLDoc.documentElement.innerHTML
    End If
  Next appIE
Loop Until Resultat <> ""
'Mise en forme des données
var = MiseEnForme(Resultat)
Set S = Sheets.Add
S.Range("A2:B4") = var
S.[a1] = VILLE
'Fermeture des fenetres
For Each appIE In winShell
  If Left(appIE.LocationURL, 4) = "http" Then
    j& = j& + 1
    ReDim Preserve T(1 To j&)
    T(j&) = appIE.hWnd
  End If
Next appIE
For j& = 1 To UBound(T)
  PostMessage T(j&), WM_CLOSE, 0, 0
Next j&

Set appIE = Nothing
End Sub
 

Function MiseEnForme(Buffer As String) As Variant
Dim T(1 To 4, 1 To 2)
Dim A$

A$ = Buffer
A$ = Mid(A$, InStr(1, A$, "Location: ") + Len("Location: "))
T(1, 1) = "Latitude"
T(1, 2) = Mid(A$, 1, InStr(1, A$, ",") - 1)
 
A$ = Mid(A$, Len(T(1, 2)) + 3)
T(2, 1) = "Longitude"
T(2, 2) = Mid(A$, 1, InStr(1, A$, ",") - 1)
 
A$ = Mid(A$, Len(T(2, 2)) + 3)
T(3, 1) = "Altitude"
T(3, 2) = Mid(A$, 1, InStr(1, A$, ",") - 1)

A$ = Mid(A$, InStr(1, A$, "Optimal inclination angle is: ") + Len("Optimal inclination angle is: "))
T(4, 1) = "Inclinaison"
T(4, 2) = Mid(A$, 1, InStr(1, A$, "<BR>") - 1)

MiseEnForme = T
End Function


2) Copier directement la page dans Internet Explorer et la coller dans Excel
NE PAS LANCER CETTE SUB A PARTIR DU VBE (à cause des simulations de touche)

Code:
'### Ville à adapter ###
Const VILLE As String = "Paris"
'#######################

Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, _
  ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function PostMessage& Lib "user32" Alias "PostMessageA" ( _
  ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long)

Private Const WM_CLOSE = &H10
    
'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
'ATTENTION
'NE PAS LANCER CETTE SUB A PARTIR DU VBE (à cause des simulations de touche)
'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Sub RechercheIEcopie()
Dim i As Integer
Dim Resultat As String
Dim sURL As String
Dim appIE As Object             'InternetExplorer
Dim HTMLDoc As Object           'HTMLDocument
Dim oHTML_Element As Object     'IHTMLElement
Dim winShell As Object          'New ShellWindows
Dim T()
Dim j&
Dim var
Set appIE = CreateObject("InternetExplorer.Application")
Set winShell = CreateObject("Shell.Application").Windows
sURL = "http://re.jrc.ec.europa.eu/pvgis/apps4/pvest.php"
appIE.Silent = True
appIE.Navigate sURL
appIE.Visible = True
Do  'Attend que la page soit bien chargée
Loop Until appIE.ReadyState = 4   'READYSTATE_COMPLETE
Set HTMLDoc = appIE.Document
'Recherche la barre de texte et ecris l'adresse
For Each oHTML_Element In HTMLDoc.getElementsByTagName("input")
  If oHTML_Element.getAttribute("name") = "address" Then
    oHTML_Element.setAttribute "value", VILLE
    Exit For
  End If
Next oHTML_Element
'Recherche du boutton "Search" et clic
For Each oHTML_Element In HTMLDoc.getElementsByTagName("input")
  If oHTML_Element.getAttribute("value") = "Search" Then
    oHTML_Element.Click
    Exit For
  End If
Next oHTML_Element
Do  'Attend que la page soit bien chargée
Loop Until appIE.ReadyState = 4   'READYSTATE_COMPLETE
'Clic sur les CheckBox pour choisir les options
For Each oHTML_Element In HTMLDoc.getElementsByTagName("input")
  If oHTML_Element.ID = "optrad" Then
    oHTML_Element.Click
  End If
  If oHTML_Element.ID = "selectrad" Then
    oHTML_Element.Click
  End If
  If oHTML_Element.ID = "optincl" Then
    oHTML_Element.Click
  End If
  If oHTML_Element.ID = "degreedays" Then
    oHTML_Element.Click
  End If
Next oHTML_Element
'--- Retardateur 500 millièmes de seconde ---
Sleep 500
'Recherche du bouton "Calculer" et clic
For Each oHTML_Element In HTMLDoc.getElementsByTagName("input")
  If oHTML_Element.ID = "MRchoicesubmit" Then
    oHTML_Element.Click
    Exit For
  End If
Next oHTML_Element
'Recherche la bonne page et récupère les données
Do
  For Each appIE In winShell
    If Right(appIE.LocationURL, 10) = "MRcalc.php" Then
      appIE.Visible = True
      Set HTMLDoc = appIE.Document
      Resultat = HTMLDoc.documentElement.innerHTML
    End If
  Next appIE
Loop Until Resultat <> ""
Sleep 1000
keybd_event &H11, 0, 0, 0 'presse Ctrl
keybd_event &H41, 0, 0, 0 'presse A
keybd_event &H41, 0, 2, 0 'relâche A
keybd_event &H11, 0, 2, 0 'relâche Ctrl
keybd_event &H11, 0, 0, 0
keybd_event &H43, 0, 0, 0 'presse C
keybd_event &H43, 0, 2, 0 'relâche C
keybd_event &H11, 0, 2, 0
'Fermeture des fenetres
For Each appIE In winShell
  If Left(appIE.LocationURL, 4) = "http" Then
    j& = j& + 1
    ReDim Preserve T(1 To j&)
    T(j&) = appIE.hWnd
  End If
Next appIE
For j& = 1 To UBound(T)
  PostMessage T(j&), WM_CLOSE, 0, 0
Next j&
Set appIE = Nothing
Application.OnTime Now + TimeValue("00:00:01"), "Coller"
End Sub
 
Sub Coller(Optional dummy As Byte)
Dim S As Worksheet
Dim SH As Shape
Set S = Sheets.Add
S.[a2].Select
keybd_event &H11, 0, 0, 0
keybd_event &H56, 0, 0, 0 'presse V
keybd_event &H56, 0, 2, 0 'relâche V
keybd_event &H11, 0, 2, 0
DoEvents
For Each SH In S.Shapes
  SH.Cut
Next SH
Rows(S.[a65536].End(xlUp).Row).Delete
S.Columns.EntireColumn.AutoFit
S.[a1].Select
S.[a1] = VILLE
End Sub


Ces 2 codes fonctionnent chez moi en sera-t-il de même chez vous ?

Cordialement.

PMO
Patrick Morange
 

7ider5

XLDnaute Nouveau
Re : Contrôler Internet Explorer

Bonjour Patrick,

Merci pour votre réponse, je vais me pencher sur vos remarques.
Ça fait un petit moment que cette question reste en suspend sur plusieurs forums, vous êtes apparemment le seul apte à y répondre!

Cordialement,
 

7ider5

XLDnaute Nouveau
Re : Contrôler Internet Explorer

Re,

D'abord, merci beaucoup ça marche du tonnerre, chapeau!
Je vais devoir exécuter la macro plusieurs fois pour une liste de villes. J'ai donc fais une troisième méthode qui appelle RechercheIEcopie avec la ville en paramètre et j'ai supprimé la ligne :
Code:
Application.OnTime Now + TimeValue("00:00:01"), "Coller"
Pour la remplacer par :
Code:
Sleep 1000
Coller VILLE
Ça à l'air de bien marcher, il me reste à récupérer les données collées pour les ranger dans une base.

petite question?
- Pourquoi avoir utilisé Application.OnTime plutôt qu'un Sleep?
-Dans la boucle de fermeture des fenêtres, quelle est l'utilité du & sur la variable j??

Merci bien.

P.
 

PMO2

XLDnaute Accro
Re : Contrôler Internet Explorer

Bonjour,

- Pourquoi avoir utilisé Application.OnTime plutôt qu'un Sleep?
Quand j'utilisais Sleep cela fonctionnait parfois et plantait d'autres fois.
Avec OnTime cela marchait à tous les coups (sur ma machine)

-Dans la boucle de fermeture des fenêtres, quelle est l'utilité du & sur la variable j??
C'est ma façon de programmer; cela m'indique de manière continue le type de la variable. J'utilise le typage par suffixe
Dim j& correspond à Dim j As Long
% = Integer
! = Single
# = Double
$ = String
@ = Currency

Cela n'a aucun intérêt et vous pouvez écrire

Code:
For Each appIE In winShell
  If Left(appIE.LocationURL, 4) = "http" Then
    j = j + 1
    ReDim Preserve T(1 To j)
    T(j) = appIE.hWnd
  End If
Next appIE
For j = 1 To UBound(T)
  PostMessage T(j), WM_CLOSE, 0, 0
Next j

Cordialement.

PMO
Patrick Morange
 

Discussions similaires

Réponses
2
Affichages
236
Réponses
5
Affichages
185

Statistiques des forums

Discussions
312 211
Messages
2 086 284
Membres
103 170
dernier inscrit
HASSEN@45