C# 在Excel中获取已删除的范围

C# 在Excel中获取已删除的范围,c#,excel-interop,addin-express,C#,Excel Interop,Addin Express,以下是我试图通过Excel插件实现的目标。Excel用户选择一个范围并将其删除。我想将该范围内的单元格数据(无论他删除什么)写入日志文件。在SheetChange事件处理程序中,有多个问题表明您无法获取删除的范围,您需要存储它。我正在选择更改事件方法处理程序中的全局变量LastRange中存储范围。我需要SheetChange事件处理程序中的LastRange 问题是我遇到了COM异常-- 无法删除已与其基础RCW分离的COM对象 用过 我知道某个地方,LastRange正在被释放,因此出现了异

以下是我试图通过Excel插件实现的目标。Excel用户选择一个范围并将其删除。我想将该范围内的单元格数据(无论他删除什么)写入日志文件。在SheetChange事件处理程序中,有多个问题表明您无法获取删除的范围,您需要存储它。我正在选择更改事件方法处理程序中的全局变量
LastRange
中存储范围。我需要SheetChange事件处理程序中的
LastRange

问题是我遇到了COM异常--

无法删除已与其基础RCW分离的COM对象 用过

我知道某个地方,
LastRange
正在被释放,因此出现了异常。 我提到另一个问题。即使我对该代表有很强的引用,问题仍然存在

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);
}

不确定为什么Method1中的
LastRange
仍然为空
LastRange
已从SheetChange正确传递到
Method1()
。还有什么其他的办法可以让它工作吗?

如果你复制了这个系列呢

var sheetConcrete = (Worksheet)sheet;
var rangeConcrete = (Range)range;
LastRange = sheetConcrete.Range[rangeConcrete.Address]
(您可能需要使用语法才能使其正常工作)


外接程序应该无法跟踪该COM对象,因此它应该保持活动状态。

excelEvents是否来自addinexpress?Application.SheetSelectionChange事件处理程序有点不同。excelevents来自AddInExpress它看起来像是在事件处理程序完成后立即释放传递给事件处理程序的所有COM对象。有解决办法吗?我想存储已删除的范围对象并在其他事件处理程序中重用它。我已与外接程序express团队确认。外接程序Express在事件处理程序完成后立即释放传递给事件处理程序的所有COM对象。这种情况下唯一的解决方法是,将所有行存储在Range对象中,并将其传递给Method()。如果删除这些值,我看不到该范围有任何用处。范围只是指向位置和值的指针。要保存单元格数据,可以使用类似于
object LastRangeValue=(range as range)?.Value的方法。那么,复制时会发生什么呢?当您尝试访问它时,它是否会引发异常?是的,看起来复制的对象无效。无论如何,我在这里解决了问题。我只是草拟一个答案。谢谢你的帮助。没问题,很高兴你能成功。有时候你所需要的只是一点精神上的支持。我经常发现,仅仅问一个问题就能让我更多地思考它,让我更接近一个答案。