2017-04-05 86 views
2

這是我想用Excel插件實現的。 Excel用戶選擇一個範圍並刪除它。我想在該範圍內將單元格數據(無論他刪除)寫入日誌文件。關於SO的多個問題表明,您無法在SheetChange事件處理程序中刪除範圍,您需要將其存儲。我將範圍存儲在選擇更改事件方法處理程序中的全局變量LastRange中。我需要SheetChange事件處理程序中的LastRange獲取Excel中刪除的範圍

的問題是我得到的COM例外 - 已從其基礎RCW分開,不能使用

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

是從addinexpress excelEvents東西? Application.SheetSelectionChange事件處理程序有點不同 – Slai

+0

是的。 excelevents來自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