XLS : Modèle pour ouvrir un classeur sur une nouvelle Session Excel

Lu76Fer

XLDnaute Occasionnel
Bonjour,

Je partage ici un classeur type permettant d'ouvrir un autre classeur cible sur une nouvelle session (Application) Excel. A l'aide d'une procédure ajoutée au classeur cible et servant d'interface entre les 2 sessions, le classeur modèle transmet une variable session de type Application permettant ainsi de contrôler la session principale depuis le classeur cible.
Remarque : lors de l'ouverture du fichier cible à partir du modèle, une nouvelle session Excel est visible au niveau du gestionnaire des tâches car une nouvelle ligne EXCEL.EXE se rajoute

Le modèle proposé dans ce sujet, prend en charge l'erreur d'ouverture du fichier cible, l'erreur d'appel à la procédure servant d'interface et en l'abscence d'erreur se ferme.

Attention ! Il ne faut pas définir de procédure automatique comme Workbook_Open dans votre classeur cible car elle se lancerait plus vite que la procédure d'interface.

Ouvrez le classeur modèle et remplissez les 3 champs en jaune :
  1. Si votre classeur cible est installé dans un sous-répertoire par rapport à ce classeur indiqué le chemin relatif
  2. Entrez le nom avec l'extension de votre classeur cible
  3. Saisissez le nom de la procédure d'interface et vous aurez le modèle de code à copier dans votre classeur cible.
Si vous souhaitez lancer une procédure à l'ouverture sans que cela ne bloque la fermeture du Classeur modèle, ajoutez à la fin de la procédure d'interface, nommée ici SessionInterface, un appel à la procédure OnTime en adaptant le code :
VB:
Public MainSession As Application 'Session principale

Public Sub SessionInterface(appSrc As Application)
    Set MainSession = appSrc
     '<CODE> ....
     Application.OnTime Now, "Init"    'Lance par ex. la procédure Init dans un module sur le classeur cible
End Sub

Limitation : le classeur cible une fois ouvert peut se retrouver en arrière plan ...

Voici le principe du code principal :
Il faut créer et afficher une nouvelle Session
VB:
Set newXLInstance = New Application
newXLInstance.Visible = True
Ensuite, il faut ouvrir le classeur cible; par exemple Target.xlsm
VB:
Set wbkTarget = newXLInst.Workbooks.Open("Target.xlsm")
Ensuite il faut transmettre la référence à la session principale à l'aide de l'instruction Run qui exécute notre procédure d'interface avec comme paramètre l'objet Application :
VB:
newXLInstance.Run "'Target.xlsm'!SessionInterface", Application
Remarque : il n'est normalement pas possible de transmettre une référence à un objet à l'aide de l'instruction Run à l'exception de l'objet Application !!

L'avantage d'ouvrir une application depuis une autre session c'est de pouvoir contrôler un autre classeur ouvert sur la session principale (Evènements à l'aide d'un module de Classe) sans que son code ne soit visible dans le VBE de la session principale et sans qu'il ne soit Stoppé ! En effet, si on stop VBE sur une session cela réinitialise le code de tous les classeurs de la session.

P.J. : pour accéder au code du fichier OpenWkbInNewSession.xlsm, il faut renommer le fichier exemple Workbook.xlsm car sinon le fichier se ferme automatiquement !​
 

Pièces jointes

  • Workbook.xlsm
    10.9 KB · Affichages: 0
  • OpenWkbInNewSession.xlsm
    19.7 KB · Affichages: 1
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
315 087
Messages
2 116 082
Membres
112 653
dernier inscrit
flapynot7x