Hỏi về sự khác nhau giữa End và Exit Sub (3 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Quang_Hải

Thành viên gạo cội
Tham gia
21/2/09
Bài viết
6,073
Được thích
8,004
Nghề nghiệp
Làm đủ thứ
Các anh chị vui lòng giải thích hộ sự khác nhau giữu End và Exit Sub

Ví dụ như câu lệnh này
If Not IsArray(x) Then
MsgBox "No Files Were Selected"
Exit Sub
......

Nếu ta thay Exit Sub bằng câu lệnh End thì kết quả đều như nhau
 
Lần chỉnh sửa cuối:
Mình có 1 ví dụ tí ti thế này để bạn chiêm nghiệm

Mã:
Sub Test()
Dim Tb 
Tb = Cong()
MsgBox Tb
End Sub
'-----------------------
Function Cong()
Dim i
For i = 1 To 10
Cong = Cong + i
If i = 5 Then End
Next
End Function

Bạn chạy Sub Test kiểm tra kết quả và thay End trong hàm Cong băng Exit Function rồi kiểm tra kết quả sẽ thấy cái khác nhau của nó. Từ đây bạn sẽ thấy khi sử dụng lệnh End phải cân nhắc tránh ảnh hưởng đến Code khác đang chạy.
 
Lần chỉnh sửa cuối:
Upvote 0
End là lệnh là chấm dứt - ngưng không chạy VBA code nữa.
Exit Sub là lệnh chấm dứt cái sub đang chạy - và trở về cái code gọi nó.

Nếu sub do Application gọi không qua một sub khác thì End và Exit Sub kết quả như nhau. (*)
Nếu sub A do một sub B gọi thì Exit Sub (và End Sub) trong A sẽ trở về đoạn code nối tiếp trong Sub B, trong khi đó End trong A sẽ ngưng luôn.

(*) theo tôi hiểu thì End sẽ bảo VBA nhả hết các resources mà VBA đang nắm giữ (vd lock DataBase) trong khi Exit thì không. Tuy nhiên cái này tôi chưa thử nên không chắc - viết code mà không có phần nhả resources thì hơi khiếm khuyết nên tôi chưa thử bao giờ.
 
Upvote 0
Các anh chị vui lòng giải thích hộ sự khác nhau giữu End và Exit Sub

Ví dụ như câu lệnh này
If Not IsArray(x) Then
MsgBox "No Files Were Selected"
Exit Sub
......

Nếu ta thay Exit Sub bằng câu lệnh End thì kết quả đều như nhau
sao lâu lâu anh Hải cho 1 câu độc ác vậy!
theo em thì cái end sub và exit sub về cơ bản thì giống nhau, nhưng nó sẽ khác nhau. Trong 1 sub thì có thể có vài exit sub nhưng end sub chỉ sử dụng duy nhất 1 lần trong 1 sub " theo em là vậy"

anh text cái này đi rồi tự cho kết qua
Sub text()If [a1] > 10 Then
[b1].Value = 10
End Sub
Else
[b1].Value = "lalalalala"
End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Được biết, End là thủ tục giải phóng toàn bộ bộ nhớ, mà khi đã giải phóng thì nó sẽ DỪNG thực thi mọi thao tác của VBA, chẳng hạn thủ tục đang thực thi, các UserForm đang mở ... thì nó tắt hết tất cả.

Khi dùng End thì chắc rằng chỉ có 1 thủ tục mà chứa End chạy thôi, còn không sẽ gây ra nhiều phiền toái cho các thủ tục đang chạy đồng thời khác.
 
Upvote 0
Mình thấy tuỳ cơ mà sử dụng cũng hay, ví dụ thế này khỏi phải rào chắn ở Sub. Nếu không có End thì nhập khác 1 ,2 thì Sub lỗi ngay.

Mã:
Sub Test()
Dim Chon
Chon = InputBox("Nhap 1 hoac 2")
MsgBox Sheet1.Range(Vung(Chon)).Address
End Sub

'----------------------

Function Vung(ByVal k) As String
If k = 1 Then
Vung = "A2:C10"
ElseIf k = 2 Then
Vung = "G1:H10"
Else
MsgBox "Tam bay roi"
End
End If
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Mình thấy tuỳ cơ mà sử dụng cũng hay, ví dụ thế này khỏi phải rào chắn ở Sub. Nếu không có End thì nhập khác 1 ,2 thì Sub lỗi ngay.

Mã:
Sub Test()
Dim Chon, Rg As Range
Chon = InputBox("Nhap 1 hoac 2")
MsgBox Sheet1.Range(Vung(Chon)).Address
End Sub

'----------------------

Function Vung(ByVal k) As String
If k = 1 Then
Vung = "A2:C10"
ElseIf k = 2 Then
Vung = "G1:H10"
Else
MsgBox "Tam bay roi"
End
End If
End Function

Đương nhiên rồi Thầy ạ, nếu ta biết vận dụng thì thuốc độc cũng có thể cứu người, còn không thì ăn lắm vào cũng bội thực.

Mình biết dùng lỗi để bẫy lỗi thì còn gì bằng nữa Thầy ơi. Vấn đề là nếu ta chưa nắm rõ nguyên tắc hoạt động của nó thì ta đừng có đụng vào nó.
 
Upvote 0
Đương nhiên rồi Thầy ạ, nếu ta biết vận dụng thì thuốc độc cũng có thể cứu người, còn không thì ăn lắm vào cũng bội thực.

Mình biết dùng lỗi để bẫy lỗi thì còn gì bằng nữa Thầy ơi. Vấn đề là nếu ta chưa nắm rõ nguyên tắc hoạt động của nó thì ta đừng có đụng vào nó.

Đúng rồi, dùng dao thì phải thận trọng hơn.
Mình cũng bị dạng thế này tìm mãi mới biết lý do mất biến Public
Ví dụ:
Mã:
Option Explicit
Public Heso
'-------------
Sub Test()
Dim Chon, Rg As Range
Heso = 3
Chon = InputBox("Nhap 1 hoac 2")
MsgBox Sheet1.Range(Vung(Chon)).Address
End Sub
'-----------------
Function Vung(ByVal k) As String
If k = 1 Then
Vung = "A2:C10"
ElseIf k = 2 Then
Vung = "G1:H10"
Else
MsgBox "Tam bay roi"
End
End If
End Function
'------------
Sub Test2()
MsgBox Heso
End Sub
Nếu nhập chuẩn ta chạy Test2 vẫn còn nguyên Heso, nhưng không chuẩn mà dùng End mất tiêu biến Heso
 
Upvote 0
Web KT

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

Back
Top Bottom