XL 2016 Ouvrir un classeur, fermer le classeur d'origine puis exécuter du code

mykid

XLDnaute Nouveau
Bonjour à tous,
Mon classeur A doit ouvrir un classeur B, et y exécuter du code.
En l'état cela fonctionne, tant que je maintiens A ouvert je peux faire ce que je veux avec B, sauf que A étant assez volumineux, il ralenti fortement mon classeur B.
J'aimerais donc que classeur A se ferme gentiment pour laisser sa place à classeur B qui une fois qu'il aura gentiment fini son travail, ouvre classeur A.
Mais bien sur en toute logique quand on ferme classeur A toute procédure qui y a été initialement exécutée s'interrompt, m'obligeant à maintenir ouvert mon classeur A.
J'ai essayé de contourner cela en passant par Workbook_Open() de mon classeur B, pensant que le code s’exécuterait depuis B même après fermeture de A, mais cela ne fonctionne pas.

Auriez-vous une idée, SVP ??
En espérant avoir été assez clair, et en vous remerciant par avance...

Myka
 
Solution
Bonjour,
Je ne sais pas ce qui t'amène à conclure que le code du Workbook_Open() de B ne fonctionne pas.
Mais ce n'est pas vrai, le code du Workbook_Open() de B DOIT s'exécuter.

Par contre, dans mes essais, j'ai remarqué que tant que le code du Workbook_Open() de B n'est pas terminé, le Workbook A ne se ferme pas, bien que sa fermeture soit demandée juste après la demande d'ouverture du Workbook B.
VB:
Set Workbook_B = Workbooks.Open(Filename:=WBFullName) 
ThisWorkbook.Close

Le seule méthode que j'ai trouvée pour que le Workbook A se ferme, c'est dans le Workbook_Open() de B, de déclencher le traitement qu'on attend de lui de manière asynchrone.
VB:
Private Sub Workbook_Open()
    Application.OnTime Now, "Proceed"
End Sub
Et...

Dudu2

XLDnaute Barbatruc
Bonjour,
Je ne sais pas ce qui t'amène à conclure que le code du Workbook_Open() de B ne fonctionne pas.
Mais ce n'est pas vrai, le code du Workbook_Open() de B DOIT s'exécuter.

Par contre, dans mes essais, j'ai remarqué que tant que le code du Workbook_Open() de B n'est pas terminé, le Workbook A ne se ferme pas, bien que sa fermeture soit demandée juste après la demande d'ouverture du Workbook B.
VB:
Set Workbook_B = Workbooks.Open(Filename:=WBFullName) 
ThisWorkbook.Close

Le seule méthode que j'ai trouvée pour que le Workbook A se ferme, c'est dans le Workbook_Open() de B, de déclencher le traitement qu'on attend de lui de manière asynchrone.
VB:
Private Sub Workbook_Open()
    Application.OnTime Now, "Proceed"
End Sub
Et dans un Module indépendant:
VB:
Sub Proceed()
    .../... Traitement à faire
End Sub

Les 2 classeurs joints illustrent cette méthode de Workbook A -> Workbook B.

Pour toi, le problème sera le même au retour sur le Workbook A en provenance du Workbook B pour que le Workbook B se ferme. Sauf qu'il va falloir en plus que tu différencies l'ouverture initiale du Workbook A du retour de Workbook B si ton process en a besoin.

Pour info, et c'est illustré dans les 2 classeurs joints, la seule méthode que j'ai trouvée pour identifier l'appel d'un classeur par un autre est d'utiliser un Contrôle de formulaire (ex. un bouton) dans le classeur source dont le nom sera poussé par Excel dans le Application.Caller du classeur cible. Ça ne marche pas avec un contrôle Active X comme dans tous les autres cas où le VarType(Application.Caller) = 10 soit Erreur.

Sinon, il va falloir passer par un indicateur qui peut être soit une valeur de cellule soit un fichier (texte) extérieur ou tout autre artifice.
 

Pièces jointes

  • VBA Classeur appelant.xlsm
    23 KB · Affichages: 5
  • VBA Classeur appelé.xlsm
    16.6 KB · Affichages: 3
Dernière édition:

mykid

XLDnaute Nouveau
Formidable, un énorme merci ! Ce qui m'a sauvé c'est
Application.OnTime Now, "Proceed"
car sans cela, dès que l'on ferme le classeur A, la procédure Open de B s'arrête.
Encore merci pour le temps que tu as passé à faire ces deux classeurs de test, c'est fortement apprécié :)
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 902
Membres
101 834
dernier inscrit
Jeremy06510