は私は知りませんが、私は(謝罪が、私はこれ以上言及していない)多くの衛星前にウェブからいくつかのコードを取り、それを修正しましたすべてのExcelインスタンスですべてのワークブックを取得するために使用します。
あなたや他の人には役に立つかもしれません。 APIは32ビット用に宣言されているため、必要に応じてAPIを変更する必要があります。
Option Explicit
Private 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
Private Declare Function AccessibleObjectFromWindow Lib "oleacc" _
(ByVal hWnd As Long, ByVal dwId As Long, ByRef riid As GUID, _
ByRef ppvObject As Object) As Long
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type
Public Sub RunMe()
Dim bks As Collection
Set bks = GetAllWorkbooks
MsgBox bks.Count
End Sub
Private Function GetAllWorkbooks() As Collection
Dim id As GUID
Dim hWnd As Long
Dim hDesk As Long
Dim hXL As Long
Dim obj As Object
Dim app As Application
Dim wb As Workbook
Set GetAllWorkbooks = New Collection
'Define GUID values
'hard codes IDispatch {00020400-0000-0000-C000-000000000046}
With id
.Data1 = 132096
.Data4(0) = 192
.Data4(7) = 70
End With
'Loop through excel window handles to find applications
hWnd = FindWindowEx(0&, 0&, "XLMAIN", vbNullString)
Do While hWnd > 0
hDesk = FindWindowEx(hWnd, 0&, "XLDESK", vbNullString)
hXL = FindWindowEx(hDesk, 0&, "EXCEL7", vbNullString)
If AccessibleObjectFromWindow(hXL, &HFFFFFFF0, id, obj) = &H0 Then
'Populate return collection with the workbooks
Set app = obj.Application
For Each wb In app.Workbooks
GetAllWorkbooks.Add wb
Next
End If
hWnd = FindWindowEx(0&, hWnd, "XLMAIN", vbNullString)
Loop
End Function
これを実行するといくつのブックが開かれましたか? – newguy
問題のタイプミスでなければ、 'counts'ではなく' MsgBox(workbooks.count) 'でなければなりません。 – Mrig
私は 'For Each wb in Application.Workbooks .... Next'ループを使用することをお勧めします。オープンした回数は関係ありませんので、すべてループします。また、すべてのブックが同じExcelインスタンスで開かれているか、別のExcelインスタンスで開かれているかによって異なる場合があります。各ワークブックに「Excel.exe」プロセスがある場合(タスクマネージャにチェック)、各ワークブックはExcelの独自の「コピー」で開きます。これにより、1つのワークブック(インスタンス内)がカウントされます。 – Dave