اگر یک برنامه VBA را از داخل یک نمونه خاص از اکسل اجرا می کنید، می توانید نمونه های دیگری از اکسل ایجاد کنید، کتاب های کار را در نمونه های تازه ایجاد شده باز کرده و تغییر دهید، و سپس آن نمونه ها را ببندید. با این حال، ممکن است تعجب کنید که چگونه میتوانید در یک ماکرو تعیین کنید که آیا نمونههای دیگر اکسل قبلاً در حال اجرا هستند یا خیر، و اگر چنین است، کنترل آن نمونهها را در دست بگیرید.
چند راه برای انجام این کار وجود دارد. اگر به سادگی می خواهید بدانید که چند نمونه از اکسل در حال اجرا هستند، می توانید از یک ماکرو استفاده کنید که از API ویندوز استفاده می کند. تابع زیر این رویکرد را پیاده سازی می کند:
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 weve found them all
Loop Until hWndXL = 0
End Function
این کد توسط Excel MVP Stephen Bullen توسعه یافته است و در این سایت قابل مشاهده است:
http://www.officekb.com/Uwe/Forum.aspx/excel-prog/55941
بدیهی است که این به شما امکان دسترسی به نمونه های جداگانه اکسل را نمی دهد. فقط تعدادی از نمونه های باز را برمی گرداند. اگر میخواهید کدی را برای استفاده از نمونهها توسعه دهید، نیازی نیست به API ویندوز تکیه کنید. در عوض میتوانید از کدهایی مانند زیر برای تعیین باز بودن نمونهای از اکسل استفاده کنید:
Dim xlApp As Excel.Application
Set xlApp = GetObject(, "Excel.Application")
اگر یک نمونه در حال اجرا است، می توانید با استفاده از شی xlApp به آن دسترسی داشته باشید. اگر یک نمونه در حال اجرا نباشد، با خطای زمان اجرا مواجه خواهید شد. تابع GetObject اولین نمونه اکسل را دریافت می کند که بارگذاری شده است. برای دسترسی به دیگران، می توانید آن یکی را ببندید و سپس دوباره GetObject را امتحان کنید تا مورد بعدی و غیره را دریافت کنید.
اگر میخواهید xlApp را روی یک نمونه خاص از اکسل تنظیم کنید، اگر نام یک کتاب کار باز را در آن نمونه میدانید، میتوانید این کار را انجام دهید:
Dim xlApp As Excel.Application
Set xlApp = GetObject("ExampleBook.xlsx").Application