2017-09-24 188 views
0

我有一個非常簡單的UDF程序。我有一條線,它分兩個數字。我需要讓IFERROR在發生錯誤時返回一個值。 在我的程序中,Testrange(1)包含90,而testrange(4)包含0. 我的UDF崩潰並返回一個Value錯誤。Excel VBA Application.iferror()不處理div/0錯誤

這是我的代碼。

Function myTestRange(TestRange As Range, myvol As Integer, myType As String) As Variant 

    myTestRange = Application.IfError(TestRange(1)/TestRange(4), 4567) 

End Function 

我在查看IFERROR函數的微軟頁面,它似乎列出了div/0是它處理的錯誤之一。

感謝您的任何幫助。 Rich

+0

根本問題是,IFERROR是一個工作表語句,因此它會識別'CELL'是否有錯誤。如果數學有錯誤,則不行。 – kaza

+2

TestRange(1)/ TestRange(4)會產生一個運行時錯誤(除以0) - 「IfError」沒有修復或處理這個,它在VBA中很少用到。測試0或使用錯誤處理。 –

+0

我明白你在說什麼,但請檢查以下鏈接,並讓我知道你是否認爲我錯過了某些東西:它似乎說它會起作用。 https://msdn.microsoft.com/en-us/vba/excel-vba/articles/worksheetfunctionfunction-iferror-method-excel – rtemen

回答

1

如何使用if語句。

Function myTestRange(TestRange As Range, myvol As Integer, myType As String) As Variant 
    If tesrange(4) = 0 Then 
     myTestRange = 4567 
    Else 
     myTestRange = TestRange(1)/TestRange(4) 
    End If 
    'myTestRange = Application.IfError(TestRange(1)/TestRange(4), 4567) 

End Function 
+0

感謝您的答覆。就我而言,它會更復雜一些,因爲我的數據有很多值爲零的概率。在這些情況下,我確實需要返回0的值。請查看以下鏈接並讓我知道您的想法。它似乎表明它應該工作。 https://msdn.microsoft.com/en-us/vba/excel-vba/articles/worksheetfunction-iferror-method-excel – rtemen

2

最根本的問題是VBA會在函數被調用之前自行捕獲錯誤。例如:

Sub qwerty() 
    x = Application.WorksheetFunction.IfError((0/0), "no good") 
    MsgBox x 
End Sub 

即使在函數被調用之前也會死亡,所以MsgBox永遠不會顯示。即使是:

Sub qwerty2() 
    On Error Resume Next 
     x = Application.WorksheetFunction.IfError((0/0), "no good") 
    On Error GoTo 0 
    MsgBox x 
End Sub 

運行至完成,因爲OnError語句禁用VBA先發制人的錯誤處理,但IfError()不返回任何東西。

你需要的東西,如:

Sub ytrewq() 
    a = 2 
    b = 7 
    On Error Resume Next 
     If IsError(b/a) Then 
      x = "no good" 
     Else 
      x = b/a 
     End If 
    On Error GoTo 0 
    MsgBox x 
End Sub 

返回有效信息,即使兩個一個b爲零。