2017-04-05 13 views
2

ここで私はExcel Addinで達成しようとしていることがあります。 Excelユーザーが範囲を選択し、その範囲を削除します。私はその範囲のセルデータ(彼が削除したもの)をログファイルに書きたいと思います。あなたはSheetChangeイベントハンドラで削除された範囲を取得することはできませんので、あなたはそれを格納する必要があります。私は選択変更イベントメソッドハンドラでグローバル変数LastRangeに範囲を格納しています。 SheetChangeイベントハンドラでLastRangeが必要です。その基盤となるRCWから分離されているExcelで削除された範囲を取得する

COMオブジェクトが を使用することはできません -

問題は、私はCOM例外を取得することです。

私はどこかでLastRangeが解放され、したがって例外が発生していることを知っています。 私は別のSOの質問hereを参照しました。デリゲートへの強い言及があるにもかかわらず、問題は持続する。

private ADXExcelSheet_EventHandler sheetChangeEventHandler; 
private ADXExcelSheet_EventHandler sheetSelectionChangeEventHandler; 

private void InitializeComponent() 
{ 
    sheetChangeEventHandler = new AddinExpress.MSO.ADXExcelSheet_EventHandler(SheetChange); 
    excelEvents.SheetChange += sheetChangeEventHandler; 
    sheetSelectionChangeEventHandler = new ADXExcelSheet_EventHandler(SheetSelectionChange); 
    excelEvents.SheetSelectionChange += sheetSelectionChangeEventHandler; 
} 

//.... 

Range LastRange; 

public void SheetSelectionChange(object sender, object sheet, object range) 
{ 
    LastRange = (range as Range); 
} 

public void SheetChange(object sender, object sheet, object range) 
{ 
    ClassX.Method1(range as Range, LastRange); 
} 

なぜLastRangeがMethod1の中でまだnullであるかわかりません。 LastRangeは、SheetChangeからMethod1()に正しく渡されます。これを得るための他のアイデアは何ですか?

+0

excelEventsはaddinexpressのものですか? Application.SheetSelectionChangeイベントハンドラは少し異なります – Slai

+0

はい。 Excelevents from Addinexpress – user1

+0

Add-in Expressは、イベントハンドラが終了した直後にイベントハンドラに渡されたすべてのCOMオブジェクトを解放するようです。回避策はありますか?私は、削除された範囲オブジェクトを保存し、それを別のイベントハンドラに再利用したい。 – user1

答えて

0

範囲のコピーを作成するとどうなりますか?

var sheetConcrete = (Worksheet)sheet; 
var rangeConcrete = (Range)range; 
LastRange = sheetConcrete.Range[rangeConcrete.Address] 

(あなたはそれが働いて取得する構文でプレーする必要がある場合があります)

アドインは、COMオブジェクトを追跡する方法がないはずですので、それは生き続ける必要があります。

+0

私はすでに範囲をコピーしようとしました。 – user1

+0

コピーを作成するとどうなりますか?アクセスしようとすると例外がスローされますか? – briantyler

+0

はい、コピーされたオブジェクトが無効であるように見えます。 – user1

関連する問題