2017-09-01 75 views
0

我在Excel中很缺乏經驗,我遇到了編程宏的問題。無論我是否設置了斷點並逐步結束,它都會停止,不會出現任何錯誤對話框。Excel VBA宏和錯誤消息

我錯過了什麼嗎?我是否必須明確地打開錯誤消息?

這樣的事情,在一個模塊中:

Function Provoke(XYZ As Integer) As Integer 
    Provoke = XYZ/0 
End Function 

功能是使用的公式在細胞內,這樣

=Provoke(4711) 

我怎麼能讓他抱怨師零?

回答

4

如果在從工作表的UDF調用時功能出現錯誤,你將不會看到任何錯誤,你消息 - 剛剛得到一個#VALUE錯誤返回到單元格

如果你打電話與VBA中的Sub相同的功能,您將看到該錯誤。

如果你想能夠返回更具體的錯誤消息,你需要更多的編碼。

E.g.

Function Provoke(XYZ As Integer) 

    On Error GoTo haveError 
    Provoke = XYZ/0 
    Exit Function 

haveError: 
    'what type of error did we get? 
    Select Case Err.Number 
     Case 11: Provoke = CVErr(xlErrDiv0) 
     Case Else: Provoke = "Error!" 
    End Select 

End Function 

這一個很好的參考:http://www.cpearson.com/excel/ReturningErrors.aspx

+1

如果您還希望捕獲其他特定錯誤,請檢查http://onlinelibrary.wiley.com/doi/10.1002/9781 118257616.app3/pdf以及(我總是保持書籤)。 –

+0

在你的第一段很好! – curious

2

是的,你需要作出規定告訴VBA如果發生錯誤做什麼。

這個錯誤是因爲該行代碼中存在的:

Provoke = XYZ/0 

沒有數是零整除,它會生成一個錯誤。基本數學:any number ÷ 0 = ∞

要驗證第一手資料,你可以嘗試這樣的事情來捕獲錯誤數量以及來源和說明:

Function Provoke(XYZ As Integer) 
    On Error Resume Next 
    Provoke = XYZ/0 
    If Err.Number <> 0 Then Provoke = "Error# " & Err.Number & " - generated by " & Err.Source & " - " & Err.Description 
    On Error GoTo 0 
End Function 

現在,如果你嘗試

=Provoke(4711) 

你會得到結果是:

Error# 11 - generated by VBAProject - Division by zero 
+2

'XYZ/0'不返回錯誤值,它會產生錯誤。所以,即使'Provoke'是一個'Variant',它也不會工作,因爲沒有什麼可以分配給'Provoke'。如果錯誤需要返回,那麼需要將引發的錯誤陷入困境,然後可能會返回一個「Variant/Error」(在更改函數類型以允許該錯誤之後)。 – YowE3K

+0

不錯的pt YowE3K。我最初的重點是強調「XYZ/0」是一個無限數量的事實。在你的筆記之後,我已經相應地更新了我的答案。感謝名單 – curious