如何知道单元格在C#中的公式中是否有错误

时间:2010-03-11 12:06:32

标签: c# excel vsto

在Excel公式中,您可以使用=ISERR(A1)=ISERROR(A1)

在VBA宏中,您可以使用IsError(sheet.Cells(1, 1))

但是使用VSTO Excel Addin项目我没有在Microsoft.Office.Interop.Excel API下找到类似的功能。我只想知道单元格中是否有错误,我对错误的类型并不感兴趣。

我目前的解决方法是对所有现有错误消息执行此操作。:

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

有没有更好的方法来做到这一点。 API中是否有一个简单的功能?

2 个答案:

答案 0 :(得分:65)

在.NET中处理CVErr值是一个非常棘手的主题。问题是.NET(理所当然)认为CVErr在错误处理方面已经过时了。但是,CVErr值仍然在Excel单元格中使用,因此这对于Excel自动化来说是一个相当大的遗漏。

幸运的是,有一种解决方法。检查CVErr值的方法是检查单元格所持有的数据类型。如果保持的值被输入为Integer(Int32),则保持的值为CVErr。 (请注意,单元格中保存的数值通常键入为Double,只有CVerr值可以作为整数来表示。)

也就是说,在最简单的层面上,要测试CVErr值,您需要做的就是使用以下函数:

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

如果需要检查特定的CVErr值(例如,#N / A),那么首先要检查以确保数据类型是整数(Int32),然后检查单元格所持有的特定值,根据这张表:

  • -2146826281 =#DIV / 0!
  • -2146826246 =#N / A
  • -2146826245 = #GETING_DATA
  • -2146826259 = #NAME?
  • -2146826288 = #NULL!
  • -2146826252 = #NUM!
  • -2146826265 = #REF!
  • -2146826273 = #VALUE!

例如,您的代码可能如下所示:

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#更新这篇文章。如果在某些时候发生这种情况,我会编辑帖子以包含一个链接。)

希望这有帮助!

答案 1 :(得分:12)

您可以使用WorksheetFunction方法:

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

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

IsErr在语义上与Excel工作表函数相同,而不是实际值中的单元格引用传递 - AFAIK。