Espere a que los cálculos terminen en excel con references circulares

Tengo varias celdas (vamos a llamarlas Celdas de origen) a las que hace reference otra celda (vamos a llamarla Célula de destino) por su Fórmula. Cambio el valor en las celdas de origen y deseo get el valor resultante después de recalcular la fórmula en la celda de destino.

Establecí temporalmente el Cálculo en XlCalculation.xlCalculationManual e forzó un nuevo cálculo completo mediante el uso de Application.Calculate .

El problema es que cuando esto se ejecuta dentro de un bucle, a veces la fórmula no se calcula lo suficientemente rápido y el código recoge valores más antiguos. Entonces, lo que quiero es esperar a que termine el nuevo cálculo forzado.

xlPending el enfoque Application.CalculationState , pero siempre es xlPending que hace que el progtwig caiga en un ciclo infinito. El file Excel tiene algunas references circulares, las Iteraciones de cálculo están configuradas y puedo ver la advertencia "Calcular" en la barra de estado de Excel constantemente (incluso si recalculo manualmente).

También probé el evento Application.AfterCalculate en combinación con un evento Autoreset pero nuevamente terminé esperando infinitamente (sospecho que tanto la señalización del evento como la espera del evento ocurren en el mismo hilo, por lo que cuando se ejecuta wait primero el progtwig se cuelga):

  public static AutoResetEvent AutoEvent; public static void StartMonitoring() { AutoEvent?.Close(); AutoEvent = new AutoResetEvent(false); Globals.ThisAddIn.Application.AfterCalculate += Application_AfterCalculate; } public static void StopMonitoring() { Globals.ThisAddIn.Application.AfterCalculate -= Application_AfterCalculate; AutoEvent?.Close(); AutoEvent = null; } public static void WaitForCalculations() { AutoEvent.WaitOne(); StopMonitoring(); } private static void Application_AfterCalculate() { AutoEvent.Set(); } 

 StartMonitoring(); Globals.ThisAddIn.Application.Calculate() WaitForCalculations(); 

Alguna mejor idea? ¿Tengo alguna esperanza de encontrar una solución con el Excel dado o debo resolver las references circulares?

Si todas las demás opciones fallan, puede tratar simplemente de establecer las fórmulas en Manual y ejecutar la fórmula en cada celda por separado con el código vb:

  Application.Calculation = xlManual Range("NAMED_RANGE_1").Formula = "=10 + NAMED_RANGE_2" Range("NAMED_RANGE_2").Formula = "=10 + NAMED_RANGE_1" 

(Easyer para nombrar las celdas como ranges primero) Si desea suprimir la advertencia de reference circular, siempre puede eliminar la fórmula de una de las celdas:

  Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False