Hỏi về Exit sub

Liên hệ QC

aviaiva

Thành viên thường trực
Tham gia
17/8/08
Bài viết
316
Được thích
242
em sử dụng cái Private Sub Worksheet_Change
PHP:
Private Sub Worksheet_Change(ByVal Target As Range) .............................End Sub

có nghĩa là trong vùng điều kiện cho phép cứ có thay đổi trong các range là sub trên chạy.

Tuy nhiên em tạo một macro chạy tự động làm cả vùng thay đổi, em muốn khi em chạy macro này cái Private Sub Worksheet_Change phải thoát, chạy xong thì Private Sub Worksheet_Change lại hoạt động bình thường, có cách nào làm được thế không mong các bác chỉ giáo.

Em xin cảm ơn
 
em sử dụng cái Private Sub Worksheet_Change
PHP:
Private Sub Worksheet_Change(ByVal Target As Range) .............................End Sub

có nghĩa là trong vùng điều kiện cho phép cứ có thay đổi trong các range là sub trên chạy.

Tuy nhiên em tạo một macro chạy tự động làm cả vùng thay đổi, em muốn khi em chạy macro này cái Private Sub Worksheet_Change phải thoát, chạy xong thì Private Sub Worksheet_Change lại hoạt động bình thường, có cách nào làm được thế không mong các bác chỉ giáo.

Em xin cảm ơn
Có nhiều cách để làm điều này. Nhưng để dễ dàng điều khiển thì đơn giản nhất là bạn khai 1 biến tổng thể kiểu Boolean, ví dụ: setChange, trong sự kiện Change của WorkSheet, bạn thêm vào câu IF:
Sub Worksheet_Change...
If not setChange then Exit Sub
End Sub

Trong thân macro của bạn, ngay khi vào thì đặt: setChange = False; kết thúc thì setChange = True.
(ngoài ra, bạn có thể tìm hiểu thêm lệnh Application.EnableEvents)
 
Upvote 0
Có nhiều cách để làm điều này. Nhưng để dễ dàng điều khiển thì đơn giản nhất là bạn khai 1 biến tổng thể kiểu Boolean, ví dụ: setChange, trong sự kiện Change của WorkSheet, bạn thêm vào câu IF:
Sub Worksheet_Change...
If not setChange then Exit Sub
End Sub

Trong thân macro của bạn, ngay khi vào thì đặt: setChange = False; kết thúc thì setChange = True.
(ngoài ra, bạn có thể tìm hiểu thêm lệnh Application.EnableEvents)

hai sub của em có cùng vùng change giống nhau, tuy nhiên nó lại có 2 tác dụng khác nhau.

Sub1: chỉ khi nào người dùng nhấn button thì mới chạy (khi chạy thì tự động change toàn vùng)

Private Sub Worksheet_Change : của em thì cứ người dùng thao tác thì chạy luôn

em muốn có một câu lệnh
kiểu

PHP:
 if sub1 chạy then 

Private Sub Worksheet_Change exit
     else
end if

hoặc
PHP:
Private Sub Worksheet_Change(ByVal Target As Range) 

if sub1 chạy then 

exit sub

End Sub
hoặc
PHP:
 sub1 ()
Private Sub Worksheet_Change exit

câu lệnh của sub 1

end sub
macro của em toàn reco, biến này, biến kia em chịu

mong các bác giúp đỡ
 
Upvote 0
macro của em toàn reco, biến này, biến kia em chịu

mong các bác giúp đỡ
Bài 2 đã nói rất rõ, nếu bạn chưa hiểu thì có cách nông dân thế này:
- Khi Sub1 chạy, gán số hoặc chữ gì đó vào cell IV1
- Trong sự kiện Worksheet_Change, ta đặt điều kiện: Nếu IV1 <> "" thì sẽ chạy ---> Chạy xong, xóa cell IV luôn
Đại khái thế
 
Upvote 0
Bài 2 đã nói rất rõ, nếu bạn chưa hiểu thì có cách nông dân thế này:
- Khi Sub1 chạy, gán số hoặc chữ gì đó vào cell IV1
- Trong sự kiện Worksheet_Change, ta đặt điều kiện: Nếu IV1 <> "" thì sẽ chạy ---> Chạy xong, xóa cell IV luôn
Đại khái thế
em cảm ơn bác rất rất nhiều,

em hiểu nhưng em không biết viết code kiểu chính quy,

em chỉ có thể reco macro rồi chỉnh sửa thôi.

Thôi em cứ tống file lên các bác xem qua rồi cho em cái code chuẩn luôn.

Tại sheet GVS:

PHP:
Private Sub Worksheet_Change(ByVal Target As Range) .............................End Sub

có tác dụng là khi người dùng chọn lớp bị trùng tiết tại 1 ô khác thì sẽ xóa tiết trùng ở ô cũ

Còn sub xep tkb thì tự động thay đổi ....
khi sub xepTKB của em chạy thì đồng nghĩa với Private Sub Worksheet_Change chạy em muốn khi sub xepTKB chạy thì Private Sub Worksheet_Change tự động exit.

muốn làm mà lực bất tòng tâm, google rồi nhưng không thấy nên em chỉ còn biết nhờ các bác
 

File đính kèm

  • 30-8-12M.rar
    149.8 KB · Đọc: 29
Upvote 0
em cảm ơn bác rất rất nhiều,

em hiểu nhưng em không biết viết code kiểu chính quy,

em chỉ có thể reco macro rồi chỉnh sửa thôi.

Thôi em cứ tống file lên các bác xem qua rồi cho em cái code chuẩn luôn.

Tại sheet GVS:

PHP:
Private Sub Worksheet_Change(ByVal Target As Range) .............................End Sub

có tác dụng là khi người dùng chọn lớp bị trùng tiết tại 1 ô khác thì sẽ xóa tiết trùng ở ô cũ

Còn sub xep tkb thì tự động thay đổi ....
khi sub xepTKB của em chạy thì đồng nghĩa với Private Sub Worksheet_Change chạy em muốn khi sub xepTKB chạy thì Private Sub Worksheet_Change tự động exit.

muốn làm mà lực bất tòng tâm, google rồi nhưng không thấy nên em chỉ còn biết nhờ các bác
Ở trên chỉ là gợi ý thôi, bạn phải tự mình tìm cách mà ráp vào
Bạn đưa cả 1 rừng lên thế ai mà đủ kiên nhẫn để làm đây
(file bạn hoành tráng thế, lý nào chỉ chuyện nhỏ lại làm khó được bạn???)
 
Upvote 0
Ở trên chỉ là gợi ý thôi, bạn phải tự mình tìm cách mà ráp vào
Bạn đưa cả 1 rừng lên thế ai mà đủ kiên nhẫn để làm đây
(file bạn hoành tráng thế, lý nào chỉ chuyện nhỏ lại làm khó được bạn???)
hoành tráng gì đâu bác, khó đâu em hỏi đó, chính vì nó là một mớ lùng nhùng nên lúc đầu em không muốn đưa file lên sợ các bác không có thời gian xem.

Thực sự là em không thể làm được, em chỉ muốn một đoạn code trong sub xepTKB có dạng

PHP:
Sub XepTKB_SANG()
Application.ScreenUpdating = flase

sub Worksheet_Chang exit => cái này em chịu không biết viết thế nào

Range("d4:ag304").ClearContents
If Sheets("PCCM").Range("aa2") <> "" Then
    Range(Cells(4, 76 + 1 * Sheets("PCCM").Range("w2")), Cells(304, 76 + 1 * Sheets("PCCM").Range("w2"))).ClearContents
 .................................................
End If
Next
BoXungTietThieuS
Sheets("GVS").Select
Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub
Private Sub Worksheet_Change của em
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
hang = Selection.Row
cot = Selection.Column   
For I = 4 To 33        
If Cells(hang, 35) >= 0 And Cells(hang, I) = Cells(hang, cot) And Cells(hang, cot) <> "" And Cells(hang, I) <> "" And I <> cot And _        Application.CountIf(Range(Cells(4, I), Cells(304, I)), Cells(hang, cot)) > 1 Then            
Cells(hang, I).ClearContents        
Else        
End If    
Next
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
hoành tráng gì đâu bác, khó đâu em hỏi đó, chính vì nó là một mớ lùng nhùng nên lúc đầu em không muốn đưa file lên sợ các bác không có thời gian xem.

Thực sự là em không thể làm được, em chỉ muốn một đoạn code trong sub xepTKB có dạng

PHP:
Sub XepTKB_SANG()
Application.ScreenUpdating = flase

sub Worksheet_Chang exit => cái này em chịu không biết viết thế nào

Range("d4:ag304").ClearContents
If Sheets("PCCM").Range("aa2") <> "" Then
    Range(Cells(4, 76 + 1 * Sheets("PCCM").Range("w2")), Cells(304, 76 + 1 * Sheets("PCCM").Range("w2"))).ClearContents
 .................................................
End If
Next
BoXungTietThieuS
Sheets("GVS").Select
Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub
Private Sub Worksheet_Change của em
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
hang = Selection.Row
cot = Selection.Column   
For I = 4 To 33        
If Cells(hang, 35) >= 0 And Cells(hang, I) = Cells(hang, cot) And Cells(hang, cot) <> "" And Cells(hang, I) <> "" And I <> cot And _        Application.CountIf(Range(Cells(4, I), Cells(304, I)), Cells(hang, cot)) > 1 Then            
Cells(hang, I).ClearContents        
Else        
End If    
Next
End Sub
Gợi ý sơ qua thế này
PHP:
Public bChk as Boolean ''<--- Cái này để ở dòng trên cùng của module
Sub XepTKB_SANG()
  bChk = True
  ''.... Code của bạn
  bChk = False
End Sub

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  If bChk = False then
    ''.... code của bạn
  End If
End Sub
Đại khái thế
 
Upvote 0
To anh NDU

Nếu lúc mình thực hiện macro, mình gán 1 giá trị nào đó cho 1 biến trên bộ nhớ, rồi lấy giá trị biến đó để làm điều kiện cho sự kiện Sheet_change được không vậy anh?
 
Upvote 0
Gợi ý sơ qua thế này
PHP:
Public bChk as Boolean ''<--- Cái này để ở dòng trên cùng của module
Sub XepTKB_SANG()
  bChk = True
  ''.... Code của bạn
  bChk = False
End Sub

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  If bChk = False then
    ''.... code của bạn
  End If
End Sub
Đại khái thế

Sơ qua gì bác, quá đầy đủ với em rồi, cảm ơn bác
 
Upvote 0
To anh NDU

Nếu lúc mình thực hiện macro, mình gán 1 giá trị nào đó cho 1 biến trên bộ nhớ, rồi lấy giá trị biến đó để làm điều kiện cho sự kiện Sheet_change được không vậy anh?

Nếu cần Bạn có thể lưu trên regedit

Ví dụ bạn có một biến nghề nghiệp:
Mã:
Sub test()
    Dim Nghenghiep
    SaveSetting "TP.HCM", "TanBinh", "TranVanA", "Bacsy" 'luu gia tri
    Nghenghiep = GetSetting("TP.HCM", "TanBinh", "TranVanA") ' lay gia tri
    MsgBox Nghenghiep
    DeleteSetting "TP.HCM" ' xoa khoi regedit
    Nghenghiep = GetSetting("TP.HCM", "TanBinh", "TranVanA") 'thu lai xem còn ko
    MsgBox Nghenghiep
End Sub
 
Upvote 0
em sử dụng cái Private Sub Worksheet_Change
PHP:
Private Sub Worksheet_Change(ByVal Target As Range) .............................End Sub

có nghĩa là trong vùng điều kiện cho phép cứ có thay đổi trong các range là sub trên chạy.

Tuy nhiên em tạo một macro chạy tự động làm cả vùng thay đổi, em muốn khi em chạy macro này cái Private Sub Worksheet_Change phải thoát, chạy xong thì Private Sub Worksheet_Change lại hoạt động bình thường, có cách nào làm được thế không mong các bác chỉ giáo.

Em xin cảm ơn

Sao không dùng Application.EnableEvents thử

ví dụ:
Mã:
Sub abc()
    Application.EnableEvents = False
    Range("A1") = 1
    Application.EnableEvents = True
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address(0, 0) = "A1" Then MsgBox "Xinchao"
End Sub
 
Upvote 0
Web KT
Back
Top Bottom