XL 2013 Fichier maitre appelant un fichier esclave et revenir sur le maitre

Alain BIMBAUD

XLDnaute Nouveau
Bonjour à tous,



J'ai une application que l'on appellera "fichier A" développée en VBA qui à travers un userform permet de choisir une des applications secondaires.

Chaque application secondaire est également une application qui démarrent automatiquement à travers le Workbook.open. Pour l'exemple cette application secondaire s'appellera "Fichier B". Cette application lance un formulaire.

Cette application maître (fichier A) appelant une autre application (fichier B) fonctionne très bien.

Pour l'instant, quand je ferme l'application Excel a partir du fichier esclave B, les fichiers A et B se ferment comme je veux.

Mais, l'idéal est que si je ferme le fichier B, le fichier A continue à s'exécuter pour lancer éventuellement autre application secondaire……. Et là est le problème!!

Quand je ferme mon fichier B, malheureusement le code s'arrête et reste figé sur le userform du fichier A qui l'a appelé.

Pour essayer trouver une solution, j'ai re-créé un en environnement minimum avec un fichier maitre et un fichier esclave et le minimum de code pour essayer de trouver une parade, mais le problème reste toujours entier.
On part du principe pour l'exemple que les fichiers A et B se trouvent dans le même dossier..... ce qui n'est pas le cas dans la réalité

Code du fichier maitre
Private Sub Workbook_Open()
frm_maitre.Show
End Sub

Le userform du fichier maitre ne comprend qu'un seul bouton permettant d'appeler le fichier esclave
Private Sub Cde_bouton_maitre_Click()
folder = ActiveWorkbook.Path & "\"
file = "classeur esclave.xlsm"
Workbooks.Open folder & file
MsgBox "je suis de retour au fichier maître"
End Sub



Code du fichier Esclave
Private Sub Workbook_Open()
Frm_esclave.Show
End Sub

Le userform ne comprend qu'un seul bouton permettant de quitter ce fichier et revenir au maitre
Private Sub Cde_retour_esclave_Click()
repert = ActiveWorkbook.Path & "\"
ThisWorkbook.Close
End Sub





Merci d'avance de l'aide que vous pourrez m'apporter.
Alain
 

Pièces jointes

  • Classeur esclave.xlsm
    13 KB · Affichages: 11
  • Classeur maitre.xlsm
    16.4 KB · Affichages: 8

Dudu2

XLDnaute Barbatruc
Bonjour,

Ton truc est infernal. Je ne sais pas pourquoi ça fait ça. Excel est paumé dans le rattachement des UserForms aux classeurs.

De plus en fermant (ThisWorkbook.Close) l'esclave on ne déclenche même pas l'évènement Workbook_Activate du maître qui se ré-active et ça, ça me dépasse totalement. J'ai dû envoyer un Alt + F4 (***) sur l'esclave pour le fermer et activer l'évènement Workbook_Activate du maître se déclenche enfin quand il reprend le contrôle.

(***) Avec un SendKeys sans attendre son interception avec un DoEvents pour que le Unload du UserForm puisse se faire avant.
 

Pièces jointes

  • Classeur esclave.xlsm
    14.9 KB · Affichages: 7
  • Classeur maitre.xlsm
    17.3 KB · Affichages: 5

Alain BIMBAUD

XLDnaute Nouveau
Bonjour,
Je viens d'essayer.... et cela fonctionne.
Je l'essaierai lundi sur mes applications réelles.
Je vous tiens au courant.

Encore merci d'avoir trouver une solution.
Cordialement
Alain
Bonjour, Je viens de mettre votre solution sur mon application et cela ne fonctionne pas. A priori j'ai trouvé la raison.
C'est parce que la plupart des fichiers esclaves ouvrent un fichier excel de données.
Je viens d'essayer sur le fichier esclave de test en rajoutant une ouverture de fichier (fichier donnees.xls) et effectivement le problème se produit ==> pas de retour.

DANS LE FICHIER ESCLAVE
Private Sub Workbook_Open()
repert = ActiveWorkbook.Path & "\"
Workbooks.Open Filename:=repert & "fichier données.xlsx"

Frm_esclave.Show
End Sub

Et même si je ferme le fichier de données dans le fichier esclave avant l'instruction "create...." le retour ne se fait pas non plus!

Il faut savoir que l'application esclave va ouvrir et fermer des fichiers au gré du besoin.

Private Sub Cde_retour_esclave_Click()
repert = ActiveWorkbook.Path & "\"
Workbooks("fichier données.xlsx").Close


CreateObject("wscript.shell").SendKeys "%{F4}"
Unload Me
End Sub

Encore merci pour votre temps passé a essayer de trouver une solution.

Cordialement
Alain
 

Pièces jointes

  • fichier données.xlsx
    7.9 KB · Affichages: 2
  • Classeur esclave.xlsm
    16.1 KB · Affichages: 2

Alain BIMBAUD

XLDnaute Nouveau
Ok, mais au final je n'ai pas compris si tu as résolu le problème.
Ça fonctionne ou pas ?
Cela ne fonctionne pas dans mon application, car comme je te l'ai indiqué, le fichier esclave ouvre au gré du besoin d'autres fichiers excel.... et donc dans ce cas là le retour au fichier maître ne fonctionne pas.
Le fichier esclave que je t'ai ré-envoyé comprend l'ouverture d'un fichier excel et sa fermeture a lieu juste avant le retour au fichier maître. Le code s'arrête et ne fait pas le retour.
 

Dudu2

XLDnaute Barbatruc
En fait la fermeture du fichier de données ferme le UserForm ouvert par le Classeur esclave et donc les instructions suivantes du bouton de ce UserForm ne sont pas exécutées.
Excel associe le ou les UserForms ouverts au dernier fichier Excel ouvert.
En fermant ce dernier fichier ouvert, on ferme le ou les UserForms actifs.

Pour exécuter les instructions du UserForm après la fermeture du fichier de données, il faut je suppose des désynchroniser avec un OnTime.
 

Dudu2

XLDnaute Barbatruc
Franchement je sais pas ce que tu veux faire avec ça, avec un UserForm Modal sur ton fichier de données issu d'un classeur précédent.
Ça me parait bizarre, mais c'est toi qui vois.
 

Pièces jointes

  • Classeur esclave.xlsm
    16.6 KB · Affichages: 0

Alain BIMBAUD

XLDnaute Nouveau
Franchement je sais pas ce que tu veux faire avec ça, avec un UserForm Modal sur ton fichier de données issu d'un classeur précédent.
Ça me parait bizarre, mais c'est toi qui vois.
J'ai trouvé une solution toute simple .
Avant d'ouvrir un fichier esclave, on ouvre une nouvelle application excel comme ci-dessous.
Mon application fonctionne maintenant avec tous mes fichiers esclaves ainsi que le retour au fichier maitre.

Application.visible = false ' L'application maître va être rendue invisible pour ne plus voir ' l'application maitre à l'écran
Dim App As Excel.Application
Set App = New Excel.Application 'ouverture d'une nouvelle application
App.Visible = True '..... visible
App.WindowState = xlMaximized ' ...; et plein écran

folder = ActiveWorkbook.Path & "\"
file = "classeur esclave1.xlsm"
App.Workbooks.Open folder & file ' ouverture fichier esclave

'Retour sur l'application maître
Application.visible = true ' application maitre redevient visible
MsgBox "je suis de retour"

En tout cas, je te remercie de ton aide
 

Discussions similaires