Si vous exécutez un programme VBA à partir d’une instance particulière d’Excel, vous pouvez créer d’autres instances d’Excel, ouvrir et modifier des classeurs dans les instances nouvellement créées, puis fermer ces instances. Cependant, vous pouvez vous demander comment vous pouvez déterminer, dans une macro, si d’autres instances d’Excel sont déjà en cours d’exécution et, le cas échéant, prendre le contrôle de ces instances.

Il y a plusieurs façons de procéder. Si vous souhaitez simplement savoir combien d’instances d’Excel sont en cours d’exécution, vous pouvez utiliser une macro qui utilise l’API Windows. La fonction suivante met en œuvre cette approche:

Public Declare Function GetDesktopWindow Lib "user32" () As Long Public Declare Function FindWindowEx Lib "user32" Alias _   "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

Function ExcelInstances() As Long     Dim hWndDesk As Long     Dim hWndXL As Long

'Get a handle to the desktop     hWndDesk = GetDesktopWindow

Do         'Get the next Excel window         hWndXL = FindWindowEx(GetDesktopWindow, hWndXL, _           "XLMAIN", vbNullString)



'If we got one, increment the count         If hWndXL > 0 Then             ExcelInstances = ExcelInstances + 1         End If

'Loop until we've found them all     Loop Until hWndXL = 0 End Function

Ce code a été développé par Excel MVP Stephen Bullen et peut être trouvé sur ce site:

http://www.officekb.com/Uwe/Forum.aspx/excel-prog/55941

Ceci, évidemment, ne vous permettra pas d’accéder aux instances individuelles d’Excel; il ne renvoie qu’un décompte du nombre d’instances ouvertes. Si vous souhaitez développer du code pour utiliser les instances, vous n’avez pas besoin de vous fier à l’API Windows. Vous pouvez, à la place, utiliser un code tel que celui-ci pour déterminer si une instance d’Excel est ouverte:

Dim xlApp As Excel.Application Set xlApp = GetObject(, "Excel.Application")

Si une instance est en cours d’exécution, vous pouvez y accéder à l’aide de l’objet xlApp. Si une instance n’est pas en cours d’exécution, vous obtiendrez une erreur d’exécution. La fonction GetObject obtient la première instance d’Excel qui a été chargée. Pour accéder aux autres, vous pouvez fermer celui-ci, puis réessayer GetObject pour obtenir le suivant, etc.

Si vous souhaitez définir la xlApp sur une instance particulière d’Excel, vous pouvez le faire si vous connaissez le nom d’un classeur ouvert dans cette instance:

Dim xlApp As Excel.Application Set xlApp = GetObject("ExampleBook.xlsx").Application

_Note: _

Si vous souhaitez savoir comment utiliser les macros décrites sur cette page (ou sur toute autre page des sites ExcelTips), j’ai préparé une page spéciale qui comprend des informations utiles.

lien: / excelribbon-ExcelTipsMacros [Cliquez ici pour ouvrir cette page spéciale dans un nouvel onglet de navigateur].

ExcelTips est votre source pour une formation Microsoft Excel rentable.

Cette astuce (9452) s’applique à Microsoft Excel 2007, 2010 et 2013. Vous pouvez trouver une version de cette astuce pour l’ancienne interface de menu d’Excel ici:

link: / excel-Finding_Other_Instances_of_Excel_in_a_Macro [Recherche d’autres instances d’Excel dans une macro].