MsgBox không tắt khi đóng form???

Liên hệ QC

doanhhoang79

Thành viên hoạt động
Tham gia
31/3/08
Bài viết
142
Được thích
18
Kính gửi các anh chị trong diễn đàn GPE

Tôi đang sử dụng form để nhập liệu. Trong đó tôi sử dụng textbox khi nhập liệu không đúng sẽ hiện lên thông báo. Code hoạt động tốt nhưng khi tôi tắt form thì Mesg vẫn xuất hiện khi click nút ok thì nó mới tắt. Tôi không tìm ra nguyên nhân mong các anh chị sửa giúp

Cảm ơn các anh chị!

Đoạn code của tôi:
Private Sub Ngaysinh_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If IsDate(Ngaysinh) = False
MsgBox ("Ban phai nhap dung dinh dang dd/mm/yyyy"), vbKey0, "Thông báo!"
Ngaysinh = ""
End If
End Sub
 
Kính gửi các anh chị trong diễn đàn GPE

Tôi đang sử dụng form để nhập liệu. Trong đó tôi sử dụng textbox khi nhập liệu không đúng sẽ hiện lên thông báo. Code hoạt động tốt nhưng khi tôi tắt form thì Mesg vẫn xuất hiện khi click nút ok thì nó mới tắt. Tôi không tìm ra nguyên nhân mong các anh chị sửa giúp

Cảm ơn các anh chị!

Đoạn code của tôi:
Private Sub Ngaysinh_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If IsDate(Ngaysinh) = False
MsgBox ("Ban phai nhap dung dinh dang dd/mm/yyyy"), vbKey0, "Thông báo!"
Ngaysinh = ""
End If
End Sub
Code của bạn bị lỗi dòng này
Mã:
If Not IsDate(Ngaysinh) [I][B][COLOR=Red]then[/COLOR]
MsgBox "Ban phai nhap dung dinh dang dd/mm/yyyy", vbOKOnly, "Thông báo"[/B][/I]
TDN
 
Upvote 0
Cảm ơn bác TDN, nhưng vấn đề là khi nhập liệu xong em đóng form lại thì nó vẫn xuất hiện MesgBox thông báo đó. Ý em là làm sao để khi tắt form đi thì MesgBox cũng tắt luôn.
 
Upvote 0
Cảm ơn bác TDN, nhưng vấn đề là khi nhập liệu xong em đóng form lại thì nó vẫn xuất hiện MesgBox thông báo đó. Ý em là làm sao để khi tắt form đi thì MesgBox cũng tắt luôn.
Bạn đã thay 2 dòng code trên vào và test lại chưa? Vì mình thấy với code đó, nếu không đúng giá trị ngày thì nó hiện Msgbox với 1 nút OK và bạn phải Click vào nút OK thì code mới chạy tiếp được. Khi Click vào nút OK tất nhiên Msgbox sẽ mất đi mà.

Ngoài ra, có lẽ bạn nên đưa File lên cho dễ test lỗi hơn.
TDN

 
Upvote 0
Ý bạn là sao mình chưa hiểu lắm, MsgBox sẽ biến mất khi mình nhấn ok mà
Bạn xem trong file đính kèm nhé
Thân
 

File đính kèm

Upvote 0
Vì bạn đặt code trong sự kiện Ngaysinh_BeforeUpdate nên khi Unload Form thì sự kiện này sẽ được thực hiện.
Bạn nên kiểm tra dữ liệu ngay trong sự kiện KeyDown, khống chế các ký tự được phép nhập vào, định dạng của chuỗi dữ liệu, bạn thử xem qua link này http://www.giaiphapexcel.com/forum/showthread.php?p=145611#post145611
 
Upvote 0
Vì bạn đặt code trong sự kiện Ngaysinh_BeforeUpdate nên khi Unload Form thì sự kiện này sẽ được thực hiện.
Bạn nên kiểm tra dữ liệu ngay trong sự kiện KeyDown, khống chế các ký tự được phép nhập vào, định dạng của chuỗi dữ liệu, bạn thử xem qua link này http://www.giaiphapexcel.com/forum/showthread.php?p=145611#post145611


Cảm ơn bạn,

gợi ý của bạn rất hay nhưng tôi muốn khi nhập không đúng thì co thông báo hiện lên yêu cầu người nhập phải nhập đúng định dạng thì phải làm sao???

Mong chỉ giáo,
 
Upvote 0
Bạn thử dùng code này xem:
Mã:
Private Sub Ngaysinh_AfterUpdate()
Me.Ngaysinh = Format(Me.Ngaysinh, "dd/mm/yyyy")
End Sub
Mã:
Private Sub Ngaysinh_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
 With Me.Ngaysinh
        If IsDate(.Value) Then
            .Value = Format(Me.Ngaysinh, "dd/mm/yyyy")
        Else
            Beep
 
            Cancel = True
            MsgBox "Ban phai nhap dung dinh dang dd/mm/yyyy", vbOKOnly, "Thong bao"
        End If
    End With
End Sub
Thân
 
Upvote 0
Vấn đề là nếu đặt trong sự kiện BeforeUpdate thì sau khi Unload form MesgBox vẫn thực thi.
Hay ta thử thay thế sự kiện BeforeUpdate thành Exit có được không???
 
Upvote 0
Kiểu gì thì cái msgbox kia vẫn chạy nếu đặt vào các sự kiện của textbox.
Theo tôi là hãy kiểm tra ngay sau khi nhập đủ 10 ký tự vào textbox trong đó cần khống chế các ký tự nhập vào
PHP:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If Not IsNumeric(Chr(KeyAscii)) Then KeyAscii = 0
    If Len(TextBox1.Text) >= 10 Then KeyAscii = 0
End Sub
Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    With TextBox1
        If Len(.Text) = 2 Then .Text = .Text & "/"
        If Len(.Text) = 5 Then .Text = .Text & "/"
        If Len(.Text) = 10 then
            Dim D%, Y%, M%
            D = Left(.Text, 2)
            M = Mid(.Text, 4, 2)
            Y = Right(.Text, 4)
            If DateSerial(Y, M, D) <> .Text Then Msgbox "Nhập sai định dạng ngày tháng"
        end if
    End With
End Sub

Tại sao không dùng Isdate mà lại dùng DateSerial?

Nếu dùng Isdate thì "31/12/2009" cùng cho ra cùng kết quả với "12/31/2009"
Vì tôi thấy nhiều máy tính hiện nay khi mua về hoặc khi cài đặt ta không quan tâm đến phần định dạng ngày tháng, tiền tệ, số... trong Language Setting nên hay bị nhầm lẫn về kiểu định dạng. Máy thì định dạng kiểu "mm/dd/yyyy" người sử dụng lại nhập vào là "dd/mm/yyyy"
 
Upvote 0
Kiểu gì thì cái msgbox kia vẫn chạy nếu đặt vào các sự kiện của textbox.
Theo tôi là hãy kiểm tra ngay sau khi nhập đủ 10 ký tự vào textbox trong đó cần khống chế các ký tự nhập vào
PHP:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If Not IsNumeric(Chr(KeyAscii)) Then KeyAscii = 0
    If Len(TextBox1.Text) >= 10 Then KeyAscii = 0
End Sub
Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    With TextBox1
        If Len(.Text) = 2 Then .Text = .Text & "/"
        If Len(.Text) = 5 Then .Text = .Text & "/"
        If Len(.Text) = 10 then
            Dim D%, Y%, M%
            D = Left(.Text, 2)
            M = Mid(.Text, 4, 2)
            Y = Right(.Text, 4)
            If DateSerial(Y, M, D) <> .Text Then Msgbox "Nhập sai định dạng ngày tháng"
        end if
    End With
End Sub

Tại sao không dùng Isdate mà lại dùng DateSerial?

Nếu dùng Isdate thì "31/12/2009" cùng cho ra cùng kết quả với "12/31/2009"
Vì tôi thấy nhiều máy tính hiện nay khi mua về hoặc khi cài đặt ta không quan tâm đến phần định dạng ngày tháng, tiền tệ, số... trong Language Setting nên hay bị nhầm lẫn về kiểu định dạng. Máy thì định dạng kiểu "mm/dd/yyyy" người sử dụng lại nhập vào là "dd/mm/yyyy"
Theo cách của bạn rất hay, tôi đã thử nghiệm ở file đính kèm. Tuy nhiên tôi muốn sau khi thông báo nhập không đúng định dạng click ok thì TextBox sẽ trắng luôn. Nếu để như bạn thì sau khi thông báo hiển nhiên là nó đã ngầm định đồng ý mất. Tôi có thêm "TextBox1="" nhưng không thấy gì. Cõ lẽ không đúng sự kiện KeyUp
 

File đính kèm

Upvote 0
Tôi thiếu mất số 1 ở câu lệnh TextBox1=""

Tôi phát hiện thấy nếu ta gõ phím "O" ở bàn phím liên tiếp sẽ xảy ra lỗi.
Và nếu ta chi nhập ngày tháng thôi thì không thấy MesgBox xuất hiện VD: nhập ngày 31/12

Mong các cao thủ xử lý 2 lỗi này.
 

File đính kèm

Upvote 0
Hì, xem qua thì thấy rằng bạn chưa rành về VB lắm.
1. Tôi gõ chữ "O" mỏi tay không thấy gì.
2. không xuất msgbox vì câu lệnh này If Len(.Text) = 10 then
Muốn xuất hiện thì phải phải thêm điều kiện: If len(.Text) <>10 then msgbox..... tức là kiểm tra xem đã nhập đủ số chưa. Tuy nhiên bạn sẽ hỏi đặt vào đâu và viết thế nào.
Việc kiểm tra này nếu đặt ngay vào các sự kiện của textbox thì lại quay trở lại vấn đề ban đầu. Vì thế tùy thuộc vào việc bạn sử dụng số liệu trong textbox khi nào thì kiểm tra khi đó.
Giả sử bạn muốn gán giá trị textbox vào cell thông qua 1 button thì bạn đưa toàn bộ đoạn mã kiểm tra kia vào trong sự kiện click
Ví dụ:
Private sub CommandButton1_Click()
With TextBox1
If Len(.Text) = 10 then
Dim D%, Y%, M%
D = Left(.Text, 2)
M = Mid(.Text, 4, 2)
Y = Right(.Text, 4)
If DateSerial(Y, M, D) <> .Text Then

.Text = ""
Msgbox "Nhập sai định dạng ngày tháng"
else
Cells(1,1).value = .text
End if
else
.Text = ""
Msgbox "Chưa nhập đủ số." & vbcrlf & "Yêu cầu nhập lại"
end if
End With
end sub
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom