Urgent: Excel ne rend pas la main après exécution d'une macro

Gui3876 Messages postés 2 Date d'inscription vendredi 5 octobre 2007 Statut Membre Dernière intervention 16 février 2009 - 16 févr. 2009 à 14:51
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 16 févr. 2009 à 20:01
Bonjour,

J'ai un souci sur Excel:
Je souhaite exécuter une macro à VBA sous Excel à partir d'un logiciel non microsoft via une liaison DDE:

   DDE EXECUTE 'Excel'
      TOPIC   'System'
      COMMAND '[Run("printer.xls!fEtiquette_Carton")] '
      TIME_OUT 60 SEC

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" /??>

3 réponses

cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
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)
0
Gui3876 Messages postés 2 Date d'inscription vendredi 5 octobre 2007 Statut Membre Dernière intervention 16 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?

Merci encore...

Gui
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
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)
0