マクロ内のExcelの他のインスタンスの検索(Microsoft Excel)
Excelの特定のインスタンス内からVBAプログラムを実行する場合は、Excelの他のインスタンスを作成し、新しく作成したインスタンスでブックを開いて変更してから、それらのインスタンスを閉じることができます。ただし、マクロ内で、Excelの他のインスタンスが既に実行されているかどうかを判断し、実行されている場合は、それらのインスタンスを制御する方法について疑問に思われるかもしれません。
これを行うには、いくつかの方法があります。実行中のExcelのインスタンスの数を知りたいだけの場合は、WindowsAPIを利用するマクロを使用できます。次の関数はこのアプローチを実装します:
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
このコードは、ExcelMVPのStephenBullenによって開発されました。明らかに、Excelの個々のインスタンスにアクセスすることはできません。開いているインスタンスの数のカウントのみを返します。インスタンスを使用するコードを開発する場合は、WindowsAPIに依存する必要はありません。代わりに、次のようなコードを使用して、Excelのインスタンスが開いているかどうかを確認できます。
Dim xlApp As Excel.Application Set xlApp = GetObject(, "Excel.Application")
インスタンスが実行されている場合は、xlAppオブジェクトを使用してインスタンスにアクセスできます。インスタンスが実行されていない場合は、実行時エラーが発生します。 GetObject関数は、読み込まれたExcelの最初のインスタンスを取得します。他の人にアクセスするには、その1つを閉じてから、GetObjectを再試行して次の1つを取得します。
xlAppをExcelの特定のインスタンスに設定する場合、そのインスタンスで開いているブックの名前がわかっていれば、次のように設定できます。
Dim xlApp As Excel.Application Set xlApp = GetObject("ExampleBook").Application
注:
このページ(または_ExcelTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。
link:/ excelribbon-ExcelTipsMacros [ここをクリックして、新しいブラウザタブでその特別なページを開きます]
。
_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。
このヒント(9451)は、Microsoft Excel 97、2000、2002、および2003に適用されます。Excel(Excel 2007以降)のリボンインターフェイス用のこのヒントのバージョンは、次の場所にあります。
link:/ excelribbon-Finding_Other_Instances_of_Excel_in_a_Macro [マクロ内のExcelの他のインスタンスの検索]
。