Récupérer le focus Excel

Résolu/Fermé
1Globule Messages postés 62 Date d'inscription mercredi 4 mai 2016 Statut Membre Dernière intervention 28 mars 2019 - 24 sept. 2018 à 10:22
 1Globule - 2 oct. 2018 à 08:42
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

yg_be Messages postés 23401 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 décembre 2024 Ambassadeur 1 557
24 sept. 2018 à 12:54
bonjour, je doute que ton analyse soit correcte.
et si tu mets "msgbox", cela s'exécute-t'"il?
0
1Globule Messages postés 62 Date d'inscription mercredi 4 mai 2016 Statut Membre Dernière intervention 28 mars 2019 2
24 sept. 2018 à 13:53
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
yg_be Messages postés 23401 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 décembre 2024 1 557 > 1Globule Messages postés 62 Date d'inscription mercredi 4 mai 2016 Statut Membre Dernière intervention 28 mars 2019
24 sept. 2018 à 13:57
msgbox "coucou"

peut-être le code VBA est-il bloqué sur une instruction qui ne se termine pas?
0
1Globule Messages postés 62 Date d'inscription mercredi 4 mai 2016 Statut Membre Dernière intervention 28 mars 2019 2
24 sept. 2018 à 15:43
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
yg_be Messages postés 23401 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 décembre 2024 1 557 > 1Globule Messages postés 62 Date d'inscription mercredi 4 mai 2016 Statut Membre Dernière intervention 28 mars 2019
24 sept. 2018 à 16:44
ne peux-tu pas faire cela dans ta macro Excel existante, déjà déclenchée?
0
1Globule Messages postés 62 Date d'inscription mercredi 4 mai 2016 Statut Membre Dernière intervention 28 mars 2019 2
25 sept. 2018 à 07:44
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
1Globule Messages postés 62 Date d'inscription mercredi 4 mai 2016 Statut Membre Dernière intervention 28 mars 2019 2
25 sept. 2018 à 14:04
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
yg_be Messages postés 23401 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 décembre 2024 1 557
25 sept. 2018 à 16:25
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
1Globule Messages postés 62 Date d'inscription mercredi 4 mai 2016 Statut Membre Dernière intervention 28 mars 2019 2
27 sept. 2018 à 07:40
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
yg_be Messages postés 23401 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 décembre 2024 1 557 > 1Globule Messages postés 62 Date d'inscription mercredi 4 mai 2016 Statut Membre Dernière intervention 28 mars 2019
27 sept. 2018 à 08:10
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
1Globule Messages postés 62 Date d'inscription mercredi 4 mai 2016 Statut Membre Dernière intervention 28 mars 2019 2
27 sept. 2018 à 13:28
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
yg_be Messages postés 23401 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 décembre 2024 1 557 > 1Globule Messages postés 62 Date d'inscription mercredi 4 mai 2016 Statut Membre Dernière intervention 28 mars 2019
27 sept. 2018 à 20:21
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
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
Modifié le 27 sept. 2018 à 15:45
0
1Globule Messages postés 62 Date d'inscription mercredi 4 mai 2016 Statut Membre Dernière intervention 28 mars 2019 2
28 sept. 2018 à 11:19
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
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
28 sept. 2018 à 11:45
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
1Globule Messages postés 62 Date d'inscription mercredi 4 mai 2016 Statut Membre Dernière intervention 28 mars 2019 2
28 sept. 2018 à 13:01
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
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
28 sept. 2018 à 13:55
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
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
30 sept. 2018 à 08:37
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