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. #261
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut
    chez nous free varie entre 5/7 méga et 880 kilo j'ai pas encore la fibre free chez moi je suis obligé de prendre SFR Numéricâble pour passer en speed mais j'aime bien la box freeV6 je m'y suis habitué

    le test fonctionne a 30 mais pas tout le temps

    non il faut vraiment trouver un point de control sur IE qui nous permette de trouver a coup sur le moment de la fermeture ,les test ready et object faisant leur boulot pour aller plus loin ou pas sur ce type de page car elle est bien particulière

    re
    Salut Patrick !
    Pour le .Quit, c'est dans ton code ou dans le mien ?
    le mien
    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. #262
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut

    Augmente alors à 40 la constante SC …

    Pour ton code même sans le .Quit final, il fonctionne bien avec IE9 que lors de son premier lancement !
    Pourtant je ne vois rien de résiduel en mémoire …


    David, as-tu essayé ma Demo6 ?

    Sinon avec la version suivante, peut-être auras-tu moins le souci avec le résiduel d'IE11 …
    Elle gère maintenant d'autres cas possibles :
    - erreur de saisie comme par exemple une date erronée
    (affichage d'IE pour visualiser le message du site avant de quitter la procédure);
    - codes d'erreur affichés dans la fenêtre Exécution dont certains spécifiques à la sortie par TimeOut;
    - fermeture d'IE ou du bandeau avant le SendKeys

    J'attends le retour de la personne chez laquelle je suis intervenu pour une page Web similaire
    où parfois cela se fige entre l'affichage d'IE et la validation de l'ouverture du fichier
    et comme elle ferme directement IE ou le bandeau au lieu de patienter (constaté de visu sur place) …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  3. #263
    Membre confirmé
    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
    Points : 649
    Points
    649
    Par défaut
    La Demo6 fonctionne sans problème, même sans les Sleep et pour l'instant IE se ferme correctement à la fin.

    Concernant le fait que sous IE 9 la fenêtre ne s'affiche pas j'avais réglé ce problème avec une API forçant la fenêtre à s'afficher (cf. mes codes précédents).
    A+

  4. #264
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut
    Sans le premier Sleep, grande chance d'un loupé lors du premier KeyLoop et avec - si bien paramétré - c'est plus rapide !
    A de rares occasions sans les autres Sleep 100 j'ai eu de mauvaises surprises …

    Pour la nouvelle version ci-dessous, comme ce post me servira d'exemple pour de futures discussions,
    voici le détail des temporisations nécessaires dans le code :

    • Ligne n°13, la constante SC sert comme TimeOut général, variable selon la puissance de l'ordinateur et de la connexion …
    Elle sert à éviter de boucler indéfiniment en cas de souci pour récupérer la main car pas d'utilisation de DoEvents.

    Pour la calculer, il faut compter le temps de la primo ouverture d'IE, ajouter le temps lors de la validation de l'adresse
    de la page Web afin que le bouton Télécharger soit disponible, après le paramétrage de la page et
    la validation du bouton Télécharger ajouter le temps d'apparition du bandeau puis ajouter enfin le temps d'ouverture
    du fichier dans Excel et évidemment inclure une marge en cas d'un éventuel ralentissement.
    De mon côté le tout prenant environ cinq secondes, je l'ai fixée à 10 …

    En cas d'insuffisance de cette constante, une erreur 1001 à 1004 est affichée dans la fenêtre Exécution du VBE
    indiquant ainsi la position du déclenchement dans le code.
    Toutefois si le site rame ponctuellement, cette même erreur se déclenchera aussi …

    • La ligne n°45 conditionne l'interprétation du premier coup de la séquence de touches pour ouvrir le fichier dans Excel.
    Si elle est insuffisante, un temps d'arrêt est observable sur le bandeau avant sa disparition : alors dans ce cas
    l'augmenter de 100 et tester de nouveau … Un ordinateur portable i5 par défaut en vitesse adaptative du processeur
    avec IE9 passe bien à 400 mais si son processeur est configuré à pleine puissance permanente, il peut y avoir un loupé
    lors de la première séquence marquant donc un temps d'arrêt avant de poursuivre; à 500 plus de souci …
    Un autre portable i7 & IE11 en économie d'énergie (vitesse réduite du processeur) passe à 100
    mais pas en pleine puissance, là avec 200 c'est bon : donc il vaut mieux prévoir un poil plus qu'un poil pas assez !
    Si la pause est suffisante, à peine le temps de voir apparaître IE qu'il disparait aussitôt,
    cet effet flash confirmant l'interprétation de la séquence de touches du premier coup …

    • La variable D de la ligne n°76 est le moment où est de nouveau lancé KeyLoop en cas de loupé.
    Actuellement c'est un délai de 1,7 seconde (voir le commentaire à la fin du code pour le calcul).
    Ce délai doit être supérieur au temps nécessaire au téléchargement du fichier dans Excel et
    à l'exécution de l'évènement Workbook_Deactivate sinon cela ralentira d'autant la procédure …

    En conclusion, les pauses bien paramétrées accélèrent le processus, si, si !


    Code à copier 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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    #If Win64 Then
        Private Declare PtrSafe Function FindWindowExA& Lib "user32" (ByVal hParent&, ByVal hChild&, ByVal ClassName$, ByVal WindowName$)
        Private Declare PtrSafe Function IsWindowVisible% Lib "user32" (ByVal hWind&)
        Private Declare PtrSafe Function SetForegroundWindow% Lib "user32" (ByVal hWind&)
        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 Function IsWindowVisible% Lib "user32" (ByVal hWind&)
        Private Declare Function SetForegroundWindow% Lib "user32" (ByVal hWind&)
        Private Declare Sub Sleep Lib "kernel32" (ByVal MilliSeconds&)
    #End If
     
    Const PROC = "ThisWorkbook.KeyLoop", DMY = "dd/mm/yyyy", SC = 10
      Dim IE As Object, D As Date, H&, T!
     
    Sub Demo7()
           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")
              IE.Navigate "http://www.abcbourse.com/download/historiques.aspx"
        While IE.ReadyState < 3
            If Timer - T > SC Then Error 1001
        Wend
        While Not IsObject(IE.Document.all(ELT))
            If Timer - T > SC Then Error 1002
        Wend
        With IE.Document.all
            .ctl00_BodyABC_strDateDeb.Value = Format$(DateAdd("yyyy", -1, Date), DMY)
            .ctl00_BodyABC_strDateFin.Value = Format$(Date, DMY)
            .ctl00_BodyABC_oneSico.Click
            .ctl00_BodyABC_txtOneSico.Value = "FR0000120222"
            .ctl00_BodyABC_dlFormat.Value = "x"
            .Item(ELT).Click
        End With
        Do
            If IsObject(IE.Document.all("ctl00_BodyABC_programmaticPopup_DropShadow")) Then Error 1000
            If Timer - T > SC Then Error 1003
            H = FindWindowExA(IE.HWND, 0&, "Frame Notification Bar", vbNullString)
        Loop Until H
            Sleep 400
            IE.Visible = True
            Sleep 100
    Fin:
        If Err.Number Then
            If Err.Number = 1000 Then
                IE.Visible = True
            Else
                Debug.Print Err.Number
                If Not IE Is Nothing And Err.Number <> 462 Then IE.Quit
            End If
                T = 0:  Beep:  Set IE = Nothing
        Else
                KeyLoop
        End If
    End Sub
     
    Private Sub KeyLoop()
            On Error Resume Next
            If IsWindowVisible(H) Then B% = SetForegroundWindow(IE.HWND)
        If B Then
            Sleep 100
            With IE.Document.getElementsByTagName("A"):  .Item(.Length - 1).Focus:  End With
            If Err.Number = 0 And Timer - T > SC Then Error 1004
        End If
        If Err.Number Or B = 0 Then
            Debug.Print IIf(Err.Number, Err.Number, 1005)
            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 "Demo7 : " & Format$(Timer - T, "0.000s")
            ActiveWorkbook.Saved = True
            On Error Resume Next
            Application.OnTime D, PROC, , False
            T = 0:  IE.Quit:  Set IE = Nothing
        End If
    End Sub
     
    '   Temporisations :    - ligne 13 : constante SC (TimeOut)
    '                       - ligne 45 : conditionne l'interprétation des touches du premier coup
    '                       - ligne 76 : délai du prochain KeyLoop en cas de loupé (1 jour = 86400s * 0.00002 = 1,7s)
    Autres nouveautés de cette version :

    • la ligne n°41 détecte si le site affiche un message d'erreur suite au paramétrage de la page;
    pas la peine d'attendre le TimeOut alors que le message est affiché dès les premières secondes …

    • La ligne n°64 affiche IE au premier plan si le bandeau de téléchargement est bien présent.

    • Ligne n°71 : s'il n'y a pas de numéro d'erreur alors 1005 est affiché dans la fenêtre Exécution :
    le bandeau du téléchargement a été fermé par l'utilisateur ou carrément IE !
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  5. #265
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut

    J'attendais une réaction suite à ma Demo7 mais comme depuis deux semaines je teste avec succès une voie sans SendKeys


    • Auparavant, je reviens sur mon post #187 concernant le contournement en VBScript avec IE11

    car cela peut toujours poser problème même avec .all("NomObjet") Is Nothing ! (et même avec .getElementById au lieu de .all)

    Qui plus est sur un autre ordinateur aussi sous Windows 8.1 et IE11 (.0.34) l'ancien code ne pose aucun souci ‼

    Code VBScript ne fonctionnant plus avec un ordinateur sous IE11 (.0.33) : While Not IsObject(.Document.all("NomObjet")) à

    remplacer par While Not IsObject(.Document.getElementById("NomObjet")) et fonctionnant aussi avec une version IE9 …


    • Il est possible de ne pas simuler les touches du clavier en déclenchant directement le bouton Ouvrir du bandeau.

    Je l'ai sous le coude depuis plus d'un an mais comme mes tests ayant échoués sans comprendre pourquoi …
    Récemment en effectuant une recherche pour un sujet n'ayant aucun rapport, je tombe sur un extrait de code
    (le gars ne s'étant vraiment pas foulé, n'indiquant même pas les références à activer, etc …)
    me remémorant immédiatement ma tentative avortée et me dévoilant la solution : une bête histoire de passage de pointeur !

    Lors de l'apparition du bandeau le téléchargement n'étant pas encore disponible, c'est comme Demo7 :
    prévoir un possible loupé et une p'tite temporisation pour déclencher du premier coup le téléchargement.

    Voir l'exemple dans la mise à jour de ma contribution … Le test avec le site de cette discussion s'est avéré lui aussi positif !
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  6. #266
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    salut Marc

    ton dernier code a des raté chez moi de temps en temps j'avais oublie de te rendre le rapport mille excuse

    je suis sur mon maileur version 2016/2017 en ce moment je vais revenir

    ps:au passage
    savais tu qu'en JavaScript on pouvait remplacer:
    document.all
    par
    document.getElementsTagName("*")(c'est d'ailleurs conseillé pour les futurs developpements )


    Tuyau donné par Melka one sur le forum JavaScript

    selon lui c'est une fonction qui est amené a disparaitre
    je m'en sert d'ailleur maintenant dans mon maileur et mon wysiwyg

    il faudrait essayer en vb,vba si c'est aussi valable ca résout le problème du .all qui ne fonctionne pas tout le temps selon les versions W/IE
    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

  7. #267
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut

    Salut Patrick et merci de ton retour !

    Pour les ratés, déjà il faut calculer la constante SC avec une marge …

    Après tout dépend à quel endroit il y a maldonne.
    De mon côté aucun souci (IE9 & IE11) ni pour la personne pour laquelle j'ai optimisé un code pour un site équivalent …

    Avec la méthode sans SendKeys, c'est encore plus simple et avec moins de risque de raté,
    teste la nouvelle procédure dans ma contribution pour le site utilisé par itwoo !
    Je l'ai testé aussi avec succès sur différents sites dont celui de ce fil …
    Dire que je l'avais sous le coude depuis des lustres !

    Et merci pour l'astuce de Melka One !
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

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, 16h13
  2. variable globale + fenetre de debogage vba
    Par papy_tergnier dans le forum Access
    Réponses: 5
    Dernier message: 08/09/2005, 11h32
  3. [newbie] piloter une fenetre DOS
    Par GroGorZ dans le forum C++
    Réponses: 6
    Dernier message: 23/10/2004, 17h26
  4. Fenetre windows
    Par casafa dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 25/07/2003, 17h18
  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, 11h36

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