如何知道一个单元格在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以包含一个链接。)
希望这可以帮助!