Le problème est qu'après l'exécution de cette macro, c'est Excel qui reste validé et il faut que je re-clique dans Excel pour qu'il considère son travail comme fini et revienne dans mon autre logiciel (celui qui a lancé la macro en DDE)
Y aurait-il un moyen pour qu'Excel rende la main après l'exécution d'une macro?
Merci d'avance pour votre aide!
Gui<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201578 16 févr. 2009 à 15:18
Salut
En fait, c'est ton application qui s'est mise en veille tant qu'elle n'a pas le focus (qu'elle n'est pas la fenêtre actuellement active)
Une solution peut consister à fermer Excel après travail, cela rendrait la main à ton logiciel.
Sinon, côté Excel, tu peux forcer le changement de "focus" en :
Recherchant l'identifiant (le handle) de ton logiciel.
Pour ce faire, il faut connaître le titre (Caption) de ton logiciel, le texte qui apparait en haut dans le bandeau bleu
Dans la partie déclaration de ta page de code Excel (tout en haut), insère ces déclarations :
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Ensuite, après les instructions de ta macro (au moment où tu veux redonner la main à ton logiciel) :
Dim monAppHwnd As Long
monAppHwnd = FindWindow(vbNullString, "Le titre exact de mon Appli" & Chr$(0))
Enfin, il ne reste plus qu'à demander à Windows de remettre ton application au premier plan.
If monAppHwnd <> 0 Then
Call SetForegroundWindow(monAppHwnd)
Else
MsgBox "L'a pô trouvé l'appli"
End If
Je ne l'ai pas testé, mais je pense que cela devrait fonctionner.
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Gui3876
Messages postés2Date d'inscriptionvendredi 5 octobre 2007StatutMembreDernière intervention16 février 2009 16 févr. 2009 à 16:56
Merci Jack pour ta réponse si rapide!
La récupération du handle du logiciel fonctionne correctement mais lors de l'exécution du pas Call SetForegroundWindow(monAppHwnd) rien ne se passe... D'après ce que j'ai compris mon appli devrait revenir au 1er plan non?
En fait il semblerait qu'Excel ne rend pas la main car son cursuer est en attente dans une cellule (celle qui était validée avant l'exécution de la macro), mais qu'attend-t-il???
Aurais-tu une idée de pourquoi cela ne fonctionne pas dans mon cas?
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201578 16 févr. 2009 à 20:01
Re
Il n'attend rien, il a fini son boulot.
Que veux-tu qu'il fasse ?
Peux-tu fermer Excel après l'exécution de ta macro ? (en ajoutant les instructions de fermeture)
Essaye de vider ta macro et de mettre seulement un truc bateau, genre MsgBox "Coucou", pour vérifier que c'est un comportement de Excel ou de la macro.
Est-ce que ta commande Ouvre excel pour lancer la macro ou bien Excel est-il déjà ouvert ?
Y a t-il d'autres fichiers ouverts ?
Si SetForeground ne marche pas, tu peux essayer ShowWindow (à la place) :
Déclaration :
Private Declare Function ShowWindow Lib "user32" ( _
ByVal hwnd As Long, _
ByVal nCmdShow As Long) As Long
Const SW_SHOWNORMAL = 1
Utilisation :
Call ShowWindow (monAppHwnd, SW_SHOWNORMAL)
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)