2014-10-14 33 views
6

Tôi biết bạn có thể dừng macro VBA đang chạy theo cách thủ công với Ctrl + Break, nhưng có cách nào để mã dừng tự động nếu đáp ứng một điều kiện nhất định không? exit function/exit sub không hoạt động, vì chúng chỉ kết thúc phương thức mà chúng được gọi bên trong.Làm cách nào để tự động dừng macro VBA?

Ví dụ,

sub a 
    call b 
    msgbox "a complete" 
end sub 

sub b 
    call c 
    msgbox "b complete" 'this msgbox will still show after the `exit sub` in 'c' 
end sub 

sub c 
    msgbox "entering c" 
    exit sub    'this will only `exit sub` 'c', but not 'a' or 'b' 
    msgbox "exiting c" 
end sub 

'OUTPUT: 

'entering c 
'b complete 
'a complete 

Tôi cho rằng tôi có thể biến những sub 's vào function' s và sử dụng mã trở lại biết nếu phương pháp này thực hiện thành công, nhưng là có một cách đơn giản hơn để làm điều này?

+0

Cũng giống như một mẹo chung, 'goto' là xấu. Không sử dụng nó. –

+0

http://stackoverflow.com/q/46586/436282 –

Trả lời

9

Bạn có thể tăng lỗi do người dùng xác định với err.raise. Điều này tương tự như ví dụ của bạn, nhưng mạnh hơn một chút ở chỗ nó là một lỗi thực sự sẽ ngăn chặn việc thực thi mã, ngay cả khi nó được áp dụng cho một cuộc gọi lồng nhau.

Ví dụ,

sub a 
on error goto exitCode 
    call b 
    msgbox "a complete" 
    exit sub  'you need this to prevent the error handling code from always running 
exitCode: 
    msgbox "code is exiting..." 
    'clean up code here 
end sub 

sub b 
    call c 
    msgbox "b complete" 
end sub 

sub c 
    msgbox "entering c" 
    err.raise 555, "foo", "an error occurred" 
    msgbox "exiting c" 
end sub 

'OUTPUT: 

'entering c 
'code is exiting... 

Dòng err.raise sẽ gửi điều khiển để nhãn exitCode: mặc dù nó được gọi là bên ngoài của a. Bạn có thể sử dụng bất kỳ điều kiện nào để kiểm tra xem có nên ném lỗi tùy chỉnh này hay không.

Thông tin thêm về các đối tượng err và lỗi VBA handling-

https://msdn.microsoft.com/en-us/library/ka13cy19(v=vs.90).aspx

http://www.cpearson.com/excel/errorhandling.htm

1

Tôi tin rằng muốn bạn muốn làm là nâng cao lỗi một lần nữa do lỗi xử lý mã của bạn. Hãy thử một cái gì đó như thế này (không kiểm tra):

Private Sub Test 
    On Error Goto bad 
    x = 0 
    debug.print 1/x 
    Exit Sub 

    bad: 
     'Clean up code 
     Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext 
End Sub 

Khi sử dụng On Error Goto, bạn cần một Exit Sub trước nhãn. Nếu không, mã của bạn sẽ rơi vào trình xử lý lỗi ngay cả khi không có lỗi.

Xử lý lỗi đầu tiên của bạn không phát hiện lỗi thực sự có thể xảy ra trong thời gian chạy khác với những gì bạn đang thử nghiệm. Ngoài ra, không có cách nào thuận tiện để báo hiệu chức năng gọi điện mà đã xảy ra sự cố trừ khi bạn thêm kiểm tra vào tất cả các thói quen gọi điện.

Lưu ý rằng nó thường được coi thiết kế xấu mặc dù để nâng cao một lỗi duy nhất để kiểm soát dòng chảy:

Private Sub Test 
    If x = 0 Then 
     Err.Raise 
    End If 
End Sub 
+0

Đây là những gì chúng tôi đã làm cho các dự án vb6 của chúng tôi. Bạn có thể không cần nó cho tất cả các chức năng mặc dù, chỉ là những nơi mà bạn muốn chạy mã sạch. Nó thực sự tùy thuộc vào bạn những gì bạn muốn sử dụng. – Ceres

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