Excel interop - проблема с пересчетом определенного диапазона - PullRequest
1 голос
/ 26 сентября 2011

Вот текущий код, который я получил

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().

1 Ответ

2 голосов
/ 26 сентября 2011

Полученная ошибка означает VBA_E_IGNORE, что, в свою очередь, означает, что что-то / кто-то работает / взаимодействует на этом листе ... это может быть пользователь и / или какой-то сложный расчет.

Вы должны установить Visible = false для объекта приложения Excel и немного подождать после выбора Range и повторить вызов Calculate, когда получите эту ошибку ...

Еще один момент: вам следует избегать доступа к объекту приложения Excel из нескольких потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...