2016-06-28 2 views
0

열린 통합 문서의 개수를 계산하는 데 문제가 있습니다.VBA - 통합 문서 수를 가져 오는 중 오류가 발생했습니다.

구체적으로 말하자면, 필자의 데이터베이스에는 큰 Excel 파일이 있습니다. 나는 소프트웨어의 다른 데이터 (스포츠 결과)를 가지고 있으며, 나는 그들을 내 보낸다. 그래서 나는 데이터베이스를 열었고 수십개의 다른 통합 문서 ("Workbook1", "Workbook2", ...)가 토너먼트마다 하나의 통합 문서와 함께 있습니다.

내 최종 목표는 통합 문서로 통합 문서를 copy/paste 내 데이터베이스의 데이터로 루프하는 것입니다. 그러나 MsgBox(workbooks.counts)을 사용하면 "1"만 반환됩니다.

이유가 궁금하십니까? 내가 뭘 놓치고 있니? 사전에

감사합니다,

+0

이것을 실행할 때 몇 개의 통합 문서가 열렸습니까? – newguy

+0

질문에 오타가 없다면'counts가 아니라'MsgBox (workbooks.count) 여야합니다. – Mrig

+0

'For Each wb in Application.Workbooks .... Next' 루프를 사용하면 얼마나 많은 사람이 열렸는지 상관없이 모두 반복 할 수 있습니다. 또한 모든 통합 문서가 동일한 Excel 인스턴스에서 열렸는지 아니면 별도의 Excel 인스턴스에서 열리는 지에 따라 달라질 수 있습니다. 각 통합 문서에 대해 'Excel.exe' 프로세스가있는 경우 (작업 관리자 선택), 각 통합 문서는 Excel의 자체 "복사"에서 열리 며 인스턴스에 1 개의 통합 문서가 제공됩니다. – Dave

답변

0

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