Вот текущий код, который я получил
private void recalculateRRange(Excel.Range UsedRange)
{
Excel.Range currentRRange = null, firstRRange = null;
currentRRange = (Excel.Range)UsedRange.Find("#HERE#", Type.Missing, Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlPart, Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlNext, false, Type.Missing, Type.Missing);
while (currentRRange != null)
{
if (firstRRange == null)
{
firstRRange = currentRRange;
}
else if (currentRRange.get_Address(Type.Missing, Type.Missing, Excel.XlReferenceStyle.xlA1, Type.Missing, Type.Missing) == firstRRange.get_Address(Type.Missing, Type.Missing, Excel.XlReferenceStyle.xlA1, Type.Missing, Type.Missing))
{
break;
}
//force current range to recalculate
currentRRange.Calculate();
currentRRange = (Excel.Range)UsedRange.FindNext(currentRRange);
}
}
Приведенный выше метод используется для поиска ячеек, помеченных как #HERE#
, и для принудительного пересчета этой ячейки, чтобы мы могли получить обновленные результаты.
Мне удалось заставить этот код работать день назад, но сейчас он почему-то не работает.Я полагаю, что в любом случае код несколько глючит, поскольку я смог зафиксировать исключение только один раз.Интересно, есть ли лучший способ реализовать это?
Захвачено исключение:
Exception from HRESULT: 0x800AC472
at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)
at Microsoft.Office.Interop.Excel.Range.Calculate()
Я не знаю, означало ли это что-то или нет.Мое лучшее предположение состоит в том, что, вероятно, что-то мешает currentRRange
звонить Calculate()
.