Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2021 VBA - Recevoir un signal d'une autre Application

  • Initiateur de la discussion Initiateur de la discussion Dudu2
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Dudu2

XLDnaute Barbatruc
Bonjour,

Existe-t-il un moyen pour une application source d'envoyer "quelque chose" (un signal) à une autre application cible qui déclenche chez elle un évènement ?

Je vois dans l'API la fonction SendMessage ou ce genre de chose mais rien pour en exploiter l'envoi. Ça m'échappe.

J'ai essayé un SendKeys de l'application source vers l'application cible (après l'avoir activée avec un SetForegroundWindow) qui a défini un Application.Onkey sur la clé envoyée. Ça fonctionne sauf évidemment quand l'application cible est en mode édition sur cellule auquel cas la clé arrive en cellule et n'est pas interceptée par le OnKey.
Mais envoyer une clé ça reste assez artisanale. J'aimerais un truc plus évolué.
 
Solution
Bonjour,

Cette version semble fonctionner sur des fichiers multiples lancés en /x dans un .bat.
Grâce aux SaveSetting / GetSetting de @Dranreb, elle a subit de drastiques simplifications et gère la sérialisation de la fusion des instances si besoin. Du moins je le pense !

Toutefois, chez moi, j'ai toujours eu un problème de processus EXCEL.EXE résiduel sans qu'aucun classeur ne soit plus ouvert.
Ça m'a toujours gêné et un peu énervé car ce processus résiduel (à tuer par un .bat) empêche l'ouverture d'un nouveau classeur.
Je n'ai jamais compris d'où ça venait.
Ce phénomène se produit à coup sûr chez moi lorsqu'après fusion d'instances, je ferme tous les classeurs de l'instance unique restante.

J'ai donc ajouté...
Bonjour.
S'il s'agit d'un classeur .xlam qui doit qui doit décréter un évènement dans un exemplaire utilisateur d'un objet de type qu'il définit, il y a certes des solutions.
 
Bonjour @Dranreb,

En effet il s'agit d'un Complément.
Je suis toujours dans mon exercice de fusion des instances.

J'ai d'abord fait un système de boucle de 3 secondes qui détecte les instances pour les fusionner.
Mais ça ne me convient finalement pas car cette boucle peut provoquer sur de petites CPU de légères sautes de souris un peu gênantes.
Le système est simple car c'est la 1ère instance qui fusionne la 2ème immédiatement après sa création et les classeurs de la 2ème viennent d'être ouverts et donc on peut les fermer dans se poser de question pour les ré-ouvrir dans la 1ère.

J'ai fait ensuite un système où la nouvelle instance fusionne la précédente mais ça ne me convient pas non plus car, même si j'ai géré les différents cas, l'instance précédente possède des classeurs ouverts et éventuellement modifiés qu'il faut rapatrier en l'état dans la nouvelle ce qui est plus complexe.

Ce que je chercher à faire, c'est reproduire la simplicité du 1er cas mais sans boucle.
Le problème c'est que, sans scan régulier, la 1ère instance ne sait pas que la 2ème instance vient d'être créée.
Il faut donc que la 2ème instance dise à la 1ère, "coco, faut que tu me fusionnes illico !".
D'où le sens de ma question.

Je peux le faire avec du OnKey mais je préfèrerais quelque chose de plus évolué.
 
Dans un module de classe nommé "Communicant" en Intancing 2 — PublicNotCreatable :
VB:
Option Explicit
Event Reçoit(ByVal Info, ByVal Auteur As Object)
Public Sub Émet(ByVal Auteur As Object, Optional ByVal Info)
   RaiseEvent Reçoit(Info, Auteur)
   End Sub
Dans un module standard nommé CréationCom :
VB:
Option Explicit
Private Com As Communicant
Public Sub CréerCom()
   Set Com = New Communicant
   End Sub
Public Function Communicant() As Communicant
   Set Communicant = Com
   End Function
Essais dans un module Worksheet :
VB:
Option Explicit
Private WithEvents Com As Communicant
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   If Com Is Nothing Then CréerCom: Set Com = Communicant
   Com.Émet Target, "Sélectionné"
   End Sub
Private Sub Com_Reçoit(ByVal Info As Variant, ByVal Auteur As Object)
   MsgBox Auteur.Address(False, False, xlA1, True) & " —> " & Info
   End Sub
 
Le problème c'est que je pense que ça ne peut pas s'utiliser dans des instances différentes d'Excel parce que ça va forcément se traduire par des instances différentes d'objets Communicant …
 
Merci pour ce code que j'ai un peu de mal à intégrer, mais ce n'est pas la question.
Le problème c'est que c'est propre à une instance.
Et je vois ton dernier message qui le confirme.
 
Là il vaudrait peut être mieux passer par un SaveSetting en y transmettant Now par exemple comme valeur d'une entrée convenue et des GetSetting périodiquement exécutés dans une boucle par les autres instances … Mais je n'ai jamais utilisé …
 
Bonjour,
Désolé d'interrompre ce monologue !
La question n'est pas trop de savoir si il Existe un moyen pour une application source d'envoyer "quelque chose" (un signal) à une autre application cible. Mais qu'est-ce qui permet à l'application cible de capter "quelque chose" envoyé par l'application source.

Sqlite ferait parfaitement l'affaire si on veut bien considérer un chat {Zone d'échange d'informations} entre les deux applications.
 
Ça suppose toujours que l'instance cible soit en vigilance sur le GetSetting.
Le problème c'est d'une instance déclencher un évènement à une autre instance.
Évidemment, si on peut pas exécuter par Application.Run une procédure dans un classeur géré par une autre instance qui le met préalablement en vigilance …
 
Dernière édition:
bonjour juste en passant

il n'y a pas un event implémentable pour ça déjà

a partir du moment ou il y a un autre classeur qui s'ouvre instance idem ou pas il y a forcement un windowdéactivate non ?
dans une classe
Public WithEvents app As Application

Private Sub app_NewWorkbook(ByVal Wb As Workbook)

End Sub

Private Sub app_WindowDeactivate(ByVal Wb As Workbook, ByVal Wn As Window)
'lancer l'intergation des classeur d'une autre instance ici
End Sub

pas besoins de looping différé ou quoi qu'est ce

je dis ça juste en passant
 
Le SendKeys ça peut pas marcher, car il suffit qu'il y ait un UserForm ouvert ou tout autre configuration qui empêche le Application.Onkey de recevoir les clés et le système est mis en échec.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…