【问题标题】:Get deleted Range in Excel在 Excel 中获取已删除的范围
【发布时间】:2017-04-05 10:04:35
【问题描述】:

这是我试图通过 Excel 插件实现的目标。 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 中仍然为空。 LastRange 正确地从 SheetChange 传递到 Method1()。有什么其他的想法可以让它发挥作用吗?

【问题讨论】:

  • excelEvents 来自 addinexpress 吗? Application.SheetSelectionChange 事件处理程序有点不同
  • 是的。 excelevents 来自 Addinexpress
  • 看起来 Add-in Express 会在事件处理程序完成后立即释放传递给事件处理程序的所有 COM 对象。任何解决方法?我想存储已删除的范围对象并在不同的事件处理程序中重用它。
  • 我已与 Add-in express 团队确认。 Add-in Express 在事件处理程序完成后立即释放所有传递给事件处理程序的 COM 对象。在这种情况下,唯一的解决方法是将所有行存储在 Range 对象中并将其传递给 Method()。
  • 如果值被删除,我看不到 Range 有任何用途。 Range 只是指向位置和值的指针。要保存单元格数据,例如object LastRangeValue = (range as Range)?.Value

标签: c# excel-interop addin-express


【解决方案1】:

如果你复制一个范围呢?

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

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

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

【讨论】:

  • 那么当你复制时会发生什么?当你尝试访问它时它会抛出异常吗?
  • 是的,看起来复制的对象无效。
  • 无论如何,我在这里找到了问题所在。我只是在起草一个答案。感谢您的帮助。
  • 没有问题,很高兴你成功了。有时你所需要的只是一点精神上的支持。我经常发现,问这个问题会让我思考更多,让我更接近答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-02
  • 2017-02-15
  • 2011-01-15
相关资源
最近更新 更多