2016-03-28 6 views
0

この質問は基本的にすべてのExcelブックのすべてのブックをループすることに関するものです。複数のExcelインスタンスが実行されているときにすべてのブック名を取得

+0

それぞれを開くときに配列を作成し、ワークブックを保存しますか?また、ループの代わりに後で検索を高速化するために辞書でキーを設定することもできます。 – findwindow

+0

これは役に立ちますか? http://www.ozgrid.com/forum/showthread.php?t=182853 –

+1

あなたはただ一つしか手に入れません...あなたは 'Excel'プロセスをループしていますが、***では何もしません。彼らはかつて見つかった。あなたは 'ExcelApplication'の新しいオブジェクトを作成し、デフォルトでは** 1 **ワークブックです。これはあなたがたった1本の本を見た理由です... – Codexer

答えて

1

あなたが直面している主な問題は、あなたが遭遇したプロセスのいずれも使用していないということです。したがって、あなたはそのようなものを手に入れません。プロセスのループ内で、ExcelApplicationという新しいインスタンスを作成し、Workbooksをループしてみます。これを行うと、デフォルトであなただけの Workbookを取得し、また、なぜあなたがしか Workbookが表示されますので、なぜ、唯一、その時点で存在しています。

(テスト済み&をしようとしました)ソリューション

あなたが必要なものを取得するために呼び出すのWindows APIを検討する必要があります。それらのいくつかは以下のとおりです。

  1. GetDesktopWindow()
  2. EnumChildWindows()
  3. getClassNameメソッド()
  4. EnumWindowsProc()
  5. AccessibleObjectFromWindow()

    Imports Microsoft.Office.Interop 
    Imports System.Runtime.InteropServices 
    
    Public Class Form1 
    
    Private Declare Function GetDesktopWindow Lib "user32"() As Integer 
    Private Declare Function EnumChildWindows Lib "user32.dll" (ByVal WindowHandle As IntPtr, ByVal Callback As EnumWindowsProc, ByVal lParam As IntPtr) As Boolean 
    Private Declare Function GetClassName Lib "user32.dll" Alias "GetClassNameA" (ByVal hWnd As IntPtr, ByVal lpClassName As String, ByVal nMaxCount As Integer) As Integer 
    Private Delegate Function EnumWindowsProc(ByVal hwnd As IntPtr, ByVal lParam As Int32) As Boolean 
    Private Declare Function AccessibleObjectFromWindow Lib "oleacc" (ByVal Hwnd As Int32, ByVal dwId As Int32, ByRef riid As Guid, <MarshalAs(UnmanagedType.IUnknown)> ByRef ppvObject As Object) As Int32 
    
    Private Const OBJID_NATIVE = &HFFFFFFF0 
    
    'Required to show the workbooks. Used in function to add to. 
    Private lstWorkBooks As New List(Of String) 
    
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
        lstWorkBooks.Clear() 
        GetExcelOpenWorkBooks() 
    End Sub 
    
    
    Private Sub GetExcelOpenWorkBooks() 
        Try 
         'Get handle to desktop 
         Dim WindowHandle As IntPtr = GetDesktopWindow() 
    
         'Enumerate through the windows (objects) that are open 
         EnumChildWindows(WindowHandle, AddressOf GetExcelWindows, 0) 
    
         'List the workbooks out if we have something 
         If lstWorkBooks.Count > 0 Then MsgBox(String.Join(Environment.NewLine, lstWorkBooks)) 
    
        Catch ex As Exception 
        End Try 
    
    End Sub 
    
    Public Function GetExcelWindows(ByVal hwnd As IntPtr, ByVal lParam As Int32) As Boolean 
    
        Dim Ret As Integer = 0 
        Dim className As String = Space(255) 'Return the string with some padding... 
    
        Ret = GetClassName(hwnd, className, 255) 
        className = className.Substring(0, Ret) 
    
        If className = "EXCEL7" Then 
         Dim ExcelApplication As Excel.Application 
         Dim ExcelObject As Object = Nothing 
         Dim IDispatch As Guid 
    
         AccessibleObjectFromWindow(hwnd, OBJID_NATIVE, IDispatch, ExcelObject) 
    
         'Did we get anything? 
         If ExcelObject IsNot Nothing Then 
          ExcelApplication = ExcelObject.Application 
          'Make sure we have the instance... 
          If ExcelApplication IsNot Nothing Then 
           'Go through the workbooks... 
           For Each wrk As Excel.Workbook In ExcelApplication.Workbooks 
            'If workbook ins't in the list then add it... 
            If Not lstWorkBooks.Contains(wrk.Name) Then 
             lstWorkBooks.Add(wrk.Name) 
            End If 
           Next 
          End If 
    
         End If 
        End If 
    
        Return True 
    
    End Function 
    
    End Class 
    
+1

真剣に、私はAPIなしでvb.netコードを好む。しかし、これが不可能なら、私はAPIソリューションを受け入れます。何が問題ですか? *** ***の答えはあなたの問題です。 「私は簡単なコードが好きです」あなたが上手くいっていると思うなら、それは簡単だと思います。 – Codexer

+1

@Codexer彼はあなたが彼の問題を解決できなかったことを感謝しているので、答えを削除してください。 – Sorceri

+0

@Markowitzありがとう、答えを受け入れる方法はここで動作します。それが助けられたら、投票して答えを受け入れることが重要です。これは、同じ問題を抱えているかもしれない他の人達に役立ちます。また、APIを使用しないで、おそらくアクティブなウィンドウをループしてそのオブジェクトを取得することは不可能です。私が知っている唯一の方法は私が投稿したものです – Codexer

関連する問題