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

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

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

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

我目前的解决方法是为所有现有的错误消息做到这一点:

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

有一个更好的方法吗。 在API中有一个简单的函数吗?

您可以使用WorksheetFunction方法:

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

要么

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

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

在.NET中处理CVErr值是一个非常棘手的问题。 问题是.NET(正确)将CVErr视为error handling的过时。 但是,CVErr值仍然在Excel单元格中使用,所以这是Excel自动化的一个相当大的省略。

幸运的是,有一个解决方法。 检查CVErr值的方法是检查单元格保存的数据types。 如果所保存的值是整型(Int32)types,那么所保存的值是一个CVErr。 (请注意,单元格中保存的数值通常被input为Double,只有CVerr值可以通过整数。)

也就是说,在最简单的层面上,为了testing一个CVErr的值,你只需要使用下面的函数:

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

如果您需要检查特定的CVErr值(例如#N / A),则首先检查以确保数据types是Integer(Int32),然后检查单元格保存的特定值这个表格:

  • -2146826281 =#Div / 0!
  • -2146826246 – #N / A
  • -2146826259 =#姓名?
  • -2146826288 = #Null!
  • -2146826252 = #Num!
  • -2146826265 =#参考!
  • -2146826273 =#值!

例如,你的代码可能看起来像这样:

 enum CVErrEnum : Int32 { ErrDiv0 = -2146826281, 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); } 

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

  • 在.NET中处理CVErr值 – 第一部分:问题
  • 在.NET中处理CVErr值 – 第二部分:解决scheme

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

希望这可以帮助!