[英]Excel VBA WorksheetFunction.IsError false positive
在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:是否有更可靠的方法來檢查特定單元格中的錯誤?
不是Excel 2007的完整響應,但可能會為其他同行提供一些跟進的建議。
問題1 : Is this a bug or is there a reasonable explanation for the behavior of Excel.WorksheetFunction.IsError in this case?
曾經有一個舊的已知錯誤, 255個字符限制應該在較新版本中修復。 你的問題非常相似,所以它可能是同一個來源,雖然不可能肯定地說。
似乎將Range
的Value
設置為等於超過255個字符的String
會破壞Range
本身,並使Range
上的IsError
檢查為false。
問題2 : Is there a more reliable way to check for errors in a specific cell?
我會像在CPearson的網站上那樣做,即檢查r2.Value
而不是r2
,並使用具有更穩定性能的IsError
函數(即VBA
IsError
)。 通常,檢查Range
對象是否有錯誤可能很棘手。 在這個問題不久之前,由於在后台進行的類型轉換,我得到了有趣的結果。 我想這也可能就是這種情況。 在任何情況下,顯式幫助(如果使用r2.value
您的示例將按預期工作)。
我也遇到了這個錯誤,在我們的例子中,它獨立於“.value”的使用或遺漏。
假設在單元格A1中輸入
=1-BINOM.DIST(35, 76, 0.1, TRUE)
結果概率很小,因此Excel將返回0.000000作為單元格值。
但是,當您使用VBA進行測試時
IsError(ActiveSheet.Range("A1").Value)
VBA將返回TRUE。 可能這是由於一些內部舍入錯誤檢查,其中Excel意識到公式的返回值接近零以正確計算。
這是一個不幸的情況,因為Excel將返回值顯示為單元格值而沒有任何錯誤或警告,而同時VBA將在IsError()上返回TRUE。 我不知道這個bug是否也存在於其他Excel函數中,例如
=1-NORM.S.VERT(42, TRUE)
但是在使用IsError()時會建議小心。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.