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 :

Macro VBA (pilotant IE) ne récupère pas le contrôle après l'ouverture d'une ComboBox pour charger un fichier


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 54
    Points : 30
    Points
    30
    Par défaut Macro VBA (pilotant IE) ne récupère pas le contrôle après l'ouverture d'une ComboBox pour charger un fichier
    Bonsoir,

    Sur un site internet professionnel, je dois uploader des fichiers en masse. Donc j'ai décidé d’interagir avec le site internet en VBA (grâce au super tuto de @Qwazerty). Tout se passait bien pour ouvrir les différentes pages et menus mais lorsque la fenêtre pour charger le fichier s'ouvre, je n'ai plus du tout la main (la macro VBA est en attente) et je ne récupère le contrôle qu'à la fermeture de cette fenêtre. Donc je ne peux pas sélectionner en auto le fichier désiré.

    Ne pouvant pas mettre mon code d'origine ici, j'ai créé l'exemple ci-dessous avec un page internet public qui reprend parfaitement à mon problème:

    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
    Sub essai()
     
        Dim IE As New InternetExplorer
        Dim IEDoc As HTMLDocument
     
     
        ' Ouverture de la page internet
        IE.navigate "https://fr.imgbb.com/"
        IE.Visible = True
        Do While IE.readyState <> 4 Or IE.Busy: Loop    
     
        'On pointe la page
         Set IEDoc = IE.document
     
         'On clique sur Commencer l'envoi
         Set HtmlElementStandard = IEDoc.getElementsByClassName("btn btn-big blue").Item
         HtmlElementStandard.Click
     
         'Message pour avertir que la macro continue
         a = MsgBox("Youpi, j'ai la main")     
     
    End Sub
    J'ai trouvé des pistes mais çà ne marche pas. Mais ca me parait logique car mon code VBA étant bloqué après le clic sur le bouton et l'ouverture de la nouvelle fenêtre. Donc il ne continue pas dans les ligne de commande en dessous HtmlElementStandard.Click

    https://www.developpez.net/forums/d1.../#post10886809


    D'avance merci pour vos propositions
    Cordialement

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 54
    Points : 30
    Points
    30
    Par défaut
    En attendant de l'aide pour comprendre pourquoi la macro se bloque lorsque j'ouvre cette fenêtre avec le "Click" de l'objet HTML, j'ai essayé d'avancer dans le pilotage de cette fenêtre.

    Pour ce faire, j'ai mis en commentaire ce "Click" et un point d'arrêt sur la ligne suivante afin d'ouvrir manuellement la fenêtre et continuer en pas à pas la macro.

    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
    'HtmlElementStandard.Click           
     
        'Méthode pour piloter la fenêtre
        hwnd = FindWindow(vbNullString, "Choisir un fichier à charger")
        'SetForegroundWindow hwnd
        SetActiveWindow hwnd
        hwnd_level1 = FindWindowEx(hwnd, 0, "ComboBoxEx32", "")
        Application.DisplayAlerts = False
        Call SendMessageByString(hwnd_level1, WM_SETTEXT, 0, "D:\Search.png") ' Insère le chemin complet du fichier à uploader
        Sleep 100
        hwnd_button = FindWindowEx(hwnd, 0, "Button", "ou&vrir")
        Sleep 100
        SetForegroundWindow hwnd
        'SendMessage hwnd_button, BM_CLICK, ByVal CLng(0), ByVal CLng(0)
        PostMessage hwnd_button, BM_CLICK, ByVal CLng(0), ByVal CLng(0) 'clique sur le bouton Ouvrir
        Application.DisplayAlerts = True
    Je récupère bien le numéro de Handle de la fenêtre et celui du bouton Ouvrir mais par contre, je n'arrive pas à indiquer le nom du fichier et à cliquer sur le bouton Ouvrir malgré les différentes méthodes essayées !!

    Si vous avez une idée aussi pour ce problème !

    Merci beaucoup

  3. #3
    Membre chevronné Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Points : 1 971
    Points
    1 971
    Par défaut Bjr
    J ai déjà eu ce souci et trouvé "la" solution sur youtube
    Il fallait lancer un script vbs qui tourne or de la macro excel, pour capter et fermer la fenêtre (popup) via Api.

    Je n ai pas trouvé d autres solution à l époque.

    Le lien https://m.youtube.com/watch?v=G-2khNFYQl8
    Michaël

    Si mon aide/avis vous a été profitable , n'hésitez pas à cliquer sur , ça fait toujours plaisir...
    _________________________________________________________________________________________________________________

    "Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu'il est stupide..."
    Albert Einstein

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 54
    Points : 30
    Points
    30
    Par défaut
    Bonsoir,

    Merci pour ton retour. C'est sympa.

    Effectivement, ce matin, j'ai pensé à cette solution externe et donc au VBS.

    Je te confirme que çà fonctionne super bien pour ouvrir la fenêtre et ensuite dans le VBA, je récupère le handle de la fenêtre.
    Et pour mon 2ème pb (insertion des données dans la fenêtre), j'ai opté pour un CTRL+V pour coller le chemin (comme le curseur est par défaut dans le champ nom du fichier) et la touche ENTER pour valider la fenêtre (comme le bouton Ouvrir est sélectionné par défaut).
    C'est pas super propre mais çà le mérite de fonctionner !!

    Voici le code VBA:
    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
    'Pour récupérer le nom du contrôle
    Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
    'Pour récupérer le Handle de la fenêtre
    Public Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    'Pour faire une pause
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
     
    Sub essai()
     
        Dim IE As New InternetExplorer
        Dim IEDoc As HTMLDocument
     
        ' Ouverture de la page internet
        IE.navigate "https://fr.imgbb.com/"
        IE.Visible = True
        Do While IE.readyState <> 4 Or IE.Busy: Loop
     
        'On pointe la page
         Set IEDoc = IE.document
     
         'Copie le chemin de l'image dans le presse-papier
         Range("A1").Copy
     
         'On ouvre la fenêtre "commencer l'envoi" à l'aide d'un fichier vbs
         Set oWsh = CreateObject("Shell.Application")
         oWsh.ShellExecute "D:\Clic_commencer_envoi.vbs"
         Set oWsh = Nothing
         Sleep 1500
     
     
        'Méthode pour piloter la fenêtre "Choisir un fichier à charger"
         hwnd = FindWindow(vbNullString, "Choisir un fichier à charger")
         SetForegroundWindow hwnd 'fenêtre au premier plan
         SendKeys "^v", True ' coller la valeur
         SendKeys "{ENTER}", True ' clic sur Enter pour Ouvrir
         Sleep 1500
     
    End Sub
    Et le code du fichier "Clic_commencer_envoi.vbs":
    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
    Dim objApp
    Dim objIE
    Dim objWindow
     
    'Set the primary objects.
     
    Set objApp = CreateObject("Shell.Application")
    Set objIE = Nothing
     
    'Identify the IE window and connect.
     
    For Each objWindow In objApp.Windows
      If (InStr(objWindow.Name, "Internet Explorer")) Then
        Set objIE = objWindow
        Exit For
      End If
    Next
     
    With objIE
     
      .Visible = True    'Make sure to set the window of IE to visible.
     
      Do While .Busy Or .readyState <> 4
        'Do nothing, wait for the browser to load.
      Loop
     
      Do While .Document.ReadyState <> "complete"
        'Do nothing, wait for the VBScript to load the document of the website.
      Loop
     
      'Ouvre la fenêtre qui bloquait dans VBA
     
       .Document.getElementsByclassname("btn btn-big blue").item(0).click
     
    End With 
     
    'Clear the objects.
     
    On Error Resume Next 
     
    objApp = Nothing 
    objIE = Nothing 
    objWindow = Nothing
    Encore merci pour l'aide !!!

  5. #5
    Membre chevronné Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Points : 1 971
    Points
    1 971
    Par défaut Bjr
    Bonjour,

    Content de ton retour.

    En effet tu as la méthode sendkey, simulation de frappe au clavier.

    Ou la méthode, sendmessage où tu peux viser la bonne textbox de l appli externe directement et envoyer ta frappe, cette méthode est un peu moin aléatoire que les sendkey, ou cas où le focus ne serait pas dans le bon textbox.

    Bat
    Michaël

    Si mon aide/avis vous a été profitable , n'hésitez pas à cliquer sur , ça fait toujours plaisir...
    _________________________________________________________________________________________________________________

    "Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu'il est stupide..."
    Albert Einstein

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 54
    Points : 30
    Points
    30
    Par défaut
    Merci Bat.

    Malheureusement, comme indiqué dans mon 2ème, j'arrive à prendre le contrôle sur la fenêtre et la mettre au premier plan:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    hwnd = FindWindow(vbNullString, "Choisir un fichier à charger")
        'SetForegroundWindow hwnd
        SetActiveWindow hwnd
    Je trouve bien une valeur pour "ComboBoxEx32" donc je pense être dans le bon champ:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     hwnd_level1 = FindWindowEx(hwnd, 0, "ComboBoxEx32", "")
        Application.DisplayAlerts = False
    Mais quand j'essaye d'insérer le texte rien ne se passe (pas d'erreur non plus):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Call SendMessageByString(hwnd_level1, WM_SETTEXT, 0&, "D:\Search.png") ' Insère le chemin complet du fichier à uploader
    Sleep 100
    Idem pour le bouton Ouvrir (détecté car hwnd_button a une valeur) mais non exécuté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    hwnd_button = FindWindowEx(hwnd, 0, "Button", "ou&vrir")
    SendMessage hwnd_button, BM_CLICK, ByVal CLng(0), ByVal CLng(0)

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 54
    Points : 30
    Points
    30
    Par défaut
    Eurêka, j'ai trouvé !!!!

    Il fallait déclarer les constantes WM_SETTEXT et BM_CLICK:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Private Const BM_CLICK = &HF5
    Private Const WM_SETTEXT As Long = &HC
    Car à chaque fois que je lisais des exemples, c'était des bout de codes sans la déclaration des différents éléments.

    Voici le code complet du projet VBA:
    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
    'Pour mettre une fenêtre au premier plan
    Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
     
    'Pour récupérer le Handle de la fenêtre et intéragir avec elle
    Public Declare Function FindWindow Lib "user32.dll" 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 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
    Private Declare Function SendMessageByString Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
    Private Const BM_CLICK = &HF5
    Private Const WM_SETTEXT As Long = &HC
     
    'Pour faire une pause
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
     
     
    Sub essai()
     
        Dim IE As New InternetExplorer
        Dim IEDoc As HTMLDocument
        Dim DataObj As New MSForms.DataObject
     
        ' Ouverture de la page internet
        IE.navigate "https://fr.imgbb.com/"
        IE.Visible = True
        Do While IE.readyState <> 4 Or IE.Busy: Loop
     
        'On pointe la page
         Set IEDoc = IE.document
     
         'On ouvre la fenêtre "commencer l'envoi" à l'aide d'un ficheir vbs
         Set oWsh = CreateObject("Shell.Application")
         oWsh.ShellExecute "D:\Clic_commencer_envoi.vbs"
         Set oWsh = Nothing
         Sleep 1500
     
     
        'Méthode pour piloter la fenêtre "Choisir un fichier à charger"
     
         hwnd = FindWindow(vbNullString, "Choisir un fichier à charger")
         SetForegroundWindow hwnd 'fenêtre au premier plan
         hwnd_level1 = FindWindowEx(hwnd, 0, "ComboBoxEx32", "") 'trouve le champ pour insérer le nom du fichier
         Application.DisplayAlerts = False
         Call SendMessageByString(hwnd_level1, WM_SETTEXT, 0&, "D:\Search.png") 'envoi le nom du fichier
         Sleep 100
         hwnd_button = FindWindowEx(hwnd, 0, "Button", "ou&vrir") 'trouve le bouton Ouvrir
         SendMessage hwnd_button, BM_CLICK, ByVal CLng(0), ByVal CLng(0) 'clic sur le bouton Ouvrir
         Sleep 1500
         Application.DisplayAlerts = True
     
    End Sub
    PS: le code du fichier VBS n'a pas changé !!!

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/03/2018, 12h01
  2. [XL-2010] Macro VBA interactive IE ne fonctionne pas sans point d'arrêt
    Par dad76600 dans le forum Macros et VBA Excel
    Réponses: 23
    Dernier message: 02/04/2016, 12h26
  3. [PPT-2003] Macro VBA chercher texte qui marche pas
    Par cactus666 dans le forum VBA PowerPoint
    Réponses: 1
    Dernier message: 20/05/2009, 16h52
  4. Réponses: 2
    Dernier message: 29/07/2007, 11h48
  5. VBA-E ENCORE PB Macro VBA qui marche pas
    Par sam25 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/01/2007, 05h31

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