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 :

Pilotage d'une fenêtre externe réduite via VBA (avec des bonnes vieilles sendkeys) [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Documentaliste
    Inscrit en
    Mars 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Documentaliste

    Informations forums :
    Inscription : Mars 2017
    Messages : 15
    Points : 11
    Points
    11
    Par défaut Pilotage d'une fenêtre externe réduite via VBA (avec des bonnes vieilles sendkeys)
    Bonjour à tous !

    J'ai besoin de vos connaissances et expériences pour un cas d'utilisation un peu spécial d'une macro VBA sur Excel.
    Avant tout, sachez que j'utilise les sendkeys par nécessité, est qu'aucune autre fonction ne peut-être employée dans mon cas.

    Voici une rapide explication du principe :
    Je dispose dans le cadre de mon travail, d'une base de donnée accessible via un software du type ERP (ou PGI pour les francophones, Progiciel de Gestion Intégré).
    Celui-ci dispose de sécurités ne me permettant pas d'activer les .exe des différentes fonctions qu'il propose via une commande shell, ce qui me force à simuler mes touches pour me déplacer afin d'atteindre les fonctions intéressantes.

    Jusqu'à présent tout fonctionne à merveille, j'arrive à changer le handle pour écrire avec sendkeys dans les champs à compléter et j'arrive également à détecter si la fenêtre que je souhaite activer dans mon ERP est ouverte ou non.
    J'ai réussi à atteindre le but final de la macro, qui est tout simplement de copier coller des données dans un tableur avec une certaine mise en forme.

    Et voici maintenant la raison de ce poste :
    Est-t-il possible, dans un but purement ergonomique, de réduire une fenêtre de mon ERP dans la barre des taches, de lui donner mon handle puis de remplir ses champs sans avoir de visuel ?

    Je m'explique :
    Ci dessous, un code qui me permet via différentes fonction d'ouvrir la fenêtre désirée, de la réduire puis de lui donner le handle.
    Par la suite, j'active les sendkeys pour remplir les champs, mais une fois la macro terminée, ceux-ci son désespérément vide lorsque je ré-agrandis ma fenêtre.

    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
    Sub MacroRedux()
     
    Call CloseWindow                        'Ferme les précédentes session de l'ERP
    Call timerInterval8                               'Timer pour éviter que les instructions ne s'exécutent sans que la fenêtre suivante soit chargée 
     
    Dim Letsgo
    Letsgo = Shell("C:\Program Files (x86)\XXXXXXXXXXX.exe", 1)                            '.exe de base de l'ERP, sans protection donc accessible
    Call timerInterval8
     
    m_hWnd = FindWindow(vbNullString, "Nom de la première fenêtre")                  'Fonction permettant de trouver la fenêtre désirée parmi l'ensemble des fenêtres disponibles 
    Call SetForegroundWindow(m_hWnd)                                      'Fonction pour passer la fenêtre au premier plan une fois que la fonction précédente l'a trouvé
    Call ENTER                                 'Sendkeys ENTER
    Call timerInterval3
     
    m_hWnd = FindWindow(vbNullString, "Nom de la seconde fenêtre")
    Call SetForegroundWindow(m_hWnd)
    Call Redux                                        'Sendkeys "alt+espace+u", permettant de réduire la fenêtre active dans la barre des taches
    Call timerInterval3
     
    m_hWnd = FindWindow(vbNullString, "Nom de la troisième fenêtre")
    Call SetForegroundWindow(m_hWnd)
    Call ID                                        'Sendkeys "N° d'identification"
    Call TABu                                        'Sendkeys "tabulation"
    Call PASS                                        'Sendkeys "Password"
    Call timerInterval3
     
     If GetKeyState(VK_NUMLOCK) = 0 Then                                        'Ré-init du pad numérique (qui pour une mystérieuse raison s'active et se désactive aléatoirement durant la macro
         SendKeys "{NUMLOCK}", True
     End If
     
    End Sub
    Ce n'est qu'un fragment.
    Je vous épargne la quarantaine de fonctions pour exécuter les différentes sendkeys tout en gardant un visuel potable du code (d'où tout ces Call).

    Je reformule une dernière fois la question :
    Est-t-il possible de remplir via la fonction sendkeys les champs d'une fenêtre active sous forme réduite (dans la barre des taches) ?

    J'espère que quelqu'un pourra m'aider !
    Merci pour votre compréhension !

    PS : Je suis débutant, je m'excuse d'avance pour mon code d'une mocheté incomparable et mes soucis d'explication, je fais de mon mieux !

    Cordialement !

  2. #2
    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

    Bonjour !

    P'tite question :   pourquoi ne pas utiliser la fonctionnalité d'exportation présente dans tout bon ERP ?!

    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Stockholm, London, Istanbul, Berlin, Nice, Bruxelles, Charlie, …
    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. #3
    Membre à l'essai
    Homme Profil pro
    Documentaliste
    Inscrit en
    Mars 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Documentaliste

    Informations forums :
    Inscription : Mars 2017
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Bonjour Marc-L !

    P'tite question, P'tite réponse !

    L'ERP en question est Allemand et absolument pas ergonomique (mais alors pas du tout !).
    Les 3/4 des fonctions nécessitent une connaissance de l'allemand technique.
    À cela, j'ajoute que je suis actuellement en intérim', et que ça ne fait que 5 mois que je suis dans cette entreprise.
    Ayant vu le nombre de fonctions disponibles et n'ayant reçu qu'une minuscule formation de mon collègue, j'estime donc ma connaissance de cet ERP aux alentours de 6%.

    J'ai déjà exploré cette idée et j'ai même conversé avec le site mère pour obtenir ces informations, mais malheureusement sans réel succès...

    En espérant avoir répondu à ta question !

  4. #4
    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


    Comme ce n'est pas interne à Excel, il faut chercher du côté des API Windows.

    Donc recherche sur la Toile, forums systèmes, documentation sur MSDN, …
    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. #5
    Membre à l'essai
    Homme Profil pro
    Documentaliste
    Inscrit en
    Mars 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Documentaliste

    Informations forums :
    Inscription : Mars 2017
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Hmm...
    C'est bien ce que je craignais...

    J'ai fais ma tournée des forums et des aides, et je n'ai rien trouvé qui puisse solutionner ma question.
    D'un autre coté, je m'en doutais un peu, c'est tellement précis et inhabituelle comme manipulation que peu voir aucun programmeur ne s'est jamais posé la question de comment la réaliser...

    Bon, je vais devoir me contenter des fenêtres qui s'ouvrent et qui se ferment pendant 10 minutes sur mon écran lorsque la macro travaille.

    Du coup pour information, afin d'éviter qu'un utilisateur fasse bugger une macro avec des sendkeys en cliquant sur une mauvaise fenêtre pendant son déroulement, je vais sûrement utiliser une petite astuce du genre fonction qui désactive les cliques gauche et droit de la souris.
    Simple, efficace, totalement frustrant.

    Merci pour ton aide Marc-L.

    Je résous le sujet, même si la solution n'a pas été trouvé.

    Bonne fin de journée à tous.
    Cordialement.

  6. #6
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    une petite astuce du genre fonction qui désactive les cliques gauche et droit de la souris
    et le clavier, par la même occasion, hein ...
    Cette fonction existe déjà dans la librairie user32 de l'Api de Windows.
    L'utiliser est peu raisonnable, voire très gênant si interruption inopinée.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  7. #7
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, ouais du genre kamikaze ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Declare Function BlockInput Lib "user32" (ByVal fBlock As Long) As Long

  8. #8
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Salut kiki29
    kamikaze
    exactement ... et drogué (en quasi overdose) au captagon, en plus
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  9. #9
    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
    la réponse a la base est un non catégorique
    on ne peut pas appliquer un/des sendkeys sur une fenêtre réduite bien évidemment parce qu'elle perds aussitôt le focus walouh walouh

    d'autant plus que sendkeys doit être appliquer d'un object tel que l'objet wscript.shell car application.sendkeys fonctionne que sur excel

    voir du coté du hook mais c'est tartiné et prendre possession de la windows et ses subs
    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 à l'essai
    Homme Profil pro
    Documentaliste
    Inscrit en
    Mars 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Documentaliste

    Informations forums :
    Inscription : Mars 2017
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Merci à tous pour vos réponses !

    unparia
    Cette fonction existe déjà dans la librairie user32 de l'Api de Windows.
    L'utiliser est peu raisonnable, voire très gênant si interruption inopinée.
    Oui, je suis légèrement suicidaire sur les bords !
    Et pour le clavier, effectivement ce serait bien que certaines combinaisons de touches soient désactivées (Alt + Tab, Ctrl + espace + u, etc).
    Je dis bien certaines, parce qu'en cas de plantage justement si la souris est bloquée, il reste toujours un moyen de la débloquer en lançant une macro via le clavier.


    Kiki29
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Declare Function BlockInput Lib "user32" (ByVal fBlock As Long) As Long
    Du coup merci, mais non merci... je reste raisonnable aujourd'hui !


    Patricktoulon
    on ne peut pas appliquer un/des sendkeys sur une fenêtre réduite bien évidemment parce qu'elle perds aussitôt le focus walouh walouh
    Pourtant grâce à l'extrait de macro présent dans mon premier poste, l'effet produit donne l'impression que la fenêtre a bien le focus... (l'icône est en surbrillance dans la barre des tâches et le fait de le développer en passant la souris dessus (vive Win Seven) indique que la fenêtre que je désire est bien active.)
    Mais bon, encore une fois c'était assez prévisible, écrire dans une fenêtre réduite en fonctionnement normal (sans macro), c'est complètement dérisoire et impossible.
    J'ai voulu tester cela parce que je pensais que l'appui physique (en externe) sur les touches était différent d'un appui simulé par un programme (en interne). Les droits accordés par Windows auraient pu ne pas être les mêmes pour un utilisateur et pour un programme.

    voir du coté du hook mais c'est tartiné et prendre possession de la windows et ses subs
    Un jour, César à dit "Je suis venu, j'ai vu, je suis repartis la queue entre les jambes". C'est également mon cas !
    Je me suis intéressé au hook hier soir, comme tu me l'as conseillé. Mais hélas pour moi, je ne maîtrise pas encore très bien le Japonais...
    Cela dépasse un peu mes compétences...
    Mais merci quand même pour la proposition.

    Une autre variante qui m'est venu à l'esprit hier consisterait à ne pas réduire la fenêtre... mais de diminuer au maximum sa taille (pour ne laisser apparaître que les options fermer, niveau inférieur et réduire). L'aspect esthétique en serait amélioré, même si cela n'empêche pas l'utilisateur de cliquer sur le bureau.
    Piste à explorer, mais je ne sais absolument pas comment l'exploiter...

    Je ne baisse pas les bras !
    Cordialement !

  11. #11
    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
    re
    Une autre variante qui m'est venu à l'esprit hier consisterait à ne pas réduire la fenêtre... mais de diminuer au maximum sa taille (pour ne laisser apparaître que les options fermer, niveau inférieur et réduire). L'aspect esthétique en serait amélioré, même si cela n'empêche pas l'utilisateur de cliquer sur le bureau.
    Piste à explorer, mais je ne sais absolument pas comment l'exploiter
    oui avec l'api setwindowpos
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" ( _
                     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

    Constante Valeur Définition
    HWND_BOTTOM 1 Place la fenêtre en dessous de toutes les autres.
    HWND_NOTOPMOST -2 Place la fenêtre au dessus de toutes les fenêtres qui n'ont pas l'attribut "TOPMOST" (et en dessous de ces dernières).
    HWND_TOP 0 Place la fenêtre au premier niveau.
    HWND_TOPMOST -1 Place la fenêtre au premier niveau, celle-ci conserve cet attribut même lorsqu'elle perd le focus.
    SWP_HIDEWINDOW &H80 Cache la fenêtre.
    SWP_NOACTIVATE &H10 N'active pas la fenêtre.
    SWP_NOMOVE &H2 Garde la même position (les paramètres X et Y ne sont pas pris en compte).
    SWP_NOSIZE &H1 Conserve les dimensions courantes (paramètres cx et cy pas pris en compte).
    SWP_SHOWWINDOW &H40 Affiche la fenêtre.

    mais il te faut aussi regarder du coté de findwondowhex pour les enfant de la fenêtre

    sinon regarde aussi du cote de UIautomation
    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

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

Discussions similaires

  1. pilotage d'une application externe par une macro excel
    Par fribelle dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/11/2008, 14h52
  2. Importer une requete dans Excel via VBA
    Par ted the Ors dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 16/04/2008, 19h29
  3. Afficher une palette de couleur via VBA
    Par bernardmichel dans le forum VBA Access
    Réponses: 2
    Dernier message: 23/08/2007, 14h21
  4. Comment fermer une fenêtre externe à l'application ?
    Par Matt2094 dans le forum Delphi
    Réponses: 8
    Dernier message: 30/08/2006, 16h52
  5. Imprimer une requête en Paysage sous VBA avec des raccourcis clavier.
    Par Armagnak dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 18/08/2006, 10h51

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