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 :

Procédure bloquée sans message d'erreur


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Par défaut Procédure bloquée sans message d'erreur
    Bonjour,

    Dans le cadre d'une automatisation d'envois de mails via un outil propre à mon entreprise je dois développer une macro qui simule les clicks.

    Pour y parvenir ma macro manipule le code HTML des différentes pages. Mon problème survient lorsque j'essaye d'uploader le fichier pdf dans le mail.

    Code HTML du bouton : <input name="uploadAttachments" id="uploadAttachments" onchange="this.form.enctype='multipart/form-data'; this.form.encoding='multipart/form-data'; this.form.action='./UploadAttachments'; this.form.submit();" type="file"/>

    Ayant l'habitude de faire cela je n'ai jamais eu de problèmes auparavant, en général je simule le click sur l'id du bouton "inclure pièce jointe" et je manipule par la suite la fenêtre windows "Choisir un fichier à télécharger" avec la combobox32 etc..

    Or, cette fois ci mon lors du click la fenêtre s'affiche bien mais mon code VBA ne continue pas à sexécuter, il beug. VBA réagit comme si il ne détectait pas la fenêtre qui s'est déja affiché.

    Aucun message d'erreur VBA ne s'affiche, Impossible pour moi d'intéragir avec le code. La seule manière pour moi de le débloquer est d'annuler l'envoie de fichier en fermant la fenêtre "Choisir un fichier à télécharger".

    Si j'attend un certain temps un message apparait "Microsoft Excel attend la fin de l'exécution d'une action OLE d'une autre application."

    Je voudrais savoir s'il était possible de forcer la procédure à continuer à s'exécuter ? ou s'il y avait une solution de contournement ?

    Merci d'avance

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut
    bonjour
    a tu seulement prevu dans ton code le changement de focus puisque des le click sur le bouton c'est la fenêtre de choix de fichier qu'y la

    soit c'est une fenêtre Windows et la il va ta falloir utiliser les api pour trouver la fenêtre et ses enfant (textbox ou tu tape le nom ou il se met quand tu sectionne

    soit c'est un élément de la page au quel cas tu fait pareil que pour la recherche du bouton

    puisque tu parle de combox32 je suppose que tu manipule les api

    dans ce cas la je suppose aussi que la recherche du handle de la fenêtre se fait dans un (do/loop)
    si c'est pas le cas ca devait dérailler de temps en temps selon la sante de ta bécane ou de la disponibilité de l'UC
    avnt de taquiner la combo32(certainement enfant de la fenetre )
    je te sugere

    de faire un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    do
    doevents
    handle=findwindow(vbnullstring,"titre de la fentre ") ' par sa caption si il en a une 
    'OU
    'handle=findwindow("classe de la fentre", vbnullstring) ' par sa classname si la fenêtre n'a pas de caption 
    i=i+1
    loop until handle<> 0 or i=1000
    if i= 1000 and handle=0 then
    msgbox "l'application n'a pas trouvé la fenêtre "
    exit sub ' ou exit function
    l'incrémentation de la variable i te permet de sortir de cette boucle si la fenêtre est introuvable 1000 etant le nombre de tour limite de boucle
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Par défaut
    Merci pour ta réponse patricktoulon !

    Mon souci ne concerne pas la manipulation de la fenêtre de téléchargement, j'utilise déja les findwindow mais c'est à l'étape précédente que ca coince.

    Le click me fait bien apparaitre la bonne fenêtre mais VBA ne continue pas à s'exécuter au-delà de cette ligne, il reste bloqué à la ligne du click... donc impossible pour lui de continuer la manip jusqu'à l'upload

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    si tu es sûr que la gestion du focus sur les fenêtres est ok, je pense qu'il devient nécessaire de regarder ton code, car y'a pas mal de raisons à ton problème.

    je pencherai en l'état pour une fenêtre qui met du temps à se charger complètement .... et ton code envoie les clics trop vite
    mais tu as l'air d'avoir l'habitude de gérer ce type de code, donc des doevent et des sleep doivent faire partie de ton code ?

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Par défaut
    effectivment joe.levrai, j'ai pour habitude de manipuler les boites de dialogues de téléchargement et d'upload des pièces jointes mais c'est la remière fois que VBA refuse de passer à l'instruction suivante.

    Tu confirmes ce que je pensais, VBA réagit comme si il chargeait encore la fenêtre et donc ne passe pas à la suite.

    Ce n'est pas une affaire de vitesse d'exécution car même avec un "end sub" de suite aprés le click ne change rien, la procédure reste bloquée.

    J'ai pensé à une solution de contournement en incluant juste avant le click une instruction pour demander à VBA d'arreter la procédure Sub en cours avec un léger différé, le temps que la fenêtre s'affiche.
    ce serait un truc du genre application.Ontime....... (cela rejoint l'autre sujet que j'ai ouvert mais tu m'a répondu que d'aprés toi ca n'existait pas)

  6. #6
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    sur ton autre sujet, ta phrase prête à confusion :
    "stopper la procédure VBA qui est en cours en différé ?"
    j'ai compris que tu voulais programmer un arrêt complet de la macro après un intervalle de temps X


    en fait, tu voudrais pouvoir mettre en "sommeil" ta macro pendant quelques secondes ?

    tu as deux méthodes.

    1) API Sleep

    à mettre en haut d'un module standard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
    utilisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ' ton code
     
    ' la macro va s'arrêter 1 seconde
    Sleep 1000 
     
    ' la suite de ton code
    2) via l'instruction Wait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ' la macro va s'arrêter 10 secondes
    Application.Wait(Now + TimeValue("0:00:10"))

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    les sleep c'est bien seulement si on ne peut pas déterminer la fenêtre ou se trouve les combobox32

    d'où ma réaction tout a l'heure mettre la recherche des handles dans un (do loop)

    ainsi tant que la fenêtre n'est pas distingué on attends et des que la fenêtre est distinguée la macro suit son court sauf si i a atteint 1000
    au quel cas ca veut dire que le site rame et sort de la sub donc excel est débloqué

    les sleep peuvent sauver la mise mais pas tout le temps

    imagine pour une raison ou une autre ( et il y en a pleins)la page web après click ne se met pas a jour (et ca arrive plus souvent qu'on le croit)
    et bien après ton sleep ca plante quand même

    tandis qu'avec un do loop comme je l'ai démontré tout a l'heure la variable i te donne la réponse
    si handle=0 et i=1000(par exemple) au bout de 1000 tours la macro t'affiche le message et sort ainsi Excel est débloqué

    si handle=XXXXXX LA MACRO CONTINU SON BOULOT

    en gros la boucle (do loop) se charge du temps d'attente et pas un millième de plus et te sécurise contre les plantages avec "i"
    pouvant limiter i a ce qu'on veut
    c'est le b a ba pour un findwindow en attente d'une fenêtre surtout!!!! avec IE
    Maintenant tu fais comme tu veux
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #8
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Par défaut
    Bonjour et merci pour vos réponses,

    @joe.levrai: Mon but n'est pas de mettre la macro sur pause, je connais le sleep et le wait.

    @patricktoulon : mon problème ne concerne pas la détection de la fenêtre "Choisir un fichier à télécharger".

    voici le code que j'utilise :

    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
          'Click sur le bouton 
          IE2.document.all("uploadAttachments").Click
     
          'Upload du fichier
          hwnd = FindWindow(vbNullString, "Choisir un fichier à télécharger")
                If hwnd = 0 Then
                    MsgBox("La fenêtre est introuvable")
                Else
                    SetForegroundWindow hwnd
                    hwnd_level1 = FindWindowEx(hwnd, 0, "ComboBoxEx32", "")
                    Application.DisplayAlerts = False
                    Call SendMessageByString(hwnd_level1, WM_SETTEXT, 0&, "D:\Users\u136110\Desktop\" & "x.pdf")
                    Sleep 100
                    hwnd_button = FindWindowEx(hwnd, 0, "Button", "ou&vrir") '&Enregistrer
                    Sleep 100
                    SendMessage hwnd_button, BM_CLICK, ByVal CLng(0), ByVal CLng(0)
                    Application.DisplayAlerts = True
                End If
    Je reformule le problème que j'ai : Lorsque je clique sur le bouton d'upload la fenêtre "" s'affiche bien mais la suite du ne s'exécute pas, donc blocage à la ligne du clique. VBA tourne dans le vent...

    Dans le cas où je feme manuellement la fenêtre, le code continue à s'exécuter mais hwnd=0 donc j'ai la MSGBOX qui s'affiche en me disant que la fenêtre est introuvable (Logique vu que je l'ai fermé)

    dans le cas où je clique manuellement sur le bouton upload avec la souris et j'exécute la suite du programme VBA retrouve bien la fenêtre et tout se passe bien.L'upload est fait.

    Pour palier au problème de blocage sur la ligne du clique je pense que deux solutions peuvent convenir mais je ne sais pas comment les coder :
    1- Solution directe : Trouver l'origine du problème, et inclure une instruction du genre "On Error Resume Next" qui permet le passage à l'instruction suivante
    ou
    2- Solution indirecte : juste avant le clique sur le bouton inclure une instruction qui permettra l'arrêt totale de la procédure. Je pourrais dans ce cas démarrer un autre module qui retrouvera la fenêtre et exécutera la suite du parcours.


    Ai-je été claire ? Pensez vous que l'une des deux solution est faisable ?

    Merci !

  9. #9
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut
    re

    Bonjour après avoir vu ton code je réitère ce que je t'ai dis on est en plein dedans la raison

    chez toi
    click bouton
    handlefentre=findwindow balblabla
    chez moi
    click bouton
    do
    doevents
    handle =findwindows balblabla
    i=i+1
    loop until handle=0
    chez toi le résultat peut tomber soit sur 0 soit le plus proche parent soit sur le bon

    ce qui fait que tes findwindowEX sont faussés
    c'est exactement ce que je voulais te dire
    un coup ca marche et l'autre peut très bien planter c'est le désavantage d'être passé en 64 bits avant ca tombait toujours juste car dans les apis il y avait un delay maintenant non le( do loop) c'est pour ca

    regarde aussi les paramètres du sendmessage j'ai pas tout regarder mais bon

    re
    essaie ceci pour voir et regarde le compte rendu dans la fenêtre d'exécution
    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
    'Click sur le bouton
    IE2.document.all("uploadAttachments").Click
    'Upload du fichier
    Do
        DoEvents
        Hwnd = FindWindow(vbNullString, "Choisir un fichier à télécharger")
        i = i + 1
    Loop Until Hwnd <> 0 Or i = 2000
    If handle_trouvé(Hwnd, "fenetre") = True Then
        SetForegroundWindow Hwnd    ' cette api ne fonctionne pas tres bien je prefere showindow avec l'indice 9 (affiche et active la fenetre a sa position initiale)
        hwnd_level1 = FindWindowEx(Hwnd, 0, "ComboBoxEx32", "")
    End If
    If handle_trouvé(hwnd_level1, "combo") = True Then
        Application.DisplayAlerts = False
        Call SendMessageByString(hwnd_level1, WM_SETTEXT, 0&, "D:\Users\u136110\Desktop\" & "x.pdf")
        Sleep 100
        hwnd_button = FindWindowEx(Hwnd, 0, "Button", "ou&vrir")    '&Enregistrer
    End If
     
    If handle_trouvé(hwnd_button, "bouton") = True Then
        Sleep 100
        SendMessage hwnd_button, BM_CLICK, ByVal CLng(0), ByVal CLng(0)
        Application.DisplayAlerts = True
    End If
    Function handle_trouvé(handle, etapemacro) As Boolean
        handle_trouvé = False
        If handle = 0 Then
            Select Case etapemacro
            Case "fenetre"
                'faire ceci ou cela' ici on peut se permettre d'engager une procedure auxiliaire pour la fenetre
               Debug.Print " l etape pour la/le " & etapemacro & "c'est mal  passée : son handle n'est pas trouvé"
     
            Case "combo"
                ' faire cei: ou cela'ici idem
                Debug.Print "l etape pour la/le " & etapemacro & "c'est mal  passée: son handle n'est pas trouvé"
     
            Case "bouton"
                'faire ci: ou cela' ici idem
                Debug.Print "l etape pour la/le " & etapemacro & "c'est mal  passé : son handle n'est pas trouvé"
     
            End Select
        Else
        handle_trouvé = True
        Debug.Print "l etape pour la/le " & etapemacro & "c'est bien passée : son handle est: " & handle
        End If
    End Function
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  10. #10
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Par défaut
    Toujours le même résultat, voici ce que m'affiche la fenêtre d'exécution :

    l etape pour la/le fenetrec'est mal passée : son handle n'est pas trouvé
    l etape pour la/le comboc'est mal passée: son handle n'est pas trouvé
    l etape pour la/le boutonc'est mal passé : son handle n'est pas trouvé

    Le résultats ne sont obtenus que lorsque je clique moi même sur le bouton et non pas la macro.

    Comme je te l'ai dit précédemment mon souci vient de la ligne du clique donc peu importe ce que j'écris aprés cette ligne rien ne sera pris encompte car VBA BLOQUE sur cette ligne.

    Arrivé à cette ligne c'est le néant pour mon programme, c'est comme si l'ouverture de la fenêtre n'est pas détecté et ca peut rester indéfiniment comme ca.

  11. #11
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    est ce que la fenêtre de choix fichier s'ouvre au moins ??????

    sinon un truc qui m'était arriver aussi c'est d'utiliser le ". onchange" a la place du .click
    répond d'abords a la question on verra la suite
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  12. #12
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 242
    Par défaut
    Bonjour,

    As-tu essayé de décomposer ta ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IE2.document.all("uploadAttachments").Click
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set monBouton = IE2.document.all("uploadAttachments")
    monBouton.Click
    et vérifié avec un point d'arrêt que la variable était bien définie avant de cliquer ? Car si tu cliques alors que la page n'est pas bien chargée, le résultat peut être aléatoire.

    Personnellement, quand je pilote IE, j'ai tendance à être prudent et à d'abord instancier mes objets en les encapsulant dans des do loop comme Patrick, avant d'effectuer les clics.

    Tu peux aussi attendre que la page soit complètement chargée avant d'essayer de cliquer sur le bouton, ce que tu as plutôt intérêt à faire à mon avis.

  13. #13
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Par défaut
    Bonjour,

    @patricktoulon : Oui ma fenêtre s'ouvre parfaitement bien. Le onchange j'ai essayé ca actualise la page sans cliquer pour autant sur le bouton.

    @zenpbb : J'ai essayé ta méthode mais le résultat est le même. Fenêtre affichée et VBA bloqué..

    J'ai trouvé une méthode pour uploader le fichier directement sans pour autant cliquer sur le bouton mais c'est un peu trop compliqué pour moi, je n'arrive pas à l'adapter
    http://www.developpez.net/forums/d11...r-automatique/

  14. #14
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    bonjour

    a tu bien mis la recherche du handle dans un do loop?

    es tu bien sur du titre de la caption de la fenêtre ?

    le soucis doit venir de la
    et c'est normal si la fenêtre s'affiche mais que tout ce passe mal comme tu la essaye avec mon test

    ca veut dire que le handle n'est pas capté
    donc
    soit la variable i n'est pas assez incrémenté soit le titre n'est pas bon il y a que ces deux solutions ne cherche pas plus loin
    met des espions dans ton code
    a chaque étape "debug.print".......
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  15. #15
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2012
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 93
    Par défaut
    Même problème que celui de tarmok13

    J'ai une fonction qui simule un clic sur un bouton (sur une fenêtre principale d'un programme), pour ouvrir une 2eme fenetre, je récupère un texte, ensuite un autre SendMessage simule un clic sur un bouton Fermer, et je reviens a la fenêtre principale

    Mais, dès que j'arrive a la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SendMessage(HwndBtnListerHistorique, BM_CLICK, 0, ByVal 0&)
    cette 2eme fenêtre s'ouvre, mais tous se bloque, même Exit Function juste après ça, ne fonctionne pas !

    En plus dans mon cas, la fenêtre que je veut ouvrir, existe dans l'arborescence de Spy++ et son handle est bien récupéré,

    Et si je clique manuellement sur le bouton Fermer de cette fenêtre, le code reprend son exécution, et je récupère mon texte

    j'ai essayer plusieurs solutions en vain, Do, While, Until ... SetForegroundWindow, SetActiveWindow, Do While IsWindowVisible...

    Est-il possible que le problème viens de l'autre application que je veut piloter ?

    Merci d'avance

  16. #16
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2012
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 93
    Par défaut
    Finalement voila ce que j'ai trouver :

    https://stackoverflow.com/questions/...r-button-click

    SendMessage is a synchronous call: it waits for the message to be processed before returning. From your description, it sounds like the handler for BM_CLICK displays a modal dialog, which means that SendMessage won't return until the modal dialog is dismissed.
    Try PostMessage instead.
    Avec PostMessage ça marche très très bien

    Merci a vous tous !

  17. #17
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonsoir

    difficile de te répondrai j'ai ma boule de cristal en révision

    sans voir ton code et une explication claire on peut pas deviner

    sacré déterrage au passage elle date de 2015 cette discussion
    en ce qui concerne IE c'est un blob de puis la version 10 c'est donc plus cette fenêtre qui apparait mais un bandeau en bottom de fenêtre

    sujet qui a été traité mille fois ici si tu cherche bien tu trouvera des exemples
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  18. #18
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2012
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 93
    Par défaut
    Merci beaucoup pour ton interet, et j’espère que tu récupérera ta boule de cristal dans les plus bref délais

    Désolé je n'est pas penser de poster mon code, car je crois que c'est a peu près le même problème, ensuite en continuant de chercher j'ai trouver la source du problème, et il est bien expliqué ici :

    https://stackoverflow.com/questions/...ow-these-relat

    Donc en remplaçant SednMessage par PosteMessage le problème est réglé

    PS: je débute avec les API c'est pour ça que je déterre des sujet qui datent
    aussi je posterai mon code demain car là je viens de finir une journée pleine d'API !

  19. #19
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    il y en a pour qui c'est l'apthower d'autre c'est l'apijournée
    oui je suis curieux de voir ce code
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  20. #20
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2012
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 93
    Par défaut
    Voila mon 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
     
    '1-Déclarations :
    Dim HwndBtnListerHistorique As Long              'le Handle du bouton qui ouvre la fenêtre historique (il se trouve dans la fenêtre principale)
    Dim hwndFenetreListHistorique As Long           'le Handle de la fenêtre que je veux ouvrir (fenêtre historique)
    Dim HwndBtnFermerListHistorique As Long      'le Handle du bouton qui ferme la fenêtre historique (il se trouve sur cette fenêtre)
     
    HwndBtnListerHistorique = GetHwndObjects("BtnListerHistorique")
    hwndFenetreListHistorique = GetHwndObjects("FenetreListHistorique")
     
    'GetHwndObjects(strNomObjet as string) est une fonction qui me retourne les Handles de tous les objets de l'application que je veux piloter
     
    '2-Ouvrir la fenêtre historique
    Call DelaiExecution(0.1)    'une fonction qui retarde l'exécution du code
    Call SendMessage(HwndBtnListerHistorique, BM_CLICK, 0, ByVal 0&)
     
    '3- La fenêtre historique étant ouverte je récupère le numéro de l'assuré et je la ferme
    RecupNumAssure = GetObjectText("NumAssure")       'Une fonction qui utilise SendMessageByString
     
    '4- Fermer la fenêtre historique et revenir a la fenêtre principale
    HwndBtnFermerListHistorique = GetHwndObjects("BtnFermerListHistorique")
    Call SendMessage(HwndBtnFermerListHistorique , BM_CLICK, 0, ByVal 0&)
    Peu être que ce n'est pas très propre comme code, mais il fonctionne sauf que dès que j'arrive a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call SendMessage(HwndBtnListerHistorique, BM_CLICK, 0, ByVal 0&)
    tous se bloque, et il faut que je clic sur le bouton Fermer de la fenêtre historique manuellement pour que ça débloque, et je récupère mon numéro d'assuré

    Avec des recherches ici et partout, j'ai constater que le problème viens de la fonction SendMessage, et ce que j'ai compris que c'est une fonction synchrone, cad elle attends que son travail soit terminé avant de continuer l'exécution du code, donc si on ouvre une fenêtre genre Dailog box, qui attends l'interaction de l'utilisateur, tout reste figé en attendant la réponse, au contraire de la fonction PosteMessage qui est une fonction asynchrone, qui fait sont travail, et n'attend rien en retour, le code continue a s'exécuter normalement

    donc il suffisait de mettre une ligne de code juste après pour créer un petit retard avant de continuer l'exécution du code

    et voila qui va me régler beaucoup de problèmes, et m'ouvrir encore beaucoup plus de possibilités

    J’espère que j’étais assez clair
    Cordialement

Discussions similaires

  1. [Struts-Layout] errorStyleClass sans message d'erreur
    Par Spiff__ dans le forum Struts 1
    Réponses: 0
    Dernier message: 05/12/2008, 15h16
  2. annuler l'affichage d'un etat sans message d'erreur
    Par mnssylvain dans le forum IHM
    Réponses: 4
    Dernier message: 25/11/2007, 21h55
  3. Réponses: 2
    Dernier message: 23/08/2007, 20h08
  4. [VBA-E]Détection de feuilles inexistantes sans message d'erreur
    Par Jipété dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/11/2006, 08h39
  5. "try...except" sans message d'erreur
    Par SchpatziBreizh dans le forum Langage
    Réponses: 4
    Dernier message: 12/07/2005, 09h50

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