在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:是否有更可靠的方法来检查特定单元格中的错误?
答案 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()时会建议小心。