Récupérer le focus Excel

Résolu
1Globule Messages postés 62 Statut Membre -  
 1Globule -
Bonjour à tous,

Ma macro récupère plusieurs données que je dois coller dans un logiciel de gestion. Ce logiciel ne fait pas partie de la suite Office, c'est un outil comptable.

Mon but est simplement de copier une cellule Excel et de la coller dans l'autre logiciel, puis copier une autre cellule, la coller et ainsi de suite.

Mon problème est simple, je voudrais redonner le focus à Excel une fois que j'ai effectué le "coller".

Malheureusement, je ne trouve pas de solution malgré mes recherches. Je retombe souvent sur des solutions comme "AppActivate Application.caption" ou "AppActivate "Microsoft Excel"" mais dans la mesure où Excel n'est plus activé quand je colle, la ligne de code ne s'exécute pas.

Auriez-vous une solution ?

Merci bien,

3 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour, je doute que ton analyse soit correcte.
    et si tu mets "msgbox", cela s'exécute-t'"il?
    0
    1. 1Globule Messages postés 62 Statut Membre 2
       
      Je n'arrive pas non plus à exécuter un msgbox, mais peut-être que je m'y prends mal.
      Comment écrirais-tu le code ?
      0
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > 1Globule Messages postés 62 Statut Membre
       
      msgbox "coucou"

      peut-être le code VBA est-il bloqué sur une instruction qui ne se termine pas?
      0
    3. 1Globule Messages postés 62 Statut Membre 2
       
      Je veux dire, comment écrirais-tu le code qui déclenche la macro une fois que le "collé" est effectué dans l'autre application ?
      0
    4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > 1Globule Messages postés 62 Statut Membre
       
      ne peux-tu pas faire cela dans ta macro Excel existante, déjà déclenchée?
      0
    5. 1Globule Messages postés 62 Statut Membre 2
       
      Merci yg_be pour ton aide, voici plus de précisions :

      Ma macro se déclenche avec un bouton. Lorsque je clique, elle va récupérer des données. Une fois ces données récupérées, elle s'arrête, elle est terminée.

      C'est à ce moment-là que je commence, à la main, à recopier les données dans un autre logiciel. J'utilise des simples "copier / coller", et pour l'instant je n'ai rien trouvé pour rendre le focus à Excel une fois que j'ai collé une cellule dans l'autre logiciel.
      C'est ici que j'ai besoin d'aide : Est-il possible de détecter un "coller" par Vba quand Excel n'est pas l'application active ?

      J'espère avoir été plus clair. Merci encore !
      0
  2. 1Globule Messages postés 62 Statut Membre 2
     
    S'il y a toujours quelqu'un sur le forum, j'ai essayé ce matin suite à la piste évoquée par yg_be d'utiliser un
    Workbook_open
    , il me semblait que c'était une bonne solution pour que le Vba "surveille" le clavier.

    Mais toujours impossible de détecter un "Ctrl+V" dans une autre application.

    Le
    Application.OnKey "^V"
    ne détecte rien si je ne suis pas dans Excel...

    Quelqu'un pourrait-il me venir en aide ?
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      je pense que ton code VBA doit continuer à travailler une fois les données récupérées, et se mettre à observer quelque chose qui lui permettra de savoir que Excel doit reprendre le focus.
      par exemple, il est possible, en VBA, de surveiller les fenêtres des autres applications.
      imagine que le code VBA soit un robot qui voit tout ce qui se passe dans l'ordi: comment pourrait-il détecter que tu as fini? à partir de cela, tu pourras peut-être trouver un moyen de faire le code VBA que tu souhaites. attention, le robot n'est ni très malin, ni très observateur.
      le robot ne peut pas, je pense, détecter les interactions à l'intérieur des autres applications.
      as-tu envisagé que la macro VBA fasse à ta place les actions dans l'autre application?
      0
    2. 1Globule Messages postés 62 Statut Membre 2
       
      Bonjour yg_be,

      Je ne peux pas agir dans une application comptable sécurisée au moyen d'un code Vba. Ma première intention était d'ailleurs d'accéder directement à la base de données pour modifier les tables, mais bien sûr c'est impossible, je dois me contenter de passer par l'IHM, avec des copier-coller.

      S'il est possible, en Vba, de surveiller les fenêtres des autres applications, peux-tu me dire plus précisément comment faire ? J'ai déjà cherché beaucoup sur ce sujet, je commence à me décourager.

      Merci encore.
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > 1Globule Messages postés 62 Statut Membre
         
        le VBA peut servir de robot qui se substitue à l'utilisateur (utilisation du clavier, ...), et de cette façon agir dans n'importe quelle application.

        en ce qui concerne la surveillance des fenêtres, cela permet de surveiller les fenêtres ouvertes, leurs titres, surveiller laquelle est active, pas ce qui se passe à l'intérieur des fenêtres.

        pour le moment, on cherche quoi faire, pas encore comment faire.
        0
    3. 1Globule Messages postés 62 Statut Membre 2
       
      Je voudrais bien partir sur ce "quoi faire" : Le Vba détecte un "Ctrl+V" qui n'a pas lieu dans Excel et redonne alors le focus à mon classeur.
      Reste à savoir maintenant "comment le faire"... Est-ce que tu as une idée ?
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > 1Globule Messages postés 62 Statut Membre
         
        je pense qu'il ne peut pas détecter cela: le robot ne peut pas, je pense, détecter les interactions à l'intérieur des autres applications.
        0
  3. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    0
    1. 1Globule Messages postés 62 Statut Membre 2
       
      Avec le presse-papier c'est une bonne solution.

      Si je peux détecter qu'il se vide, comme il semble que ce soit le cas ici :
      If Not Clipboard.GetImage Is Nothing Then
      , alors je pourrais faire réactiver le workbook Excel.

      Sauf que... Même en activant "Microsoft Forms 2.0 Object Library", il ne se passe rien...
      0
    2. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      Essaie ceci à adapter a ton environnement:

      Option Explicit
      Private Declare Function CountClipboardFormats Lib "user32" () As Long
      Private Declare Function OpenClipboard Lib "User32.dll" _
      (ByVal hWndNewOwner As Long) As Long
      
      Private Declare Function EmptyClipboard Lib "User32.dll" () As Long
      
      Private Declare Function CloseClipboard Lib "User32.dll" () As Long
      
      Public Sub ClearClipboard() 'vide le presse papier
          Dim Ret
        Ret = OpenClipboard(0&)
          If Ret <> 0 Then Ret = EmptyClipboard
          CloseClipboard
      End Sub
      Sub Sample()
          If (CountClipboardFormats() = 0) = True Then
              MsgBox "Presse-papiers est vide"
          Else
              MsgBox "Presse-papiers n'est pas vide"
          End If
      End Sub
      Private Sub CommandButton1_Click()
      Sample
      End Sub
      Private Sub CommandButton2_Click()
      ClearClipboard  'vide le presse papier
      End Sub
      
      
      0
    3. 1Globule Messages postés 62 Statut Membre 2
       
      Merci beaucoup pour ton aide.

      Je bloque toujours sur un point : A ce stade, mes données sont dans Excel mais aucune macro ne tourne plus.
      Je ne fais plus que des "Copier", rien qui ne puisse activer ton code (l'évènement "AfterCopy" n'existe pas...).

      Comment faire pour que le Vba reste actif et détecte les actions du presse-papier ?
      0
    4. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      A mettre dans la feuille active

      Option Explicit
      Sub recupererTextePressePapier()
      'nécéssite d'activer la référence "Microsoft Forms 2.0 Object Library." pour avoir accès insérer une UserForm
      Dim Resultat As String
       With New dataObject
          .GetFromClipboard
          Resultat = .GetText(1)
      End With
      Application.Visible = True
      ActiveWorkbook.Activate
      'MsgBox Resultat
      End Sub
      Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      recupererTextePressePapier
      End Sub
      
      
      
      0
    5. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      Je pense que tu ne veux pas afficher la fenêtre Excel manuellement (cela ne pose aucun problème), mais par code!

      Donc mettre un Timer (ajuster au temps des copier-coller) à la fin de ta macro qui lancera la macro suivante comma ceci:

      Option Explicit
      Sub attente()
      Dim PauseTime, Start, Finish, TotalTime
          PauseTime = 10    ' Set duration secondes a adapter
          Start = Timer    ' Set start time.
          Do While Timer < Start + PauseTime
              DoEvents    ' Yield to other processes.
          Loop
          Finish = Timer    ' Set end time.
          TotalTime = Finish - Start    ' Calculate total time.
          test 'lance la macro
      End Sub
      Sub test()
      MsgBox "ceci est un test"
      End Sub


      voilà

      Bon WE
      0