Le fichier à télécharger contient:
Principe:
Versions:
- Le Module_MergeExcelInstances,
- Le Module_LockProcess,
- Le Module_SettingPerso,
- La Class_MergeExcelInstancesAppli,
qui gèrent la fusion des instances Excel.
Le fichier est à installer comme in Complément (AddIn) Excel et gère automatiquement la fusion des instances.
Les 3 Modules et le Module de Classe peuvent être intégrés dans un Projet VBA Complément (AddIn).
Il faudra juste modifier la constante de compilation STANDALONE_ADDIN_MODULE:
VB:
#Const STANDALONE_ADDIN_MODULE = True
'#Const STANDALONE_ADDIN_MODULE = False
'----------------------------
'Opening a new Excel Instance (an AddIn is open only once per Instance)
'----------------------------
#If STANDALONE_ADDIN_MODULE Then
'Direct Call by Excel
Sub Auto_Open()
#Else
'Must be called by the AddIn Auto_Open() function of the hosting VBA Project
Sub MergeExcelInstancesOpen()
#End If
Note: Voir toutes mes ressources -> https://excel-downloads.com/resources/?creator_id=268468
Principe:
Lors de l'ouverture d'un deuxième classeur ou plus, Excel regroupe les classeurs en une seule instance ou créé différentes instances en fonction de critères seulement connus d'Excel pouvant être la source du fichier Excel ou d'autres éléments.
Cela a été initialement conçu pour les applications Office 32 bits limitées à 3 Go de mémoire pour permettre de gérer plusieurs classeurs volumineux.
Mais la multiplication des instances pose problème lorsqu'une Macro doit, par exemple, avoir une visibilité sur tous les classeurs ouverts ou permettre l'utilisation du collage spécial, la liaison entre différents fichiers, la copie de grandes quantités de données, etc...
Ce code, installé en tant que Complément, permet de détecter la création d'une instance #2 et de la fusionner dans l'instance #1.
S'il y a plusieurs instances créées successivement dont la création est détectée, le processus de fusion est sérialisé, chacune devenant l'instance #2 après avoir attendu son tour.
-> Le(s) classeur(s) de l'instance #2 sont fermés (sans enregistrement, ils viennent juste d'être ouverts) .
-> L' instance #2 est arrêtée.
-> Tous les classeurs fermés sont ré-ouverts dans l'instance #1.
Ce processus est relativement rapide et n'a que peu d'effet visuel.
Dans le cas ou plusieurs instances sont créées simultanément, toutes les instances additionnelles sont traitées ensembles comme l'est l'instance #2 dans le cas ci-dessus.
Noter qu'à l'ouverture d'un classeur, Excel crée toujours une nouvelle instance temporaire.
Excel fusionnera normalement (*) cette nouvelle instance temporaire avec la dernière créée.
Dans le cas contraire Excel en fera une instance indépendante candidate pour le processus de fusion de cette Macro.
L'instance temporaire n'est pas détectée comme instance par la macro car la détection des instances attend qu'Excel ait terminé son processus de lancement et décidé du sort de l'instance temporaire (*).
(*) Dépend de:
1 - Le choix d'Excel de fusionner ou non les instances (critères onconnus).
2 - La clé de registre HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Excel\Options\DisableMergeInstance
Voir -> https://learn.microsoft.com/en-us/office/troubleshoot/excel/force-excel-to-open-new-instance
Mise en œuvre très simple:- Enregistrer le fichier en tant que Complément (AddIn) d'extension .xlam et l'activer (Options / Compléments / Atteindre / Cocher la case correspondante).
- Fermer tous les classeurs (pour être sûr de ne démarrer qu'avec une seule Instance qui doit être identifiée par la Macro).
- V1 - Initiale
- V2 - Correction déclaration API non VBA7
- V3 - Remplacement du mécanisme de boucle de surveillance des instances par un artifice sur l'évènement Application.WindowResize() pour provoquer la fusion des instances par l'instance #1.
Gestion de la création d'instances multiples simultanées. - V4 - Fermeture des instances résiduelles actives persistantes sans classeur à la création d'une ou plusieurs instances simultanées et modif du nettoyage de la dernière instance si elle persiste après la désactivation du dernier classeur.