여전히 관심이 있지만 내가 (사과, 나는 더 이상 언급이없는) 많은 달 전에 웹에서 일부 코드를 가져다가 그것을 수정 한 경우 나도 몰라 모든 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