Thanhhoai00
Thành viên chính thức
- Tham gia
- 19/7/20
- Bài viết
- 58
- Được thích
- 13
GỢI Ý:
- Mình có đoạn code như sau
- Mình muốn người dùng chỉ được nhập vào Textbox Userform những số nhỏ hơn 30 ( chỉ được phép nhập vào Textbox Userform số từ 0 tới 29 )
- Mình phải code thế nào , các bạn giúp mình xíu nhé
- Cảm ơn các bạn rất nhiều ạ !!!!
Cảm ơn bạn nhiều ạ !!GỢI Ý:
Bạn muốn có thông báo thì thế này:
Private Sub TextBox1_Change()
If Val(TextBox1.Value) > 29 Or Val(TextBox1.Value) < 1 Then
MsgBox "Chi duoc nhap so lon hon 0 va nho hon 30!"
End If
End Sub
Còn chỉ đơn thuần muốn xóa dữ liệu nhập sai thì:
Private Sub TextBox1_Change()
If Val(TextBox1.Value) > 29 Or Val(TextBox1.Value) < 1 Then
TextBox1.Value = ""
End If
End Sub
(Chưa xét đến người dùng nhập 1 ký tự dạng chuỗi)
Sử dụng sự kiện change khiến cho mỗi ký tự gõ vào/ xoá bớt đều chạy code. Nếu muốn bắt nhập lại thì dùng BeforeUpdate với tham số Cancel = True, nếu không bắt nhập lại thì dùng AfterUpdateGỢI Ý:
Bạn muốn có thông báo thì thế này:
Private Sub TextBox1_Change()
(Chưa xét đến người dùng nhập 1 ký tự dạng chuỗi)
Cám ơn bác! Vụ sự kiện của các công cụ userform này tôi ít làm nên không rành. Do đó chỉ dám ghi gợi ý thôi.Sử dụng sự kiện change khiến cho mỗi ký tự gõ vào/ xoá bớt đều chạy code. Nếu muốn bắt nhập lại thì dùng BeforeUpdate với tham số Cancel = True, nếu không bắt nhập lại thì dùng AfterUpdate
Đa số người dùng không biết hết các sự kiện sử dụng trên form và chỉ dùng Change, kể cả 1 số thành viên GPE từng tạo những form hoành tráng.Cám ơn bác! Vụ sự kiện của các công cụ userform này tôi ít làm nên không rành. Do đó chỉ dám ghi gợi ý thôi.
Không phải luôn luôn người ta dùng popup để báo lỗi.Đa số người dùng không biết hết các sự kiện sử dụng trên form và chỉ dùng Change, kể cả 1 số thành viên GPE từng tạo những form hoành tráng.
Bạn sử dụng một trong hai sự kiện dưới đây để bẫy lỗi:Cám ơn bác! Vụ sự kiện của các công cụ userform này tôi ít làm nên không rành. Do đó chỉ dám ghi gợi ý thôi.
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If TextBox1.Text = "" Then Exit Sub
If Val(TextBox1.Text) > 29 Then
Cancel = True
MsgBox "Ban chi duoc nhap tu 0 den 29", vbOKOnly + vbCritical, "THÔNG BÁO"
TextBox1.Text = ""
End If
End Sub
Hoặc:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If TextBox1.Text = "" Then Exit Sub
If Val(TextBox1.Text) > 29 Then
Cancel = True
MsgBox "Ban chi duoc nhap tu 0 den 29", vbOKOnly + vbCritical, "THÔNG BÁO"
TextBox1.Text = ""
End If
End Sub
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If Not IsNumeric(ChrW(KeyAscii)) Then KeyAscii = 0
End Sub
Hay quá , cảm ơn bạn nhiều ạ !Bạn sử dụng một trong hai sự kiện dưới đây để bẫy lỗi:
Mã:Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) If TextBox1.Text = "" Then Exit Sub If Val(TextBox1.Text) > 29 Then Cancel = True MsgBox "Ban chi duoc nhap tu 0 den 29", vbOKOnly + vbCritical, "THÔNG BÁO" TextBox1.Text = "" End If End Sub Hoặc: Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) If TextBox1.Text = "" Then Exit Sub If Val(TextBox1.Text) > 29 Then Cancel = True MsgBox "Ban chi duoc nhap tu 0 den 29", vbOKOnly + vbCritical, "THÔNG BÁO" TextBox1.Text = "" End If End Sub
Nhưng bạn cần phải có thêm một sự kiện ngăn người khác nhập không phải là SỐ, nếu nhập chữ thì nó ngăn không cho nhập:
Mã:Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) If Not IsNumeric(ChrW(KeyAscii)) Then KeyAscii = 0 End Sub
Nếu hiểu là không cho nhập chứ không phải nhập sai thì xóa thì chắc phải dùng sự kiện KeyPress.chỉ được phép nhập vào Textbox Userform số từ 0 tới 29
Cứ gõ 1 ký tự là chạy code? Xoá 1 ký tự cũng chạy code? Người dùng lỡ tay gõ 22 muốn back 2 cái để gõ lại 11 thì code chạy 6 lần?Với bài nhập số này thì dùng sự kiện Change() là hợp lý hơn cả.
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'set MaxLength = 2
Select Case KeyAscii
Case 48 To 57
If Len(Me.TextBox1.Value) - Me.TextBox1.SelLength = 1 Then
If Me.TextBox1.SelStart = 0 Then
If KeyAscii > 50 Then KeyAscii = 0
Else
If CLng(Left(Me.TextBox1.Value, 1)) > 2 Then KeyAscii = 0
End If
End If
Case Else
KeyAscii = 0
End Select
If KeyAscii = 0 Then Beep
End Sub
Thời buổi này ai mà còn bíp nữa.If KeyAscii = 0 Then Beep
Bíp là thông báo trong code gốc của chủ thớt.Thời buổi này ai mà còn bíp nữa.
1. làm việc chung một phòng, cứ bíp hoài thiên hạ chửi thúi đầu.
2. vừa làm việc vừa đặt tai nghe nhạc, còn phya mới để ý đến bíp.
Đúng rồi đó anh.
Ai tay dẻo có thể shift home rồi gõ 11 cũng được.
Tất tần tật chỉ kiểm tra 1 lần lúc nhấn tab/ enter, ... bằng BeforeUpdate không nhẹ nhàng hơn hay sao?Bài này làm thêm trường hợp số thập phân nữa, và trường hợp khi nhập một hay nhiều số 0 ở đầu vẫn hợp lệ.
Nhẹ nhàng cho ai vậy bạn?Tất tần tật chỉ kiểm tra 1 lần lúc nhấn tab/ enter, ... bằng BeforeUpdate không nhẹ nhàng hơn hay sao?
Cho cái máy chạy codeNhẹ nhàng cho ai vậy bạn?
Có tất cả 3 đối tượng liên quan đến cái form này:
1. thớt
2. người dùng form
3. dân code trên GPE