Как знать, имеет ли ячейка ошибку в формуле в C#

В Формуле Excel можно использовать =ISERR(A1) или =ISERROR(A1)

В макросе VBA можно использовать IsError(sheet.Cells(1, 1))

Но с помощью VSTO Дополнительный проект Excel я не сделал найденной подобной функции под Microsoft. Office. Interop. Excel API. Я только хочу знать, существует ли ошибка в ячейке, я действительно не интересуюсь типом ошибки.

Мое текущее обходное решение должно сделать это для всех существующих сообщений об ошибках.:

if (((Range)sheet.Cells[1, 1]).Text == "#N/A" || ...)

Есть ли лучший способ сделать это. Существует ли простая функция в API для этого?

23
задан Pascal 30 March 2010 в 08:00
поделиться

2 ответа

Вы можете использовать метод WorksheetFunction:

Globals.ThisAddIn.Application.WorksheetFunction.IsErr(...)

или

[Your Excel Object].WorksheetFunction.IsErr(...)

Метод IsErr семантически идентичен функции рабочего листа Excel, только вместо ссылки на ячейку передайте фактическое значение - AFAIK.

12
ответ дан 29 November 2019 в 00:49
поделиться

Работа со значениями CVErr в .NET - очень сложная задача. Проблема в том, что .NET (справедливо) считает CVErr устаревшим в отношении обработки ошибок. Однако значения CVErr по-прежнему используются в ячейках Excel, так что это довольно большое упущение для автоматизации Excel.

К счастью, есть обходной путь. Чтобы проверить значения CVErr, нужно изучить тип данных, хранящийся в ячейке. Если хранимое значение набрано как целое число (Int32), то хранимое значение является CVErr. (Обратите внимание, что числовые значения, содержащиеся в ячейке, обычно набираются как Double, только значения CVerr могут проходить как Integer.)

То есть на простейшем уровне для проверки значения CVErr все, что вам нужно сделать, это использовать следующая функция:

bool IsXLCVErr(object obj)
{
    return obj is Int32;
}

Если вам нужно проверить конкретное значение CVErr (например, # N / A), вы должны сначала проверить, является ли тип данных Integer (Int32), а затем проверить конкретное значение удерживается ячейкой согласно этой таблице:

  • -2146826281 = # DIV / 0!
  • -2146826246 = # Н / Д
  • -2146826245 = # GETTING_DATA
  • -2146826259 = # ИМЯ?
  • -2146826288 = # ПУСТО!
  • -2146826252 = # ЧИСЛО!
  • -2146826265 = #REF!
  • -2146826273 = # ЗНАЧЕНИЕ!

Например, ваш код может выглядеть так:

enum CVErrEnum : Int32
{
    ErrDiv0 = -2146826281,
    ErrGettingData = -2146826245,
    ErrNA = -2146826246,
    ErrName = -2146826259,
    ErrNull = -2146826288,
    ErrNum = -2146826252,
    ErrRef = -2146826265,
    ErrValue = -2146826273
}

bool IsXLCVErr(object obj)
{
    return (obj) is Int32;
}

bool IsXLCVErr(object obj, CVErrEnum whichError)
{
    return (obj is Int32) && ((Int32)obj == (Int32)whichError);
}

Несколько лет назад я написал подробную статью, состоящую из двух частей:

Статьи написаны для VB.NET, но принципы в точности такие же, как и для C #. У вас не должно возникнуть проблем с переводом, но если у вас возникнут проблемы, спрашивайте.(Я надеюсь, что когда-нибудь у меня будет время обновить эту статью для C #. Если это произойдет в какой-то момент, я отредактирую сообщение, включив ссылку.)

Надеюсь, это поможет!

66
ответ дан 29 November 2019 в 00:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: