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 :

Piloter la fenetre windows en vba


Sujet :

Macros et VBA Excel

  1. #241
    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 ra
    bonjour marc
    autrement dis un succession de touche enter jusqu'au résultat c'est ce que j'avais proposé plus haut dans la discurion mais disons plus brutalement sans ta sophistication

    je te suggère de regarder avec les apis le Handle de la fenêtre afficher les téléchargement attention!!!! pas le bandeau

    il se trouve qu'avec Ie11 cette fenêtre (invisible au début et vide ) apparait des l'ouverture de IE en ce qui concerne cette page

    mais au grande surprise son handle a changé si la touche enter a été ciblée en gros si l'opération a marché ca n'est plus la même valeur long

    je te suggère aussi de regarder son getwindowlong qui nous donne le long de son état il change aussi

    j'ai opté pour cette solution et elle fonctionne très bien ca permet aussi de virer tout les sleep

    je te laisse faire l'analyse de tout ca

    par contre ton idée de la gestion d'erreur sur le lancement de IE avec résiduel et au top j'en ai fait une fonction que j'avais proposé plus haut


    au passage je constate depuis quelque temps que tu met des énoncés de fonction en constantes ca m'intéresse ce procédé


    par contre ce qui me ge,e dans ton system c'est que tu compte sur le désactivâtes pour arrêter la récursivité de keyloop j'aurais préféré un api end ou un ungry end gérer dans la fonction même en réinjectant par exemple un time limite cet argument en optionnel serait utiliser qu'a partir de la première instance de keyloop
    A+
    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

  2. #242
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Disons comme je pense plutôt à un code simple fonctionnant aussi avec IE9 & 10.
    Sous IE9 il n'y a apparemment pas la fenêtre Afficher les téléchargements avant …
    Par contre il y a peut-être moyen avec la sous-fenêtre du bandeau, celle gérant les messages !

    Une succession de touche Enter, pas vraiment car si la pause initiale est suffisante
    la procédure de secours ne se déclenchera jamais sinon ce sera au maximum deux appels en temps normal …

    Comme il y a un échange avec Excel pour le téléchargement et depuis la version 11 IE refusant de se fermer sans ce retour
    j'attends le téléchargement effectif dans Excel pour fermer IE …
    S'il y a un problème comme par exemple la touche de tabulation non interprétée,
    IE restant actif l'utilisateur peut continuer le téléchargement ou fermer IE,
    dans les deux cas la procédure Keyloop - non récursive - est annulée …

    Citation Envoyé par parmi Voir le message
    Depuis la mise à jour de Firefox 47.0, Selenium ne semble plus fonctionner aussi bien qu'avant.
    La version 47.0.1 corrige justement un problème avec selenium mais pour David cela n'a rien changé …





    J'ai augmenté la constante DS pour la procédure de secours car il faut laisser assez de temps au téléchargement du fichier …

  3. #243
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Citation Envoyé par Marc-L Voir le message
    La version 47.0.1 corrige justement un problème avec selenium mais pour David cela n'a rien changé …
    J'ai pourtant un bout de code tout simple pour se loguer sur un site commercial qui fonctionnait bien sous 46.0 mais ne fonctionne plus sous 47.0 (?)

  4. #244
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut




    Il y aurait un bug dans la 47.0 donc as-tu installé la 47.0.1 ?!

  5. #245
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Oui, elle se fait automatiquement.
    Ça retourne un TimeoutError au départ (erreur d'exécution 21)
    "Firefox failed to open the listening port 127.0.0.1:49904 within 15 sec."

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Dim App As New Selenium.FirefoxDriver
     
        App.Get strURL  '<<< ça plante ici, mais pas avec Chrome avec le même code

  6. #246
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut




    Je ne l'installe pas en automatique, j'attends s'il y a des retours dans la semaine qui suit la sortie,
    je télécharge l'exécutable d'installation et conserve toujours le précédent au cas où …

  7. #247
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Très bonne manière de faire...
    Mais je ne veux pas m'immiscer dans le débat présent... Je ne faisais qu'une parenthèse
    Merci

  8. #248
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 326
    Par défaut
    hello,
    juste une parenthèse parmi tu devrais ouvrir une nouvelle discussion concernant ton problème avec selenium. Cela permettrait d'avoir une discussion ne concernant que selenium.
    Ami calmant, J.P

  9. #249
    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
    Citation Envoyé par jurassic pork Voir le message
    hello,
    juste une parenthèse parmi tu devrais ouvrir une nouvelle discussion concernant ton problème avec selenium. Cela permettrait d'avoir une discussion ne concernant que selenium.
    Ami calmant, J.P
    le dinauzaure
    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. #250
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut



    Suite à un retour puis à des tests par téléphone et en local où pendant un temps j'ai pu reproduire le cas,
    j'ai inséré en ligne n°44 de Demo5 du post #239 une p'tite pause car parfois
    IE mettant un peu plus de temps à s'afficher la tabulation du SendKeys part déjà dans le vide …

    Patrick, si tu as déjà posté un code sans Sleep,
    merci de m'indiquer son lien ou son n° de post si c'est dans cette discussion.

  11. #251
    Membre émérite
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Par défaut
    Marc,

    retour de test du code du post #239 : lors des 6 premiers essais le téléchargement était lancé une fois sur 2, puis ensuite plusieurs essais de suite réussis (une dizaine environ).

    Suite à ces essais j'ai mis un point d'arrêt dans la fonction KeyLoop pour voir comment cela se passait quand elle était activée.

    Le problème c'est que quand ça fonctionne la sub n'est pas activée donc je ne peux te donner que mes impressions a priori mais sans avoir pu tester vraiment son efficacité
    (bien entendu je testerai à nouveau avec ce point d'arrêt pour voir comment la sub gère le cas où le sendkeys n'a pas abouti au téléchargement la première fois).

    Concernant KeyLoop : tu utilises BringWindowToTop : pourquoi pas même s'il y a peut-être une API plus adaptée (mais à vérifier, cela dépend des sources que je lis)...passons pour le moment.
    La question que je me pose c'est pourquoi tu utilises le handle d'IE dans cette fonction ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BringWindowToTop IE.hWnd
    Ne serait-il pas plus adapté d'utiliser le Handle du bandeau que te ramène FindWindowExA quitte à le passer en paramètre dans KeyLoop ?
    Parce que là c'est la fenêtre de l'application qui est activée, non le bandeau, alors que tu disposes de son Handle.

    Ce n'est qu'une idée car comme je te l'ai dit je n'ai pas pu tester puisque à chaque fois que le téléchargement a réussi KeyLoop n'a jamais été activé, donc en fait je ne peux pas vérifier en l'état si KeyLoop est utile.

    Je referai des tests et te tiendrai au courant.

    Concernant la déclaration des API en 64 bits : pas de problème.

    A+

  12. #252
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Merci de ton retour !

    Passe la pause de la ligne n°42 à 100, la procédure de secours se déclenchera forcément …
    … mais encore faut-il que la tabulation soit interprétée, c'est à dire le focus sur le bouton Ouvrir
    (dans la négative, augmenter cette pause) …

    Le bandeau étant intégré à IE, j'active IE juste pour vérifier qu'entre-temps il n'a pas été fermé
    car si c'est le cas, cela déclenche une erreur interceptée donc dans cette procédure de secours …
    C'est un garde-fou car sans cette détection, si IE est déjà fermé, cette procédure bouclerait sans fin !
    C'est juste pour pallier à cette éventualité, par exemple si l'utilisateur ferme IE avant le déclenchement de KeyLoop
    Mais tu as raison, si l'utilisateur tordu ferme le bandeau mais pas IE !
    J'ai choisi IE et non le bandeau car même après sa fermeture le handle du bandeau existe toujours …

    De mon côté sur quatre ordinateurs sur deux sites différents, cela se passe plutôt très bien
    mais aucun n'est sous Windows 10 et dans ce cas peut-être vaudrait-il mieux remplacer
    le SendKeys par keybd_event comme dans ton code, à suivre …

  13. #253
    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 Marc

    de toute les façons après la touche TAB chez moi VBA n'a plus la main alors la keyloop walouh!!!!!
    je pense qu'il faut passer par un vbs externe pour la touche entrer au moins

    W7 64 /IE11

    ps: j'ai eu une mise a jour qui fait que je n'ai plus de soucis avec le résiduel je vais vérifier le pourquoi du comment

    faut croire que l'envoie des rapport d'erreur a porter ces fruit pour une fois
    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

  14. #254
    Membre émérite
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Par défaut
    Bon, j'ai testé à nouveau ce matin et aucun loupé concernant le téléchargement.

    Par contre il y a des fois où IE ne se ferme pas alors même que le téléchargement a eu lieu et que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.Print "Demo5 : " & Format$(Timer - T, "0.000s")
    dans le Workbook_Deactivate ramène quelque chose (signe que cette sub Workbook_Deactivate est activée).

    A ce moment-là je suis obligé de fermer IE via le gestionnaire des tâches.

    Mais tu as raison, si l'utilisateur tordu ferme le bandeau mais pas IE !
    J'ai choisi IE et non le bandeau car même après sa fermeture le handle du bandeau existe toujours …
    Oui vu que tu ne testes pas l'affichage du bandeau dans KeyLoop tu es bloqué...le plus sûr me paraît de le re tester dans le KeyLoop...à considérer que VBA ait encore la main (cf.la question de Patrick), auquel cas peut-être effectivement plutôt générer dans KeyLoop un vbs externe qui agirait sur la touche entrée.

    En tout cas c'est tout de même plus sûr de tester l'affichage du bandeau comme tu le fais : la procédure fonctionne et qui plus est plus rapidement qu'avant.

    Reste donc à gérer :
    1) le cas où le KeyLoop doit entrer en action :
    - si VBA a encore la main re tester l'affichage du bandeau plutôt que IE (ou les deux d'ailleurs) pour donner le focus au bandeau
    - si VBA n'a plus la main passer par un vbs externe pour la touche entrée
    2) le cas où IE ne se ferme pas alors que le téléchargement a eu lieu.

    A+

  15. #255
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Salut !

    Sous Windows 8.1 & IE11, pendant la mise à jour de l'antivirus la fenêtre principale d'IE n'est pas apparue
    ni son bandeau mais juste la fenêtre d'IE des téléchargements ! …


    Citation Envoyé par patricktoulon Voir le message
    de toute les façons après la touche TAB chez moi VBA n'a plus la main alors la keyloop walouh!!!!!
    je pense qu'il faut passer par un vbs externe pour la touche entrer au moins

    W7 64 /IE11

    ps: j'ai eu une mise a jour qui fait que je n'ai plus de soucis avec le résiduel je vais vérifier le pourquoi du comment
    VBA n'a plus la main ? Ou plutôt le focus sur le bandeau est perdu ? …

    Si la touche de tabulation est bien interprétée mais pas la touche Entrée
    alors il faut augmenter la pause avant l'instruction Visible (ligne n°40 du code ci-dessous) …

    En fermant IE11 après l'ouverture du fichier dans Excel, aucun souci de résiduel d'IE11, se fermant après quelques secondes …


    Citation Envoyé par davido84 Voir le message
    Par contre il y a des fois où IE ne se ferme pas alors même que le téléchargement a eu lieu
    Je n'ai pas rencontré ce cas sous Windows 8.1 & IE11, il faut juste patienter quelques secondes avant de relancer un test …


    Par contre concernant KeyLoop, je viens enfin de réussir à reproduire le cas et sous deux configurations différentes (IE9 & 11),
    BringWindowToTop ne fonctionne pas à tous les coups, c'est selon la fenêtre activée au premier plan …
    En le remplaçant par AppActivate (je me doutais bien que j'allais le retrouver celui-là !),
    IE repasse bien au premier plan et cela fonctionne si le focus sur le bouton Ouvrir du bandeau n'a pas été perdu
    sinon l'utilisateur n'a qu'à cliquer lui-mê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
    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
    #If Win64 Then
        Private Declare PtrSafe Function FindWindowExA& Lib "user32" (ByVal hParent&, ByVal hChild&, ByVal ClassName$, ByVal WindowName$)
        Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal MilliSeconds&)
    #Else
        Private Declare Function FindWindowExA& Lib "user32" (ByVal hParent&, ByVal hChild&, ByVal ClassName$, ByVal WindowName$)
        Private Declare Sub Sleep Lib "kernel32" (ByVal MilliSeconds&)
    #End If
     
    Const PROC = "ThisWorkbook.KeyLoop", DS = 0.00002
    Dim IE As Object, D As Date, T!
     
    Sub Demo5a()
           Const ELT = "ctl00_BodyABC_Button1", SC = 10
             Dim Wb As Workbook
             T = Timer
        For Each Wb In Workbooks
              If Wb.Name Like "Cotations*.csv" Then Wb.Close False
        Next
         Set IE = CreateObject("InternetExplorer.Application")
        With IE
                  .Navigate "http://www.abcbourse.com/download/historiques.aspx"
            While .ReadyState < 3
                If Timer - T > SC Then GoTo Fin
            Wend
            While Not IsObject(.Document.all(ELT))
                If Timer - T > SC Then GoTo Fin
            Wend
                On Error GoTo Fin
            With .Document.all
                 .ctl00_BodyABC_strDateDeb.Value = "26/05/2015"
                 .ctl00_BodyABC_strDateFin.Value = "26/05/2016"
                 .ctl00_BodyABC_oneSico.Click
                 .ctl00_BodyABC_txtOneSico.Value = "FR0000120222"
                 .ctl00_BodyABC_dlFormat.Value = "x"
                 .Item(ELT).Click
            End With
            While FindWindowExA(.HWND, 0&, "Frame Notification Bar", vbNullString) = 0
                If Timer - T > SC Then GoTo Fin
            Wend
                Sleep 800
                .Visible = True
                Sleep 100
                CreateObject("WScript.Shell").SendKeys "{TAB}~"
                D = Now + DS:  Application.OnTime D, PROC
    Fin:
            If Not .Visible Then T = 0: Beep: .Quit: Set IE = Nothing
        End With
    End Sub
     
    Private Sub KeyLoop()
      Debug.Print "Loop"
            On Error Resume Next
            AppActivate "Téléchargement des cotations pour"
        If Err.Number Then
            T = 0:  Beep:  IE.Quit
                       Set IE = Nothing
        Else
            CreateObject("WScript.Shell").SendKeys "~"
            D = Now + DS:  Application.OnTime D, PROC
        End If
    End Sub
     
    Private Sub Workbook_Deactivate()
        If ActiveWorkbook.Name Like "Cotations*.csv" And T Then
            Debug.Print "Demo5a : " & Format$(Timer - T, "0.000s")
            Application.OnTime D, PROC, , False
            T = 0:  IE.Quit:  Set IE = Nothing
            ActiveWorkbook.Saved = True
        End If
    End Sub
    Actuellement de mon côté avec IE9 comme IE11, si la pause de la ligne n°40 est insuffisante (200 par exemple),
    la tabulation est bien interprétée donnant le focus au bouton Ouvrir du bandeau et
    si l'utilisateur laisse faire, KeyLoop se déclenche une seule fois ouvrant donc le ficher dans Excel puis IE se ferme …
    Temps d'exécution inférieur à cinq secondes.

    Si la pause est suffisante, la tabulation comme l'Entrée sont bien interprétées, temps inférieur à trois secondes …

    Dans une prochaine version, ne restera plus qu'à jouer sur le focus entre IE et le bandeau
    comme je l'ai déjà réalisé dans une contribution ou dans une discussion sur ce forum ou ailleurs
    concernant une page Web plus "facile" …

  16. #256
    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 marc
    je te propose de faire sans mettre des pauses a tout bout de champs

    ca a été un jeu du chat et la souris

    en fait c'est un jeu de focus (perdu /retrouvé) et si tes pauses sont synchros c'est bon sinon walouh !!! c'est pour cela qu'il y a des ratés

    donc je te propose de forcer le schmilblick

    en fait j'ai repris ton demo2 pour l'exploration et j'y ai ajouté mon system d'extraction de la fenêtre (bandeau )

    mais j'y est mis la possibilité de reprendre 3 fois depuis le début pour chaque test do/loop (ready et object)

    et comme même le bandeau extrait et devenu enfant de la fenêtre Excel (tu verra dans le code )mais je n'est pas pu le dé Hooké (bien trop complexe ) il est donc inaccessible par les api pour le rendre actif a 100%
    alors j'active la fenêtre précédente (qui est IE)
    alors tout se joue en fait avec le setactivewindow comme IE est en invisible c'est la fenêtre suivante qui prend le focus et bingo

    143 essais /143 réussites d'affilé

    reste la gestion du moment de la fermeture IE j'ai lâchement (fatigue) mis un wait (honte a moi je sais) c'était presque un sans sleep hein!!!



    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
    Dim T!
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    ' plus de sleep 'Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds 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 ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
    Private Declare Function SWL Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
    Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
    Declare Function SetActiveWindow Lib "user32.dll" (ByVal hwnd As Long) As Long
    Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long
    Sub Demo2Marc_facon_Patosh()
        Const ELT = "ctl00_BodyABC_Button1"
        Dim Wb As Workbook, ro As Long, rr As Long, HieFrame As Long, i As Long, hwndIEedge As Long, res As Long
        T = Timer
        For Each Wb In Workbooks
            If Wb.Name Like "Cotations*.csv" Then Wb.Close False
        Next
    recomence:
        With CreateObject("InternetExplorer.Application")
            .Navigate "http://www.abcbourse.com/download/historiques.aspx"
            .Visible = False
            While .ReadyState < 3
                If Timer - T > 9 Then
                    .Quit: rr = rr + 1
                    If rr < 4 Then GoTo recomence Else Exit Sub    ' on a 3 tentative pour le ready IE est fermé a chaque fois
                End If
            Wend
            While Not IsObject(.Document.all(ELT))
                If Timer - T > 9 Then
                    .Quit: ro = ro + 1
                    If ro < 4 Then GoTo recomence Else Exit Sub    ' on a 3 tentatives pour l'object IE est fermé a chaque fois
                End If
            Wend
            With .Document.all
                .ctl00_BodyABC_strDateDeb.Value = "26/12/2015"
                .ctl00_BodyABC_strDateFin.Value = "26/05/2016"
                .ctl00_BodyABC_oneSico.Click
                .ctl00_BodyABC_txtOneSico.Value = "FR0000120222"
                .ctl00_BodyABC_dlFormat.Value = "x"
                .Item(ELT).Click
            End With
     
            HieFrame = FindWindow("IEFrame", vbNullString)
            Do
                DoEvents
                i = i + 1
                hwndIEedge = FindWindowEx(HieFrame, 0&, "Frame Notification Bar", vbNullString)     'recherche du handle de la fenetre de telechargement IE edge
                res = hwndIEedge
            Loop While res = 0 Or i = 10000
            If res <> 0 Then
     
                res = SetParent(hwndIEedge, Application.hwnd)    'LE BANDEAU DEVIENT une fenetre et  UN ENFANT DE L'APPLICATION
                SetWindowPos hwndIEedge, 0, (Application.Width - 700) / 2, 100, 700, 200, 0    'placement et dimentionnement de la fenetre de telechargement
                'SWL hwndIEedge, -16, &H94CF0080    'facultatif !!!! ajout de la caption et des boutons
                'SetWindowText hwndIEedge, "telechargement abc"    'facultatif !!!! ajout du titre a la caption
                ' aussi incroyable que cela puisse paraitre malgré que le bandeau n'est plus un enfant de la fenetre IE on est obligé de réactivé le fenetre IE
                ' MAIS NON MAIS NON !!!! en fait comme IE est nonvisible c'est la fenetre suivante dans la hierarchie qui prend le focus et je vous le donne dans le mille c'est la quelle ??????
                ' pourquoi me dires vous ne pas activer le hwndIEedge et bien parce que j'ai tout essayé et le hook appliqué sur cette fenetre par l'application IE et un sac de noeuds
                SetActiveWindow FindWindow("IEFrame", vbNullString)
                touches    ' on lance le vbs avec les touche (il est certainement possible de le faire directement dans la sub je suppose
            End If
            'on pause un moment  le temps du téléchargement effectif pour fermer IE
            Application.Wait (Now + TimeValue("0:00:03"))
            .Quit
        End With
        ' veuillez noter après les touches comme la fenêtre (bandeau transformé) se déplace
        ' en fait il n'en est rien c'est simplement une autre fenêtre ("afficher les téléchargement") dont je n'arrive pas a pointer correctement afin de me passer du Wait
    End Sub
    Sub touches()
        Dim SCR$, F%, fichier$
        fichier = ThisWorkbook.Path & "\ToucheTAB_Enter.vbs"
        SCR = SCR & "Set wshShell = CreateObject(""WScript.Shell"")" & vbCrLf
        SCR = SCR & "WScript.Sleep 200" & vbCrLf
        SCR = SCR & "wshShell.SendKeys ""{TAB}""" & vbCrLf
        SCR = SCR & "WScript.Sleep 300" & vbCrLf
        SCR = SCR & "wshShell.SendKeys ""{enter}""" & vbCrLf
        ' auto destruction du vbs
        SCR = SCR & "Set objFSO = CreateObject(""Scripting.FileSystemObject"")" & vbCrLf
        SCR = SCR & "objFSO.DeleteFile (""" & fichier & """)"
        ' ecriture du fichier
        F% = FreeFile
        Open fichier For Output As #F
        Print #F, SCR
        Close #F
        ' lancemant du du vbs
        SCR = """" & fichier & """"
        CreateObject("WScript.Shell").Run SCR
    End Sub
    ATTENTION TOUT DE MEME SI IL Y A D'AUTRE INSTANCE DE IE MEME SI ELLES NE SONT PAS LANCEES PAR VBA CA DERAILLE

    ce qui prouve bien que c'est un soucis de focus
    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

  17. #257
    Membre émérite
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Par défaut
    Marc,
    test de ton code du message #257 : testé une vingtaine de fois de suite : 100% de réussite
    Par contre, même en attendant quelques secondes la fenêtre de IE ne se ferme pas toujours.
    Pourtant il ne me semble pas détecter un résiduel...

    A+

  18. #258
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Patrick,
    je viens de tester ton dernier code sur une configuration Seven & IE9 & Excel 2003 :
    au premier lancement, c'est nickel ! Et sans avoir rien eu besoin de modifier …
    Mais comme c'était rapide, je le relance pour mieux observer : le bandeau s'affiche bien puis se ferme
    mais le fichier n'est plus téléchargé dans Excel ! Idem au troisième essai, au quatrième, au cinquième, …
    Pas assez en forme ce soir pour enquêter …

    David,
    tu as eu du bol car de mon côté j'ai parfois des loupés mais en provoquant les ennuis
    (réduction de la pause à 100, changement de la fenêtre active, …)
    et parfois sous IE9 dans la barre des tâches de Seven l'icône d'IE apparaît clignotante
    et rien ne se passe tant que je ne clique pas dessus !

    Sous Windows 8.1 & IE11 en cours de modification du code j'ai aussi constaté le résiduel d'IE11
    met parfois plus de temps à se fermer, dans les 20-30 secondes au lieu des 5-10 habituelles …
    Si de ton côté le résiduel est toujours présent longtemps après le téléchargement (60 secondes)
    là il sera de nouveau nécessaire d'utiliser mon lancement spécial d'IE de Demo2IE11.
    Je ne l'ai pas réintégré dans ma nouvelle version car je n'ai guère eu le souci
    et l'utilisation de ce genre de code est ponctuelle, procédure pas censée être lancée à répétition …

    Après avoir posté ma Demo5a, pensant au Focus dans d'anciens codes pilotant IE, notamment dans ma contribution,
    je suis revenu à mes bases mêmes si elles paraissent incongrues pour IE11 et des versions récentes d'Excel
    mais le but recherché est que cela fonctionne sous diverses configurations comme Seven & IE9 & Excel 2003
    ou bien Windows 8.1 & IE11 & Excel 2010 ou encore avec des versions plus récentes
    et aussi en essayant de livrer un code pas trop compliqué, accessible au plus grand nombre
    (en attendant un jour de trouver mieux comme déjà évoqué précédemment) …

    Après deux jours de tests sur deux configurations différentes (Seven & IE9 & Excel 2003, Windows 8.1 & IE11 & Excel 2010)
    cette nouvelle version me donne les meilleurs résultats même en cherchant les ennuis dont la perte de focus !

    Code à coller intégralement dans le module ThisWorkbook :
    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
    #If Win64 Then
        Private Declare PtrSafe Function FindWindowExA& Lib "user32" (ByVal hParent&, ByVal hChild&, ByVal ClassName$, ByVal WindowName$)
        Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal MilliSeconds&)
    #Else
        Private Declare Function FindWindowExA& Lib "user32" (ByVal hParent&, ByVal hChild&, ByVal ClassName$, ByVal WindowName$)
        Private Declare Sub Sleep Lib "kernel32" (ByVal MilliSeconds&)
    #End If
     
    Const PROC = "ThisWorkbook.KeyLoop", SC = 10
    Dim IE As Object, D As Date, T!
     
    Sub Demo6()
           Const ELT = "ctl00_BodyABC_Button1"
             Dim Wb As Workbook
             T = Timer
        For Each Wb In Workbooks
              If Wb.Name Like "Cotations*.csv" Then Wb.Close False
        Next
         On Error GoTo Fin
         Set IE = CreateObject("InternetExplorer.Application")
        With IE
                  .Navigate "http://www.abcbourse.com/download/historiques.aspx"
            While .ReadyState < 3
                If Timer - T > SC Then Error 17
            Wend
            While Not IsObject(.Document.all(ELT))
                If Timer - T > SC Then Error 31004
            Wend
            With .Document.all
                 .ctl00_BodyABC_strDateDeb.Value = "26/05/2015"
                 .ctl00_BodyABC_strDateFin.Value = "26/05/2016"
                 .ctl00_BodyABC_oneSico.Click
                 .ctl00_BodyABC_txtOneSico.Value = "FR0000120222"
                 .ctl00_BodyABC_dlFormat.Value = "x"
                 .Item(ELT).Click
            End With
            While FindWindowExA(.HWND, 0&, "Frame Notification Bar", vbNullString) = 0
                If Timer - T > SC Then Error 31027
            Wend
                Sleep 400
                .Visible = True
                Sleep 100
    Fin:
            If Err.Number Then T = 0: Beep: .Quit: Set IE = Nothing Else KeyLoop
        End With
    End Sub
     
    Private Sub KeyLoop()
            On Error Resume Next
            AppActivate IE.Document.Title
        If Err.Number = 0 Then
            Sleep 100
            With IE.Document.getElementsByTagName("A"):  .Item(.Length - 1).Focus:  End With
        End If
        If Err.Number Or Timer - T > SC Then
            T = 0:  Beep:  IE.Quit
                       Set IE = Nothing
        Else
            Sleep 100
            CreateObject("WScript.Shell").SendKeys "{TAB}~"
            D = Now + 0.00002:  Application.OnTime D, PROC
        End If
    End Sub
     
    Private Sub Workbook_Deactivate()
        If ActiveWorkbook.Name Like "Cotations*.csv" And T Then
            Debug.Print "Demo6 : " & Format$(Timer - T, "0.000s")
            On Error Resume Next
            Application.OnTime D, PROC, , False
            T = 0:  IE.Quit
                Set IE = Nothing
            ActiveWorkbook.Saved = True
        End If
    End Sub
    Si le téléchargement ne s'effectue pas du premier coup, pas d'effet flash mais une attente sur le bandeau,
    il faut augmenter la pause de la ligne de code n°40 … Sinon ne pas hésiter à tester avec une pause insuffisante !

    Avec IE9, plus de clignotement mais parfois IE n'arrive pas à s'afficher au premier plan :
    c'est géré avec une fermeture automatique et un bip sonore ; y a plus qu'à relancer …
    J'ai l'impression que c'est dû aux lancements consécutifs mais au moins cela ne plante pas ni ne boucle indéfiniment …

    Piloter IE est comme le trapèze volant au cirque, une chute est toujours possible ‼

  19. #259
    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 Marc et Davido
    marc met le .quit final en commentaire
    c'est toujours le soucis de savoir quand fermer IE

    Marc en dessous de 1.5mega de débit j'ai 2 ratés sur 3 je n'est que le beep
    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. #260
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Salut Patrick !
    Pour le .Quit, c'est dans ton code ou dans le mien ?

    Concernant ma Demo6, c'est peut-être la constante SC ("TimeOut") fixée à dix secondes qui n'est pas suffisante,
    à tester à 20 par exemple. En Wi-Fi mes tests se font à 70 MBits/s plancher (là je suis à 86) …

    Je suis en train de tester une évolution qui pour l'instant avec IE9 ne rencontre plus le souci
    de la non activation d'IE au premier plan - quoique le site abcbourse rame un peu aujourd'hui - en remplaçant
    AppActivate par la fonction SetForegroundWindow de user32 et j'ai aussi trouvé comment tester la présence
    du bandeau ou pas en cas de fermeture manuelle pendant un loupé avant l'intervention de KeyLoop par exemple
    mais je n'ai pas encore procédé aux tests avec IE11, à suivre …

Discussions similaires

  1. [FAQ VB/VBA] Piloter MSN et Windows Messenger
    Par SilkyRoad dans le forum Contribuez
    Réponses: 8
    Dernier message: 03/02/2010, 17h13
  2. variable globale + fenetre de debogage vba
    Par papy_tergnier dans le forum Access
    Réponses: 5
    Dernier message: 08/09/2005, 12h32
  3. [newbie] piloter une fenetre DOS
    Par GroGorZ dans le forum C++
    Réponses: 6
    Dernier message: 23/10/2004, 18h26
  4. Fenetre windows
    Par casafa dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 25/07/2003, 18h18
  5. [VB6] Listage des fenêtres windows
    Par gg78 dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 27/05/2003, 12h36

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