在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中是否有一个简单的功能?
答案 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),然后检查单元格所持有的特定值,根据这张表:
例如,您的代码可能如下所示:
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。