2016-05-18 5 views
0

Excel 2007では、Excel dnaとExcel interopを使用して、各ワークシートの選択変更に付いています。
私はapp.WorkbookActivateを使用しており、開いているワークブックを列挙しようとしています。Excel InteropワークシートSelectionWorkが開いているワークブックに添付されていない

ブックを有効にすると、新しいブック/シートが有効になります。 ただし、開いているワークブックには添付しません。エラーがない、それはちょうどあなたが新しい仕事帳を開き、誰もがなぜ知っているバック

を切り替える場合には、そのオリジナルのワークブックに付着する

動作しませんか?

ここにコードがあります。

using ExcelDna.Integration; 
using XL = Microsoft.Office.Interop.Excel; 

.... 
/// in an init method 
//add event listeners to open work books and on new work books 
XL.Application xlapp = (XL.Application)ExcelDnaUtil.Application; 
xlapp.WorkbookActivate += Xlapp_WorkbookActivate; 
ListenOnOpenWorkBooks(); 

private static void ListenOnOpenWorkBooks() 
{ 
    XL.Application xlapp = (XL.Application)ExcelDnaUtil.Application; 
    foreach (XL.Workbook wb in xlapp.Workbooks) 
    { 
     foreach (XL.Worksheet s in wb.Sheets) 
     { 
      s.SelectionChange += S_SelectionChange; 
     } 
    } 
} 

private static void Xlapp_WorkbookActivate(XL.Workbook Wb) 
{ 
    //TODOL check if already listening 
    foreach (XL.Worksheet s in Wb.Sheets) 
    { 
     s.SelectionChange += S_SelectionChange; 
    } 
} 

private static void S_SelectionChange(XL.Range range) 
{ 
    ///do something 
} 
+0

'ListenOnOpenWorkbooks'の中にある' xlApp'宣言を削除してみてください。あなたはすでにクラスレベルで宣言しています。これはあなたが望むものだと思います。 'Listen ...'の中にあるものは範囲外になり、 'Selection'イベントでそれを取っています...と思います。 –

答えて

1

代わりに、アプリケーションイベントハンドラを使用してすべてのシート変更を聴くことができます。他の誰かがこの問題を経験した場合は、ここに投稿してください。

XL.Application xlapp = (XL.Application) ExcelDnaUtil.Application; 
xlapp.SheetSelectionChange += Xlapp_SheetSelectionChange; 
+0

ちょうどニッキーになるために、私はこれを "回避策"と呼んでいません。私はそれをもっと良い解決策と呼ぶだろう。 :-) –

+1

私はそれが良いことに同意します。私が長年にわたって説いたことの完全な例。 MSは私たちにあまりにも多くのロープを与え、十分なロープを与えられたら.... –

関連する問題