Récupérer le focus Excel

Résolu
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. Contributeur
    bonjour, je doute que ton analyse soit correcte.
    et si tu mets "msgbox", cela s'exécute-t'"il?
    1. Je n'arrive pas non plus à exécuter un msgbox, mais peut-être que je m'y prends mal.
      Comment écrirais-tu le code ?
    2. Contributeur
      @1Globule
      msgbox "coucou"

      peut-être le code VBA est-il bloqué sur une instruction qui ne se termine pas?
    3. Je veux dire, comment écrirais-tu le code qui déclenche la macro une fois que le "collé" est effectué dans l'autre application ?
    4. Contributeur
      @1Globulene peux-tu pas faire cela dans ta macro Excel existante, déjà déclenchée?
    5. 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 !
  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 ?
    1. Contributeur
      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?
    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.
    3. Contributeur
      @1Globulele 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.
    4. 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 ?
    5. Contributeur
      @1Globuleje 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.
  3. Contributeur
    1. 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...
    2. Contributeur
      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
      
      
    3. 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 ?
    4. Contributeur
      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
      
      
      
    5. Contributeur
      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