2

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

问题是我得到 COM 异常——

无法使用已与其底层 RCW 分离的 COM 对象。

我知道某个地方LastRange正在被释放,因此是例外。我在这里提到了另一个 SO 问题。即使我对委托有很强的引用,问题仍然存在。

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 中仍然为空。LastRange从 SheetChange 正确传递到Method1(). 有什么其他的想法可以让这个工作吗?

4

1 回答 1

0

如果你制作一个范围的副本呢?

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

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

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

于 2017-04-06T05:49:06.470 回答