Работа со значениями CVErr в .NET - очень сложная тема. Проблема в том, что .NET (по праву) считает CVErr устаревшим в отношении обработки ошибок. Однако значения CVErr все еще используются в ячейках Excel, поэтому это довольно большое упущение для автоматизации Excel.
К счастью, есть обходной путь. Способ проверки значений CVErr заключается в проверке типа данных, содержащихся в ячейке. Если удерживаемое значение набирается как Integer (Int32), то удерживаемое значение является CVErr. (Обратите внимание, что числовые значения, хранящиеся в ячейке, обычно печатаются как Double, только значения CVerr могут быть представлены как Integer.)
То есть на простейшем уровне для проверки значения CVErr все, что вам нужно сделать, это использовать следующую функцию:
bool IsXLCVErr(object obj)
{
return obj is Int32;
}
Если вам нужно проверить конкретное значение CVErr (например, # N / A), то сначала вы должны убедиться, что тип данных является целым числом (Int32), а затем проверить конкретное значение, содержащееся в ячейке. согласно этой таблице:
- -2146826281 = # DIV / 0!
- -2146826246 = # N / A
- -2146826245 = # GETTING_DATA
- -2146826259 = # ИМЯ?
- -2146826288 = # НУЛЬ!
- -2146826252 = #NUM!
- -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 #. Если это произойдет в какой-то момент, я отредактирую пост, добавив ссылку.)
Надеюсь, это поможет!