Excel VBA WorksheetFunction.IsError误报

时间:2014-03-05 21:50:19

标签: excel-vba vba excel

在VBA中,我试图确定一个单元格是否包含错误值,例如由于功能无效。我现有的代码使用Excel.WorksheetFunction.IsError方法,但最近我遇到了一个导致误报的案例。单元格不包含错误值,但Excel.WorksheetFunction.IsError返回true。另一种方法VBA.Information.IsError不会出现此行为;它正确地返回false。

我能够确定只在单元格包含长度超过255个字符的值时才会出现问题。以下是验证行为的例程:

Sub IsErrorBehavior()
    Dim i As Long
    Dim str As String
    Dim r1 As Range, r2 As Range
    Dim xlWSFuncCheck1 As Boolean, xlWSFuncCheck2 As Boolean
    Dim vbaInfCheck1 As Boolean, vbaInfCheck2 As Boolean

    str = WorksheetFunction.Rept("A", 255)

    Set r1 = Range("A1")
    r1.Value = str
    xlWSFuncCheck1 = Excel.WorksheetFunction.IsError(r1)
    vbaInfCheck1 = VBA.Information.IsError(r1)

    str = str & "A"

    Set r2 = Range("A2")
    r2.Value = str
    xlWSFuncCheck2 = Excel.WorksheetFunction.IsError(r2)
    vbaInfCheck2 = VBA.Information.IsError(r2)
End Sub

上述例程是在Excel 2010中编写的,并在Excel 2007中进行了验证。目标应用程序当前正在Excel 2007下运行。

问题1:这是一个错误还是在这种情况下对Excel.WorksheetFunction.IsError的行为有合理的解释?

我将切换到VBA.Information.IsError方法,但现在我有点担心我也可能遇到错误。这导致我...

问题2:是否有更可靠的方法来检查特定单元格中的错误?

2 个答案:

答案 0 :(得分:3)

对Excel 2007不是一个完整的回复,但可能会为其他同行提供一些跟进的建议。

问题1 Is this a bug or is there a reasonable explanation for the behavior of Excel.WorksheetFunction.IsError in this case?

曾经有一个旧的已知错误255 character limit应该在较新版本中修复。你的问题非常相似,所以它可能是同一个来源,虽然不可能肯定地说。

似乎设置Value Range等于超过255个字符的String会破坏Range本身,并使IsError成为Range检查Is there a more reliable way to check for errors in a specific cell? false。

问题2 r2.Value

我会在CPearson's website中执行此操作,即检查r2而不是IsError,并使用VBA函数(IsError {{ 1}})具有更稳定的性能。通常,检查Range对象是否有错误可能会很棘手。在this question前一段时间,由于背景中的类型转换,我得到了有趣的结果。我想这也可能就是这种情况。在任何情况下,显式帮助(如果使用r2.value,您的示例将按预期工作)。

答案 1 :(得分:0)

我也遇到了这个错误,在我们的案例中,它独立于“.value”的使用或遗漏。

假设在单元格A1中输入

JSON.stringify

结果概率很小,因此Excel将返回0.000000作为单元格值。

但是,当您使用VBA进行测试时

=1-BINOM.DIST(35, 76, 0.1, TRUE)

VBA将返回TRUE。可能这是由于一些内部舍入错误检查,其中Excel意识到公式的返回值接近零以正确计算。

这是一个不幸的情况,因为Excel会将返回值显示为单元格值而不会出现任何错误或警告,同时VBA将在IsError()上返回TRUE。我不知道这个错误是否也存在于其他Excel函数中,例如

IsError(ActiveSheet.Range("A1").Value)

但在使用IsError()时会建议小心。