簡體   English   中英

Excel VBA WorksheetFunction.IsError誤報

[英]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的完整響應,但可能會為其他同行提供一些跟進的建議。

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

曾經有一個舊的已知錯誤, 255個字符限制應該在較新版本中修復。 你的問題非常相似,所以它可能是同一個來源,雖然不可能肯定地說。

似乎將RangeValue設置為等於超過255個字符的String會破壞Range本身,並使Range上的IsError檢查為false。

問題2Is 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM