异步 UDF 和 xleventCalculationCanceled

Asynchronous UDFs and xleventCalculationCanceled

我在单元格中写入异步函数后,一按"Enter",异步函数就被正确调用,Excel在计算时引发事件xleventCalculationEnded完成。

但是,如果我在单击 "Enter" 后立即按下另一个单元格,则会引发事件 xleventCalculationCanceled,然后再次调用异步函数!这种行为正常吗?对于第一个异步调用、第二个异步调用或两者,我应该通过 Excel12(xlAsyncReturn,...) return 结果吗?

换句话说,xleventCalculationCanceled 事件是否意味着 我不是 被迫 return Excel 结果? (使用适当的asyncHandle

我正在使用异步函数委托另一个线程中的密集计算,并且在计算期间不阻塞 excel。但是,如果异步函数被自动调用两次(就像用户单击另一个单元格而不等待第一次调用完成的情况一样),那么密集计算将针对相同的输入计算两次(因为第一次调用被取消了) by excel- 仍然在委托线程中...) 你如何处理这个问题?

两次调用相同的函数 - 使用相同的输入 - 这是错误吗?

非常感谢

您所描述的是正常行为。 Excel 在有用户交互时取消然后重新启动异步计算(并且可以多次这样做)。

documentation建议:

  1. xleventCalculationEnded会在xleventCalculationCanceled之后直接触发,

  2. xleventCalculationEnded 触发时,您可以释放计算期间分配的任何资源。我知道要包含您可能拥有的任何 asyncHandle,因此您不需要 return 任何基于句柄的结果。

如果您的 long-running 功能允许在飞行途中取消,您可以取消您所做的工作。否则,您可能会对正在执行的函数调用进行一些内部簿记,并避免自己以这种方式进行两次工作。