Si ejecuta un programa VBA desde una instancia particular de Excel, puede crear otras instancias de Excel, abrir y modificar libros de trabajo en las instancias recién creadas y luego cerrar esas instancias. Sin embargo, puede que se pregunte cómo puede determinar, dentro de una macro, si ya se están ejecutando otras instancias de Excel y, de ser así, tomar el control de esas instancias.

Hay varias formas de hacerlo. Si simplemente desea saber cuántas instancias de Excel se están ejecutando, puede usar una macro que haga uso de la API de Windows. La siguiente función implementa este enfoque:

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

Este código fue desarrollado por el MVP de Excel Stephen Bullen y se puede encontrar en este sitio:

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

Esto, obviamente, no le permitirá acceder a las instancias individuales de Excel; solo devuelve un recuento del número de instancias abiertas. Si desea desarrollar código para usar las instancias, no necesita depender de la API de Windows. En su lugar, puede utilizar un código como el siguiente para determinar si una instancia de Excel está abierta:

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

Si se está ejecutando una instancia, puede acceder a ella mediante el objeto xlApp. Si una instancia no se está ejecutando, obtendrá un error de tiempo de ejecución. La función GetObject obtiene la primera instancia de Excel que se cargó. Para acceder a otros, puedes cerrar ese y luego intentar GetObject nuevamente para obtener el siguiente, etc.

Si desea configurar la xlApp en una instancia particular de Excel, puede hacerlo si conoce el nombre de un libro abierto en esa instancia:

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

_Nota: _

Si desea saber cómo usar las macros descritas en esta página (o en cualquier otra página de los sitios ExcelTips), he preparado una página especial que incluye información útil.

link: / excelribbon-ExcelTipsMacros [Haga clic aquí para abrir esa página especial en una nueva pestaña del navegador].

ExcelTips es su fuente de formación rentable en Microsoft Excel.

Este consejo (9452) se aplica a Microsoft Excel 2007, 2010 y 2013. Puede encontrar una versión de este consejo para la interfaz de menú anterior de Excel aquí:

link: / excel-Finding_Other_Instances_of_Excel_in_a_Macro [Encontrar otras instancias de Excel en una macro].