在Excel

时间:2017-04-05 10:04:36

标签: c# excel-interop addin-express

这是我想用Excel Addin实现的。 Excel用户选择一个范围并删除它。我想将该范围内的单元格数据(无论何时删除)写入日志文件。关于SO的多个问题表示您无法在SheetChange事件处理程序中删除范围,您需要存储它。我将范围存储在选择更改事件方法处理程序中的全局变量LastRange中。我在SheetChange事件处理程序中需要LastRange

问题是我得到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。 {1}}正确地从SheetChange传递到LastRange。任何其他想法让这个工作?

1 个答案:

答案 0 :(得分:0)

如果您复制范围怎么办?

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

(您可能需要使用语法来使其正常工作)

加载项应该无法跟踪该COM对象,因此它应该保持活跃状态​​。