2010-12-29 46 views
13

Tôi mới dùng VBA và muốn trả về từ một hàm khi tôi thấy lỗi. Không thể làm được. Bất kỳ con trỏ?VBA - Trả về từ một hàm trong trường hợp lỗi

Function GetEditboxValue(control As IRibbonControl, text As String) As String 

    If Not IsMissing(text) Then 
     If Not IsNumeric(text) Then 
      MsgBox "Please enter numeric value only." 
      ' I WANT TO RETURN HERE 
     End If 
    End If 


    If control.id = "xyz" Then 
    spaceAboveTable = text 
    End If 


End Function 
+1

Bạn nhận ra rằng chức năng của bạn không trả về giá trị, phải không? Trong VBA, một hàm không trả về một giá trị phải được khai báo là 'Sub'. Nếu không, bạn sẽ muốn gán một giá trị cho 'GetEditboxValue' trước khi thoát khỏi hàm. (Rõ ràng, đây là trường hợp bạn không muốn thoát sớm * mà không * trả về một giá trị.) –

+1

Không được quên, chức năng này trông rất xấu xí. Thay vì trả lại một giá trị, từ một hộp chỉnh sửa (cái tên ngụ ý), điều duy nhất nó có vẻ là làm cho một số tác dụng phụ khó chịu - cho bạn một nhức đầu bảo trì sớm hay muộn. Thay vì tách phát hiện lỗi khỏi xử lý lỗi, nó tự xử lý các lỗi bằng MsgBox. Tốt hơn nên tách biệt các mối quan tâm này, nếu văn bản không phải là số, trả về giá trị lỗi hoặc tăng sự kiện lỗi hoặc điều gì đó như thế này, nhưng hãy để người gọi quyết định xem có muốn hiển thị hộp tin nhắn hay xử lý lỗi khác không. –

+0

@Cody, Chỉ cần làm rõ nhận xét của bạn cho @ydobonmai, tất cả các thói quen được khai báo là các hàm sẽ trả về một giá trị. Nếu bạn không chỉ định chính xác giá trị * what * với một dòng như 'GetEditboxValue = ' thì hàm của bạn sẽ trả về bất kỳ giá trị mặc định nào cho loại hàm này. Trong trường hợp này là chuỗi rỗng, nhưng có thể là 0, "", False, Empty, Nothing, v.v. – jtolle

Trả lời

26

Bạn cần phải đặt EXIT FUNCTION đó để thoát khỏi thực hiện thêm:

Function GetEditboxValue(control As IRibbonControl, text As String) As String 

    If Not IsMissing(text) Then 
     If Not IsNumeric(text) Then 
      MsgBox "Please enter numeric value only." 
      EXIT FUNCTION 
     End If 
    End If 


    If control.id = "xyz" Then 
    spaceAboveTable = text 
    End If 


End Function 
+0

@Sarfraj, tôi có một câu hỏi VBA ở đây: - http://stackoverflow.com/questions/4565185/iterating-xml-nodes-using-vba. Bạn có thể giúp. –

+2

Hoặc EXIT SUB nếu nó là một chương trình con, thay vì một hàm. –

1

Bạn có thể sử dụng Exit Function sau MsgBox tuyên bố của bạn

0

Một lựa chọn khác là nâng cao một cách rõ ràng một lỗi sử dụng Err.Raise. Vì bạn không có trình xử lý lỗi nào trong hàm này (tức là, không có đường dây On Error ...), lỗi sẽ được truyền lên thông qua ngăn xếp cuộc gọi cho đến khi nó chạy vào trình xử lý lỗi.

4

Trong một ý nghĩa tổng quát (Tôi không thực sự nói bất cứ điều gì mà không được nói):

Function Foo(inputVar As Double) As Double 

    On Error GoTo ErrorHandler 

    ' Code assigning something to returnValue and defaultOutput 

    Foo = returnValue 

    Exit Function 

    ErrorHandler: 

    Foo = defaultOutput 

End Function 

Không có lý do nó đã được đôi, dĩ nhiên rồi.

(Edited bởi vì tôi đã có một "Exit Function" thứ hai thay vì "End Function.")

Các vấn đề liên quan