2012-01-26 13 views
1

私は次のようにVSTOを使用して、Excelシート人口午前:VSTO 4を使用して開いているExcelのバージョンを確認する方法は?

Application app = new Application(); 
var wBook = app.Workbooks.Add(); 
var wSheet = (wBook.Worksheets[1] as Worksheet); 
/* Population algorithm */ 
app.Visible=true; 

シートが作成され、すべては私が(エクセル2003とエクセル2010で働くenvrionmentでExcelの2つのバージョンがインストールされていることを除いて、細かいです)。

先週、コードを初めて作成したときにExcel 2010が表示されていました。しかし、今週は、それが開くExcel 2003です。

私のプロジェクトでは最新のバージョン(C:\Program Files (x86)\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office14\Microsoft.Office.Interop.Excel.dll、バージョン14)のMicrosoft.Office.Interop.Excelが参照されています。

Windowsではこれが何らかの設定ですか、それともアプリケーションのインスタンスを作成するときに指定する必要がありますか?

+0

を助けるかもしれない、2010年に優れ、それに取り扱います。 – Jesse

+0

@Jesse私は理解していない、PIOは何ですか?また、私は2010年をオープンさせたいと思っています。 – SRKX

+1

申し訳ありませんが、PIA。あなたの参照しているDLL。彼らは前方互換です。つまり、2003年のPIAは2010年を自動化しますが、新しい機能を参照することはできません。 – Jesse

答えて

0

多分始めるには、コードの下に別の方法としては、2003年PIOをターゲット可能性があり、Excelが開いている問題ではないだろう

public static void GetReferences(ref Microsoft.Office.Interop.Excel.Application _Application, ref Microsoft.Office.Interop.Excel.Workbook _Workbook) 
{ 
    EnumChildCallback cb; 
    // start exe 
    int hwnd = Process.Start("Excel 2010 path").MainWindowHandle; 


    if (hwnd != 0) 
    { 
     int hwndChild = 0; 
     cb = new EnumChildCallback(EnumChildProc); 
     EnumChildWindows(hwnd, cb, ref hwndChild); 


     if (hwndChild != 0) 
     { 
      const uint OBJID_NATIVEOM = 0xFFFFFFF0; 
      Guid IID_IDispatch = new Guid( 
       "{00020400-0000-0000-C000-000000000046}"); 
      Microsoft.Office.Interop.Excel.Window ptr = null; 

      int hr = AccessibleObjectFromWindow( 
        hwndChild, OBJID_NATIVEOM, IID_IDispatch.ToByteArray(), ref ptr); 
      if (hr >= 0) 
      {     
       _Application = ptr.Application; 
       _Workbook = _Application.ActiveWorkbook; 
      } 
     } 
    } 
} 

[DllImport("Oleacc.dll")] 
public static extern int AccessibleObjectFromWindow( 
     int hwnd, uint dwObjectID, byte[] riid, 
     ref Microsoft.Office.Interop.Excel.Window ptr); 

public delegate bool EnumChildCallback(int hwnd, ref int lParam); 

[DllImport("User32.dll")] 
public static extern bool EnumChildWindows( 
     int hWndParent, EnumChildCallback lpEnumFunc, 
     ref int lParam); 


[DllImport("User32.dll")] 
public static extern int GetClassName( 
     int hWnd, StringBuilder lpClassName, int nMaxCount); 

public static bool EnumChildProc(int hwndChild, ref int lParam) 
{ 
    StringBuilder buf = new StringBuilder(128); 
    GetClassName(hwndChild, buf, 128); 
    if (buf.ToString() == "EXCEL7") 
    { 
     lParam = hwndChild; 
     return false; 
    } 
    return true; 

}

関連する問題