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

VBA Discussion :

Internet Explorer - Cliquer sur les "MsgBox"


Sujet :

VBA

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Points : 8
    Points
    8
    Par défaut Internet Explorer - Cliquer sur les "MsgBox"
    Bonjour,

    Je tiens d'abord à féliciter tous les contributeurs de cet excellent site.
    Grace à vous, j'ai pu creer des macros sous excel qui m'ont fait gagner enormement de temps!

    Je dois faire réguliérement des extractions d'une base de données se trouvant sur un serveur distant.
    Les extractions sont est crées dynamiquement je dois donc cliquer sur le lien qui crée le fichier suivant une requête et me le renvoi, j'ai alors la box qui apparait "Telechargement de fichier. Que voulez vous faire ? : Ouvrir, Enregistrer, Annuler"

    Là, où je bloque :
    Je ne sais pas comment faire pour cliquer sur enregistrer!..
    Aussi je sais déjà que j'aurai le même probléme dans la boite de dialogue suivante pour entrer le chemin du fichier et reCliquer sur Enregistrer...

    Voici mon code pour l'instant.


    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
    Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hwndParent As Long, ByVal hwndChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long
     
     
    Sub Internet()
     
     
        Dim ie As InternetExplorer
        Dim IEdoc As Object
        Dim DOCelement As Object
        Dim login As String
        Dim password As String
        Dim lPopupHandle As Long
     
        Set ie = New InternetExplorer
        ie.Visible = True
        lPopupHandle = 0
        login = ""
        password = ""
     
        ie.navigate ("http..........")
     
         ' attente de fin de chargement
        Do Until ie.ReadyState = 4
            DoEvents
        Loop
     
        Set IEdoc = ie.document
     
        login = InputBox("Login")
        password = InputBox("Password")
     
        'login
         Set DOCelement = IEdoc.getElementsByName("Id").Item
         DOCelement.Value = login
     
        'password
         Set DOCelement = IEdoc.getElementsByName("Pwd").Item
         DOCelement.Value = password
         DOCelement.Select
     
        'connexion
         Set DOCelement = IEdoc.getElementsByName("Login").Item
         DOCelement.Click
     
        Do Until ie.ReadyState = 4
            DoEvents
        Loop
     
        ie.navigate ("http.........")
     
        Do Until ie.ReadyState = 4
              DoEvents
        Loop
     
        Set DOCelement = IEdoc.getElementsByName("lance le telechargement du fichier").Item
        DOCelement.Click
     
     
    'permet de reconnaitre lorsque la boite de dialoque apparait
    While lPopupHandle = 0
        DoEvents
        lPopupHandle = FindWindowEx(0, 0&, "#32770", "Téléchargement de fichier")
    Wend
     
     
    End Sub

    Cela fait deux jours que je cherche et je n'arrive pas à trouver la solution pour commander la boite de dialogue qui apparait (je dois surement chercher au mauvais endroit...)

    Je remercie par avance tous ceux qui voudront bien m'aider, je ne demande pas une solution toute faite bien sur mais surtout des pistes interessantes afin que mes recherches soient plus productives!
    Sur ce, bon w-e!

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 651
    Points : 34 362
    Points
    34 362
    Par défaut
    salut,
    une piste à explorer selon moi :
    Sendkeys

    la syntaxe et ses subtilités sont expliquées dans l'aide en ligne

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    bonjour jpcheck et merci pour ta réponse,

    suite à ton message j'ai commencé à cherché du coté de sendkeys et en cours de route j'ai finalement trouvé la solution avec SendMessage.

    j'ai trouvé la solution sur un autre site (la methode est un peu compliquée pour un novice comme moi) voici le code :

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
        (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
        (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
    Private Declare Function SetActiveWindow Lib "user32.dll" (ByVal hwnd As Long) 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) As Long
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
        (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
     
    Public hwnd As Long
    Private Const WM_KEYDOWN = &H100
    Private Const WM_CHAR = &H102
    Private Const VK_RETURN = &HD
    Private Const BM_CLICK = &HF5
     
     
    Sub LaunchDownload()
     
        On Error Resume Next
        Set ie = CreateObject("InternetExplorer.Application" )
     
        acceuil = "http://intranet"
        baseline = "http://intranet/monfichier.csv"
     
        fichier_baseline = "c:\baseline.csv"
     
        If Dir(fichier_baseline) <> "" Then Kill fichier_baseline
     
        'connection à la page d'acceuil intranet pour éviter les problèmes de login/password
        ie.Navigate acceuil
        'ie.Visible = True
        Do Until ie.ReadyState = 4 'Loop unitl ie page is fully loaded
            DoEvents
        Loop
     
        If ie.document.Title = "Mettre le Header de votre page, c'est juste pour un test" Then
     
            ie.Navigate baseline
            Do Until ie.ReadyState = 4
                DoEvents
            Loop
            hwnd = 0
            hwnd_fils = 0
            Do
                hwnd = FindWindow(vbNullString, "File Download" )
                If hwnd = 0 Then
                    PauseTimer (1)
                Else
                    hwnd_button = FindWindowEx(hwnd, 0, "Button", "&Save" )
                End If
            Loop While hwnd_button = 0
            hwnd_button_hexa = Hex(hwnd_button)
            hwnd_hexa = Hex(hwnd)
     
            SetActiveWindow hwnd
            SendMessage hwnd_button, BM_CLICK, ByVal CLng(0), ByVal CLng(0)
     
            Do
                hwnd_fils = FindWindow(vbNullString, "Save As" )
                If hwnd_fils = 0 Then
                    PauseTimer (1)
                Else
                    hwnd_button = FindWindowEx(hwnd_fils, 0, "Button", "&Save" )
                    hwnd_level1 = FindWindowEx(hwnd_fils, 0, "ComboBoxEx32", "" )
                    hwnd_level2 = FindWindowEx(hwnd_level1, 0, "ComboBox", "" )
                    hwnd_level3 = FindWindowEx(hwnd_level2, 0, "Edit", "" )
                End If
            Loop While hwnd_button = 0
     
            hwnd_fils_hexa = Hex(hwnd_fils)
            hwnd_text_hexa = Hex(hwnd_text)
            hwnd_level3_hexa = Hex(hwnd_level3)
     
            For num = 1 To Len(fichier_baseline)
                PostMessage hwnd_level3, WM_CHAR, Asc(Mid(fichier_baseline, num, 1)), 0
            Next
            PostMessage hwnd_fils, WM_KEYDOWN, VK_RETURN, 0 'enter
            Do
                If Dir(fichier) = "" Then
                    PauseTimer (1)
                End If
            Loop While Dir(fichier) = ""
        Else
            MsgBox "Please ensure that you have Internet Explorer opened" & Chr(13) & _
                   "and that you are already connected to Intranet." & Chr(13) & _
                   "Note : having multiple IE windows could lead to problems"
        End If
     
        ie.Quit
        Set ie = Nothing
    End Sub
     
    'celle du dessous je l'ai trouvé sur le net... je ne sais plus où, en tout cas merci à celui qui l'a écrite
    Sub PauseTimer(ByVal nSecond As Single)
    Dim t0 As Single
         'temps de référence
         t0 = Timer
         'boucle d'attente
         Do While Timer - t0 < nSecond
               Dim dummy As Integer
               dummy = DoEvents()
               'si on dépasse minuit,il faut
               'retrancher un jour
               If Timer < t0 Then
                   t0 = t0 - 24 * 60 * 60
               End If
         Loop
    End Sub
    le principe :

    - trouver le handle de ta fenetre "Telechargement de fichier" grace à l'API FindWindow
    - trouver le handle du bouton "Enregistrer" grace à FindWindowEx
    --> SendMessage BM_Click sur le bouton


    ça marche!

    J'espére que ça pourra aidé quelqu'un


    Par contre j'ai un dernier probléme
    lorsque le telechargement ce lance, en même temps un page internet explorer blanche s'ouvre
    j'aimerai la fermer une fois que le telechargement est fini mais je n'y arrive pas

    voici mon idée de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    HWND = 0
    do
        HWND = FindWindow("IEFrame", "nom de la page")
    loop while HWND > 0
     
    MsgBox "page trouvé"
     
        SetActiveWindow HWND
        SendMessage HWND, WM_NCDESTROY, 0, 0
            End If
    J'ai rajouté la msgbox à la sortie de la boucle pour vérifier que la page est bien trouvée mais le sendmessage WM_NCDESTROY ne marche pas...

    j'ai éssayé d'envoyé d'autre message du même genre mais ça n'as pas fermer la page non plus...

    j'ai aussi d'essayer la methode proposée ici (Comment tuer un processus en connaissant le nom de sa fenêtre ?):
    http://vb.developpez.com/faq/?page=Systeme#tuer_process

    ça ne marche pas non plus...

    quelqu'un as t'il une idée pour fermer cette page ??

    Merci encore pour votre aide

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

Discussions similaires

  1. TabControl comment ne pas cliquer sur les onglets ?
    Par Oberown dans le forum Windows Forms
    Réponses: 6
    Dernier message: 26/01/2007, 01h22
  2. Internet Explorer - Clic sur bouton
    Par Kloun dans le forum Access
    Réponses: 6
    Dernier message: 03/08/2006, 17h24

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