2009-07-13 21 views
7

私は特定のワークシートのExcelの範囲でいくつかの値を書き込む必要があるC#単純なアプリケーションを持っています。 存在しない場合はExcelアプリケーションのインスタンスを作成しますが、存在する場合はアクティブに設定し、コード内で使用する場合はインスタンスを取得します。ハンドルでC#でExcelアプリケーションのインスタンスを取得

私は、新しいアプリケーションを作成するには、このコードを使用し

Microsoft.Office.Interop.Excel app = 
    new Microsoft.Office.Interop.Excel.Application(); 
app.Visible = true; 

私はでExcelアプリケーションのインスタンスを取得することができますどのようにこのAPI

[DllImportAttribute("User32.dll")] 
private static extern int FindWindow(String ClassName, String WindowName); 

を使用して、アクティブExcelウィンドウのハンドルを取得するにはハンドル?

int hWnd = FindWindow(null, "Microsoft Excel - MySheet.xlsx"); 
Microsoft.Office.Interop.Excel app = ....(hWnd) 

答えて

16

エクセルの最初の実行中のインスタンスを取得するには、次のコードを使用します

oExcelApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"); 

public Excel.Application StartExcel() 
{ 
    Excel.Application instance = null; 
    try 
    { 
     instance = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"); 
    } 
    catch (System.Runtime.InteropServices.COMException ex) 
    { 
     instance = new Excel.ApplicationClass(); 
    } 

    return instance; 
} 
+0

私にとって、 'instance = new Excel.ApplicationClass();'はうまくいかなかった。私は 'instance = new Excel.Application();'を使う必要がありました。 –

+2

@DavidMurdochこれは[interopタイプの埋め込みのためのVS2010の変更]の結果です(http://blogs.msdn.com/b/mshneer/archive/2009/12/07/interop-type-xxx-cannot-be -embedded-use-the-applicable-interface-instead.aspx)を使用します。回避策は、 'ApplicationClass()'の 'Application()'に切り替えることです。同じ結果が得られます。 – James

13

実行中のExcelインスタンスが複数存在する可能性があります。

GetActiveObject(...)は、実行オブジェクトテーブル(ROT)を検索し、最後に開いたExcelインスタンスを表示します。ウィンドウハンドルに対応するものではありません。

あなたはAccessibleObjectFromWindow(..)を探しています。他の答えにリンクされているAndrew Whitechapel postはこの関数の使い方を示しています。

別のリンク - http://blogs.officezealot.com/whitechapel/archive/2005/04/10/4514.aspx

関連する問題