2017-10-13 211 views
0

我有一個函數,其目的是返回一個字符串來表示函數已完成並檢索所需值或錯誤以指示存在問題。如何從VBA中的函數返回錯誤對象?

要看看我是否能做到這一點,我撞壞一起以下幾點:

Private Function one() 

    Debug.Print TypeName(two(False)) 

End Function 

Private Function two(b As Boolean) As Variant 
    Dim e As New ErrObject 

    If (b) Then 
     two = True 
    Else 
     two = e.number 
    End If 

End Function 

現在,這種失敗在two = e.number,因爲你似乎沒有能夠設置這樣一個錯誤號 - 語法不正確。

我可以使用err.raise但隨後的意圖是通過整個錯誤的對象回來,我就可以有一個自定義數字,在我自己的描述等填寫...

你如何實際傳遞err對象回來了嗎?你真的可以這樣做嗎?這是實現我所要做的最有效的方法嗎?

謝謝

+0

不應該只是'Err'嗎? 'two = Err'? – dwirony

+2

請看這裏:http://www.cpearson.com/excel/ReturningErrors.aspx –

+0

我認爲你在VBA中所做的一切都是'提升'一個錯誤 - 你不能直接創建一個'Err'對象http:// www。 cpearson.com/Excel/ErrorHandling.htm。你的'ErrObject'似乎是VB。Net –

回答

1

你沒有。 Err是來自標準庫VBA.Information模塊的全局作用域Function,該模塊返回ErrObject實例。

意圖是通過整個錯誤的對象回來,我就可以有一個自定義號碼,並填寫在我自己的描述

你不需要通過整個錯誤對象回拋出自定義錯誤。

Const ERR_SomethingBad = vbObjectError + 42 
Err.Raise ERR_SomethingBad, "MyModule.MyProcedure", "Uh-oh" 

Err已經在全球範圍內 - 你不需要來回傳遞錯誤的對象......而事實上,你根本無法。因爲ErrObject類不可創建。這:

Dim e As ErrObject 
Set e = New ErrObject 

引發運行時錯誤429「ActiveX無法創建對象」。

非常想法錯誤背後(和例外情況,如果你的任何熟悉功能異常的語言),是他們取代舊的過時的「返回狀態代碼」的方式,如:

''' DON'T DO THIS, IT's 2017!!! 
Public Function DoSomething(ByVal p1 As Double, ByRef outResult As Double) As Long 
    If p1 = 0 Then 
     DoSomething = 11 'return code for division by zero error 
     Exit Function 
    End If 
    outResult = 42/p1 
    DoSomething = 0 'return code for OK - everything went well! 
End Function 

有了這種模式,每個程序是一個Function返回一個錯誤代碼;實際的返回值作爲一個ByRef /輸出參數傳遞,調用者就必須這樣做纔可以信任的結果:

Dim result As Double 
Dim e As Long 
e = DoSomething(42, result) 
If e = 0 Then 
    ' happy path 
Else 
    MsgBox Error$(e) ' error path 
End If 

On Error聲明簡化通過採取最錯誤處理的擔憂出來的代碼「快樂之路」。