2016-06-28 15 views
0

開いているワークブックの正しい数を数えることに問題があります。VBA - ブックの数を取得するエラー

具体的には、私のデータベースには非常に優れたファイルがあります。私はソフトウェアから他のデータ(スポーツ結果)を持っており、それらをエクスポートします。だから私は自分のデータベースを開いて、数十の他のワークブック( "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 
関連する問題