Dans cet article, vous apprendrez pourquoi travailler (ou pas) avec des différentes instances d'Excel et comment on peut gérer les instances dans VBA…
Qu'est-ce qu'une "instance" d'Excel?
Une "instance" d'Excel est une notion qui peut paraitre un peu abstraite. En fait, à chaque fois que vous ouvrez Excel (ici, on parle d'ouverture de logiciel, pas d'ouverture d'un fichier Excel), une nouvelle instance est créé. L'instance n'a pas de lien direct avec les fichiers ouverts et le nombre d'instances d'Excel ne correspond pas au nombre de fichiers.
Cette notion est plus importante pour un développeur en VBA que pour un utilisateur qui souvent ne remarquera pas s'il travaille avec une ou plusieurs instances (et il n'a d'ailleurs pas besoin de le savoir).
Généralement, l'utilisateur utilise une seule instance avec un certain nombre de fichiers ouverts dans cette instance. Une instance Excel peut contenir un, deux, cinq mais aussi zéro fichier ouverts.
Pourquoi vouloir travailler avec une nouvelle instance d'Excel?
Travailler avec plusieurs instances d'Excel a plusieurs avantages, notamment:
- La possibilité de lancer des procédures VBA séparément et en parallèle – par exemple: Classeur_1 dans Instance_1 ouvre dans une nouvelle instance (Instance_2) un Classeur (Classeur_2) qui contient du code dans l'événement
Workbook_Open
. Ainsi, le procédure dans le Classeur_1 continue à tourner après l'ouverture du Classeur_2. Et, parallèlement, la procédure lancée dansWorkbook_Open
du Classeur_2 peut tourner dans l'Instance_2 indépendamment du Classeur_1. - Si, pour une raison ou une autre une instance "plante" ou son code VBA est bloqué (par ex. par une itération infinie), les autres instances restent opérationnelles Vous ne perdez pas votre travail et vous ne perdez pas le temps à devoir rouvrir tous les fichiers qui étaient ouverts…
- Il est possible d'avoir plusieurs fichiers avec le même nom ouverts en même temps (chaque fichier dans une instance séparée). Cela peut servir notamment pour faire des comparaisons entre des fichiers (par exemple entre des versions différentes d'un même Classeur). Par comparaison, ceci n'est pas possible à l'intérieur d'une seule instance – dans une instance, chaque fichier ouvert doit avoir un nom différent.
Il est donc relativement intéressant d'utiliser différentes instances pour un utilisateur intensif ou pour des procédures qui permettent/nécessitent de fonctionner simultanément.
Le prix à payer pour ces avantages est l'utilisation plus importante de la mémoire de l'ordinateur (ce qui peut ralentir les autres applications) et une gestion de code VBA plus complexe au cas où les différentes instances séparées doivent communiquer entre elles. Cependant, ces deux cas ne concernent que des applications vraiment complexes et seuls les experts en VBA pourraient en être impactés.
Si vous souhaitez ouvrir une nouvelle instance d'Excel directement dans Excel sans devoir passer par VBA, suivez les instructions de ce tutoriel: Ouvrir plusieurs instances d’Excel (2013, 2016, 2019 et 365)
Code VBA: Ouvrir un Classeur dans une nouvelle instance d'Excel
Et voici le code VBA qui vous permettra d'ouvrir un Classeur dans une instance séparée. Comme vous pouvez le constater, avant d'ouvrir un Classeur Excel, on crée un nouvel objet (objExcel
qui est une nouvelle instance de l' Application.Excel
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Sub OvrirClasseurDansNouvelleInstanceExcel() 'par: https://excel-malin.com On Error GoTo Erreur 'définitions des variables Dim MonClasseur As String Dim objExcel As Excel.Application Set objExcel = CreateObject("Excel.Application") 'définition du Classeur à ouvrir MonClasseur = "C:\Test\ClasseurTest.xlsm" 'ouverture du Classeur dans une nouvelle instance d'Excel objExcel.Workbooks.Open Filename:=MonClasseur objExcel.Visible = True Exit Sub Erreur: MsgBox "Une erreur est survenue..."<span data-mce-type="bookmark" style="display: inline-block; width: 0px; overflow: hidden; line-height: 0;" class="mce_SELRES_start"></span> End Sub |
Explications concernant ce code VBA
L'idée est de créer un nouveau Object
qui est défini comme Application / Excel. On ouvre le Classeur déterminé à l'intérieur de ce nouveau Object
.
Il est également possible de créer la nouvelle instance d'Excel en mode caché (l'utilisateur ne verra pas qu'une nouvelle instance a été créée). Pour cela, l'instruction objExcel.Visible
doit être égale à False
.
Pour aller plus loin en VBA
Et pour terminer, une petite sélection des articles sur VBA qui pourraient vous être utiles…
- Liste de toutes les fonctions VBA
- Manipulation des fichiers en VBA
- Comment débloquer VBA dans les fichiers provenant d'internet
- Cours VBA gratuit en ligne: "VBA: Droit au but"
- Utiliser RECHERCHEV et d'autres fonctions Excel directement dans VBA
- et pour s'inspirer de ce qui est possible en VBA… Les outils Excel/VBA à télécharger gratuitement
9 commentaires sur “VBA: Ouvrir un Classeur dans une nouvelle instance d’Excel”
Bonjour,
Je me suis servie de ce code pour gérer des problèmes de mémoire. Néanmoins, quand je ferme un classeur sur une autre instance, Excel reste ouvert. Je voudrais savoir comment fermer une instance en VBA Excel. Si vous avez une idée, elle serait la bienvenue !
Bonjour Madame (Mademoiselle?),
la solution est heureusement très simple. Pour fermer une instance d'Excel, il faut utiliser la propriété
.Quit
de l'Objet (= instance) approprié.1) Si vous voulez fermer l'instance crée par le code sur cette page, vous devez ajouter la ligne
objExcel.Quit
à l'endroit ou l'instance doit se fermer (donc je supposes après la fermeture du fichier).2) Si vous voulez fermer l'instance originale en laissant la nouvelle instance ouverte, il faut la ligne suivante
Application.Quit
3) Si vous voulez fermer Excel complètement, vous devez utiliser les deux instructions consécutivement (et commencer par la nouvelle instance). Le code à ajouter serait donc:
objExcel.Quit
Application.Quit
J'espère que ceci répond à votre question.
Cordialement,
Martin Hudec
Bonjour,
Est il possible d'ouvrir ce classeur dans le même fichier sur lequel est le code vba?
Il ouvre une nouvelle instance si d'autre classeur son ouvert? mais également reste séparé si d'autre fichier excel son ouvert?
merci 🙂
Bonjour,
ce code crée une toute nouvelle instance Excel qui est séparée du tout: du fichier qui contient ce code et de tous les autres fichiers Excel ouverts.
Bonjour,
j ai un bouton sur un fichier1.xlsm qui ouvre un autre fichier2.xlsm dans une nouvelle instance, cela fonctionne parfaitement, sauf que je reste sur fichier1 je souhaiterai basculer sur le fichier2 quand je clic sur le bouton
Merci
Bonjour Stéphane,
malheureusement, même si cela peut sembler très simple, je n'ai pas trouvé de solution. Normalement, les instances ne communiquent pas entre elles. Vous pouvez créer une instance mais communiquer avec, c'est tout autre chose.
J'ai pu "googler" quelques codes qui permettent de récupérer une information qui se trouve dans un fichier dans une autre instance mais je n'ai trouvé aucun code qui permettrait de "activer" l'autre instance.
Cordialement, Martin
Martin,
Merci de votre réponse,
j ai essayé ceci et cela fonctionne avec: AppActivate voir derniere ligne
Sub OuvrirCompteurEauDansNouvelleInstance()
On Error GoTo Erreur
'définitions des variables *** objExcel : Nom de la nouvelle instance
Dim MonClasseur As String
Dim objExcel As Excel.Application
Set objExcel = CreateObject("Excel.Application")
'définition du Classeur à ouvrir
MonClasseur = lien1 + "Application Nickelage S1\Appli EXCEL\RELEVE_Compteur_eau.xlsm"
'ouverture du Classeur dans une nouvelle instance d'Excel
objExcel.Workbooks.Open Filename:=MonClasseur
objExcel.Visible = True
AppActivate "RELEVE_Compteur_eau.xlsm"
Exit Sub
Erreur:
MsgBox "Une erreur est survenue…"
End Sub
Bonjour, Est-il possible d'utliser InputBox avec un type 8 (Sélection d'un range) à partir d'un classeur et la sélection sur un classeur ouvert par une autre instance?
Bonjour Matthieu,
bonne nouvelle: oui, c'est possible.
A la place de "Application" dans
Application.InputBox()
, vous devez utiliser l'objet représentant la nouvelle instance (dans mon article, il s'agit deobjExcel
.Le code ressemblera alors à ceci:
Il va prendre la valeur de la cellule choisie dans "l'autre instance" et la placer dans la cellule A1 de la première feuille d fichier où se trouve le code (= qui se situe dans l'instance de départ).
J'espère que cela va vous aider! Martin