2014-03-05 64 views
4

在VBA中,我試圖確定一個單元格是否包含錯誤值,例如,由於功能無效。我現有的代碼使用了Excel.WorksheetFunction.IsError方法,但我最近遇到了一個導致誤報的案例。單元格不包含錯誤值,但Excel.WorksheetFunction.IsError返回true。另一種方法VBA.Information.IsError不會顯示此行爲;它正確地返回false。Excel VBA WorksheetFunction.IsError false positive

我能夠確定問題只發生在單元格包含長度超過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

您使用Excel的哪個版本的工作是什麼時候? – Ioannis

+0

哎呀,小學生錯誤。上面添加版本信息 –

+1

以下是由@loannis回答的問題。當使用'WSF.IsError'時,你應該檢查'.Value'是否出錯,而不是範圍。此外,'VBA.Info.IsError'比'WSF.IsError'路由更可靠,因爲前者也可以正確檢查Range。有關示例,請參見[this](http://picpaste.com/pics/Capture-vRy1sAD3.1394060144.GIF)。 – Manhattan

回答

3

對於Excel 2007來說,這不是一個完整的響應,但可能會給其他同行跟進一些想法。

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

曾經有一個古老的已知的bug與255 character limit這是應該被固定在新版本中。你的問題非常相似,所以它可能是相同的來源,儘管無法肯定地說。

似乎設置Range等於超過255個字符的StringValue破壞了Range本身,並使得在RangeIsError檢查。

問題2Is there a more reliable way to check for errors in a specific cell?

我會做它作爲CPearson's website,即檢查r2.Value代替r2,並使用IsError功能(這是VBAIsError),有更穩定的性能。一般來說,檢查Range對象是否有錯誤可能會非常棘手。在this question前段時間,由於在後臺進行的類型轉換,我得到了有趣的結果。我想這也可能是這種情況。在任何情況下,顯式幫助(如果使用r2.value代替,您的示例按預期工作)。

+0

+1:當場。 – Manhattan

+1

關於[你的問題的答案](http://stackoverflow.com/a/16743718/3385503)中的默認屬性的位非常有啓發性。爲「Value」顯式檢查比依靠默認屬性機制更好 –

0

我也遇到了這個錯誤,在我們的例子中,它獨立於「.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()。