Làm sao để không cho sự kiện Combobox_Exit hoạt động khi bấm nút thoát?

Liên hệ QC

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,662
Được thích
16,720
Giới tính
Nam
Tôi có một Form, 1 Combobox, 1 Textbox, 1 CommandButton.

Tôi đặt sự kiện Exit cho Combobox, nhưng gặp vấn đề là khi bấm nút Thoát, tôi muốn sự kiện này không hoạt động, vậy phải làm sao?

Sự kiện:
Khi gõ số khác với dãy số cột A lên Cobobox, thì chọn vào các control khác sẽ thông báo.

Vậy làm thế nào Khi bấm nút Thoát, để Combobox không chạy sự kiện Exit?

Xin vui lòng xem File.
 

File đính kèm

Mình không tải nổi file nên đành nói chay vậy. Cách đơn giản nhất là
1/Khi 1 biến toàn cục như sau:

Option Explicit
Public ktra As Boolean


2/Trong code
Private Sub ListBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)

If Not ktra Then
.................Code của bạn
end if
End Sub

3/ Thêm 1 Code như sau:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
ktra = True
End Sub

Thử xem nha
 
Upvote 0
Mình không tải nổi file nên đành nói chay vậy. Cách đơn giản nhất là
1/Khi 1 biến toàn cục như sau:

Option Explicit
Public ktra As Boolean


2/Trong code
Private Sub ListBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)

If Not ktra Then
.................Code của bạn
end if
End Sub

3/ Thêm 1 Code như sau:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
ktra = True
End Sub

Thử xem nha
Ý của minhthien muốn vầy: Nếu bấm vào nút Thoát (CommandButton1) thì phải bỏ qua sự kiện Exit của ComboBox
Vậy ta sẽ nghĩ ra tạo 1 biến kiểu Boolean để khống chế
Có điều chưa chắc giữa 2 sự kiện ComboBox_ExitCommandButton_Click cái nào sẽ làm việc trước đây?
Chỉ e vừa bấm vào CommandButton là sự kiện Exit của ComboBox đã giành quyền làm việc trước rồi ---> Thế cũng bằng không
 
Upvote 0
Ý của minhthien muốn vầy: Nếu bấm vào nút Thoát (CommandButton1) thì phải bỏ qua sự kiện Exit của ComboBox
Vậy ta sẽ nghĩ ra tạo 1 biến kiểu Boolean để khống chế
Có điều chưa chắc giữa 2 sự kiện ComboBox_ExitCommandButton_Click cái nào sẽ làm việc trước đây?
Chỉ e vừa bấm vào CommandButton là sự kiện Exit của ComboBox đã giành quyền làm việc trước rồi ---> Thế cũng bằng không

Ndu thử xem và nhận xét xem có gì không ổn không? (Dúng ra chỉ dùng nút Close thì OK, chứ dùng Cmd thì còn vướng bước di chuyển)
 
Lần chỉnh sửa cuối:
Upvote 0
Ndu thử xem và nhận xét xem có gì không ổn không? (Dúng ra chỉ dùng nút Close thì OK, chứ dùng Cmd thì còn vướng bước di chuyển)
Với mục đích không cho nhập khác với list (giống Validation)... vậy sao ta không set Style Property cho ComBoBox = 2 ---> Như vậy ta chỉ có thể chọn dữ liệu từ list mà không thể gõ bậy bạ vào được
Và như thế thì không cần sự kiện ComboBox_Exit, cũng không cần luôn sự kiện ComboBox_KeyPress
Đơn giản hóa vấn đề
 
Upvote 0
Với mục đích không cho nhập khác với list (giống Validation)... vậy sao ta không set Style Property cho ComBoBox = 2 ---> Như vậy ta chỉ có thể chọn dữ liệu từ list mà không thể gõ bậy bạ vào được
Và như thế thì không cần sự kiện ComboBox_Exit, cũng không cần luôn sự kiện ComboBox_KeyPress
Đơn giản hóa vấn đề

Vấn đề em muốn Việt hóa cái msgbox chứ nếu không em đã chọn giải pháp này rồi Thầy ạ, vã lại, khi sử dụng thuộc tính này, nó không cho mình gõ, mà phải chọn, trong khi nếu thao tác bằng phím có khi nhanh hơn nhấp chuột, khi đã bấm chọn rồi nó không cho xóa, nó vẫn để 1 giá trị trong combobox đó. Điều kiện của mình là khi nhập liệu, có hay không giá trị tại đó cũng được, nhưng đã có thì phải là giá trị trong list. Nếu nó không cho xóa thì thật là bực mình.


Với lại em không cho nút Close hoạt động, chỉ sử dụng nút Close (mà có nó sự kiện này cũng hoạt động).

P/s: Chắc chắn sự kiện Exit có trước, rồi sự kiện Enter đến control khác mới có sau, vậy mới khó ăn chứ!
 
Lần chỉnh sửa cuối:
Upvote 0
Vấn đề em muốn Việt hóa cái msgbox chứ nếu không em đã chọn giải pháp này rồi Thầy ạ!
Chỉ vì muốn có cái MsgBox tiếng Việt nên bằng mọi giá phải ra cho được cái MsgBox ---> Nghe có vẽ buồn cười nha
-------------
Nếu vậy thôi dùng dùng ComBoBox nữa, dùng TextBox mà gõ, sẽ hiện ra 1 listbox những thứ có liên quan (Filter2DArray) ---> Nếu ListBox không hiện gì, chứng tỏ đã nhập sai
Vậy có khoẻ hơn không?
-------------
Tóm lại: Nếu không làm được theo hướng này thì ta tìm hướng khác, cố gắng chỉ thêm mất công
 
Upvote 0
Chỉ vì muốn có cái MsgBox tiếng Việt nên bằng mọi giá phải ra cho được cái MsgBox ---> Nghe có vẽ buồn cười nha
-------------
Nếu vậy thôi dùng dùng ComBoBox nữa, dùng TextBox mà gõ, sẽ hiện ra 1 listbox những thứ có liên quan (Filter2DArray) ---> Nếu ListBox không hiện gì, chứng tỏ đã nhập sai
Vậy có khoẻ hơn không?
-------------
Tóm lại: Nếu không làm được theo hướng này thì ta tìm hướng khác, cố gắng chỉ thêm mất công

Dĩ nhiên như Thầy nói thì có nhiều hướng để làm, nhưng em phải hỏi trước hướng này có giải quyết được không, nếu được thì em được học hỏi thêm cái mới, và nếu không được thì lúc đó mình chuyển hướng cũng chưa muộn mà! Ẹc ... Ẹc ...
 
Upvote 0
Cuối cùng mình cũng "khống chế" được sự kiện Exit hoạt động! Với một cái Boolean kết hợp với sự kiện MouseMove là OK.

Toàn bộ thủ tục trong Form như sau:

PHP:
Dim isExit As Boolean

''===========================================================================================================================
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    isExit = True
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = 0 Then Cancel = 1
End Sub

''===========================================================================================================================
Private Sub ComboBox1_Enter()
    isExit = True
End Sub

Private Sub ComboBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If Not IsNumeric(Chr(KeyAscii)) Then KeyAscii = 0
End Sub

Private Sub ComboBox1_Change()
    TextBox1.Enabled = True
End Sub

Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If ComboBox1 = "" Or Val(ComboBox1) = 0 Then Exit Sub
    If isExit = False Then Exit Sub
    If WorksheetFunction.CountIf(Range("MaSo"), ComboBox1) = 0 Then
        MsgBox "Ban nhap chua dung!"
        TextBox1.Enabled = False
        With ComboBox1
            .SetFocus: .SelStart = 0: .SelLength = Len(.Text)
        End With
    End If
End Sub

''===========================================================================================================================
Private Sub TextBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    isExit = True
End Sub

''===========================================================================================================================
Private Sub CommandButton1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    isExit = False
End Sub

Private Sub CommandButton1_Click()
    Unload Me
End Sub

'===========================================================================================================================
 
Upvote 0
Web KT

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

Back
Top Bottom