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

Pas*_*cal 23 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" || ...)
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗.API中有一个简单的功能吗?

Mik*_*lum 66

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

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

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

bool IsXLCVErr(object obj)
{
    return obj is Int32;
}
Run Code Online (Sandbox Code Playgroud)

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

  • -2146826281 =#DIV/0!
  • -2146826246 = #N/A.
  • -2146826245 = #GETTING_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);
}
Run Code Online (Sandbox Code Playgroud)

几年前我写了一篇详细的两篇文章:

这些文章是为VB.NET编写的,但原理与C#完全相同.你应该没有翻译的麻烦,但如果你有任何问题,那么请问.(有一天,我希望有时间为C#更新这篇文章.如果在某些时候发生这种情况,我会编辑帖子以包含一个链接.)

希望这可以帮助!

  • 这种答案让人们希望SO拥有"一天超级投票"功能 (10认同)

cod*_*ife 12

您可以使用以下WorksheetFunction方法:

Globals.ThisAddIn.Application.WorksheetFunction.IsErr(...)
Run Code Online (Sandbox Code Playgroud)

要么

[Your Excel Object].WorksheetFunction.IsErr(...)
Run Code Online (Sandbox Code Playgroud)

它IsErr在语义上与Excel工作表函数相同,只是代替实际值中的单元格引用传递 - AFAIK.

  • 快速说明:`WorksheetFunction.IsErr`将按设计为#N/A值返回false.因此,要使用此方法,应该使用`WorksheetFunction.IsError`.如果你需要拿起*特别*CVErr值,那么你可以拿起使用`WorksheetFunction.IsNA`#N/A值,但对任何其他特定CVErr类型,你不得不使用我介绍的方法下面. (2认同)