Nhờ chỉ giúp cách Exit Sub của 1 Thủ tục nằm trong 1 Thủ tục khác (Thoát hoàn toàn)

Liên hệ QC

hung2412

Thành viên tích cực
Tham gia
5/8/08
Bài viết
929
Được thích
240
Giới tính
Nam
Xin chào các bạn GPE!
Tôi có 1 thủ tục Sub trong VBA Excel là Lam_luong_cho_CBCNV, trong thủ tục Sub Lam_luong_cho_CBCNV tôi có lồng vào đó 1 thủ tục nữa là Check_Ho_ten. Khi chạy Code đến giai đoạn nằm trong thủ tục Check_Ho_ten thì gặp 1 điều kiện không thỏa mãn nào đó thì sẽ Exit Sub thủ tục Check_Ho_ten và chương trình chạy Code quay trở lại Sub Lam_luong_cho_CBCNV. Vấn đề ở đây là làm thế nào để chương trình chạy Code khi Exit Sub thủ tục Check_Ho_ten thì sẽ thoát hoàn toàn luôn (Mà không quay trở lại Sub Lam_luong_cho_CBCNV)?
Mã:
Sub Lam_luong_cho_CBCNV()
'Code ...'
    'Chạy Code của Check_Ho_ten:'
    Check_Ho_ten
'Code...'
End Sub
Mã:
Sub Check_Ho_ten()
'Code...
'Không thỏa mãn điều kiện thì Exit Sub (Thoát hoàn toàn khỏi VBA luôn mà không quay trở lại thủ tục Lam_luong_cho_CBCNV):
If  ...             then
    ...
    Exit Sub
End if
End Sub
 

File đính kèm

  • Exit Sub.xls
    35 KB · Đọc: 4
Lần chỉnh sửa cuối:
Xin chào các bạn GPE!
Tôi có 1 thủ tục Sub trong VBA Excel là Lam_luong_cho_CBCNV, trong thủ tục Sub Lam_luong_cho_CBCNV tôi có lồng vào đó 1 thủ tục nữa là Check_Ho_ten. Khi chạy Code đến giai đoạn nằm trong thủ tục Check_Ho_ten thì gặp 1 điều kiện không thỏa mãn nào đó thì sẽ Exit Sub thủ tục Check_Ho_ten và chương trình chạy Code quay trở lại Sub Lam_luong_cho_CBCNV. Vấn đề ở đây là làm thế nào để chương trình chạy Code khi Exit Sub thủ tục Check_Ho_ten thì sẽ thoát hoàn toàn luôn (Mà không quay trở lại Sub Lam_luong_cho_CBCNV)?
Mã:
Sub Lam_luong_cho_CBCNV()
'Code ...'
    'Chạy Code của Check_Ho_ten:'
    Check_Ho_ten
'Code...'
End Sub
Mã:
Sub Check_Ho_ten()
'Code...
'Không thỏa mãn điều kiện thì Exit Sub (Thoát hoàn toàn khỏi VBA luôn mà không quay trở lại thủ tục Lam_luong_cho_CBCNV):
If  ...             then
    ...
    Exit Sub
End if
End Sub
Chổ Exit Sub thay bằng End.
 
Upvote 0
Chổ Exit Sub thay bằng End.
Thế mà hồi nào giờ code hoài mà không biết vụ này. Do không biết nên nếu sub phụ không thỏa điều kiện, tôi sẽ gán True vào 1 biến Public dạng Boolean. Ở sub chính nếu biến là True thì Exit sub
 
Upvote 0
Thế mà hồi nào giờ code hoài mà không biết vụ này. ...
Cái này hồi mấy năm trước có bàn rồi. Nó thuộc về loại code "bom nguyên tử". Dùng một thời ghian sau, sẽ xảy ra tình trạng file đang update dang dở mà code nó ngừng hổng chạy nữa.

...tôi sẽ gán True vào 1 biến Public dạng Boolean. Ở sub chính nếu biến là True thì Exit sub
Theo nguyên tắc, muốn hàm con kêu hàm mẹ tắt thì sửa hàm con lại thành Function. Nếu trả về trị nào đó thì tắt.
 
Upvote 0
Cái này hồi mấy năm trước có bàn rồi. Nó thuộc về loại code "bom nguyên tử".


Theo nguyên tắc, muốn hàm con kêu hàm mẹ tắt thì sửa hàm con lại thành Function. Nếu trả về trị nào đó thì tắt.
Đúng như anh nói, thật ra nó là con dao 2 lưỡi. Trước khi dùng End phải khôi phục một số thứ thiết lập trước đó, nên thông thường thì mình sẽ dùng hàm trả về boolean sẽ tốt hơn.
 
Upvote 0
Trước khi dùng End phải khôi phục một số thứ thiết lập trước đó
A gọi B đi chơi, B gọi C chơi cùng, C bất ngờ bị mẹ gọi về vì bạn trai đến chơi nhà. C bỏ cuộc chơi, B cũng bỏ cuộc chơi, duy có A là vẫn muốn chơi tiếp. dùng End thì giải tán tất cả, A sẽ ấm ức vì hành vi của C lắm.
Bài đã được tự động gộp:

Bạn không thích chuyển thành hàm thì làm như tôi nói ở bài #3
Cũng đang hình dung cách làm của bạn nè!
 
Upvote 0
Không cần biến Public, nếu không muốn dùng Function hoặc nó đã là Function trả về kế quả khác thì dùng một tham biến Byref kiểu Boolean là được.
Rich (BB code):
Sub Lam_luong_cho_CBCNV()
Dim bCheck As Boolean
'Code ...'
    'Chạy Code của Check_Ho_ten:'
    Check_Ho_ten bCheck
    If Not bCheck Then Exit Sub
'Code...'
End Sub
Rich (BB code):
Sub Check_Ho_ten(Byref bCheck As Boolean)
a mãn điều kiện thì Exit Sub (Thoát hoàn toàn khỏi VBA luôn mà không quay trở lại thủ tục Lam_luong_cho_CBCNV):
If ... then
    ...
    Exit Sub
End if
bCheck = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Sub Lam_luong_cho_CBCNV()
'Code ...'
'Chạy Code của Check_Ho_ten:'
If Check_Ho_ten < 0 Then Exit Sub
'Code...'
End Sub

Function Check_Ho_ten() As Integer
'Code...
'Không thỏa mãn điều kiện thì Exit Function và báo lỗi cho thủ tục Lam_luong_cho_CBCNV:
If ... then
Check_Ho_Ten = -1
Exit Function

End if
End Function

Chú thích:
Nếu Function trả về nhiều giá trị khác nhau thì dùng Select Case. Trường hợp kinh điển của hàm giải phương trình bậc 2:

Select Case GiaiPTB2(a, b, c, x1, x2)
Case 0
' vô nghiệm
Case 1
' 1 nghiệm kép
Case 2
' 2 nghiệm
Case Else
' vô số nghiệm
End Select

Function GiaiPTB2(byVal a As Double, byVal b As Double, byVal c As Double, byRef x1 As Double, byRef x2 As Double) As Integer
...
End Function

Nếu thêm một tham số byRef để dùng để xét số nghiệm thì phải gọi Function/Sub rồi sau đó mới xét biến chứa số nghiệm

Sub GiaiPTB2(byVal a As Double, byVal b As Double, byVal c As Double, byRef x1 As Double, byRef x2 As Double, byRef soNghiem As Integer)

GiaiPTB2 a, b, c, x1, x2, soNghiem
If soNghiem =...
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom