Mình cần tạo ra một Textbox mà khi người sử dụng gõ số (1, 2,...,9) vào thì OK còn nếu gõ các ký tự khác (như a, b, c,....) thì nó không cho phép gõ vào. Bạn nào biết thì chỉ giúp mình với.
Cảm ơn nhiều.
Mình cần tạo ra một Textbox mà khi người sử dụng gõ số (1, 2,...,9) vào thì OK còn nếu gõ các ký tự khác (như a, b, c,....) thì nó không cho phép gõ vào. Bạn nào biết thì chỉ giúp mình với.
Cảm ơn nhiều.
Private Sub CommandButton1_Click()
If TextBox1 = "" Then
MsgBox "Ban chua nhap gi ca!", vbInformation, "Thông báo": TextBox1.SetFocus: Exit Sub
ElseIf Not IsNumeric(TextBox1) Then
MsgBox "Ban nhap la text!", vbInformation, "Thông báo"
TextBox1.SetFocus: TextBox1.SelStart = 0: TextBox1.SelLength = Len(TextBox1.Text): Exit Sub
Else
MsgBox "Ban nhap la number!", vbInformation, "Thông báo": Exit Sub
End If
End Sub
Mình cần tạo ra một Textbox mà khi người sử dụng gõ số (1, 2,...,9) vào thì OK còn nếu gõ các ký tự khác (như a, b, c,....) thì nó không cho phép gõ vào. Bạn nào biết thì chỉ giúp mình với.
Cảm ơn nhiều.
Private Sub TextBox1_Change()
If Not IsNumeric(TextBox1.Text) Then
MsgBox "Khong phai so"
TextBox1.SelStart = Len(TextBox1.Text) - 1: TextBox1.SelLength = 1
End If
End Sub
Mình nêu giải thuật thôi chứ các bạn phải hoàn thiện chứ.
Thôi thì mình hoàn thiện tiếp:
Nguyên tắc: Chỉ chấp nhận sô, dấu âm (-), dấu thập phân. Dấu âm chỉ gõ được khi là ký tự đầu tiên. Dấu thập phân chỉ gõ được khi đã có ký tự số.
Mình giả sử trên Form có rất nhiều textbox nhập số dạng này.
1. Trước hết, ta viết 1 hàm dùng chung, tránh viết đi viết lại code này nhiều lần
Mã:
Function ktra(ByVal ma As Integer, ByVal dai As Integer) As Integer
If IsNumeric(Chr(ma)) Then ktra = ma: Exit Function
If ma = 45 And dai = 0 Then ktra = 45: Exit Function
If ma = 46 And dai > 0 Then ktra = 46: Exit Function
ktra = 0
End Function
2/Ví dụ áp dụng cho textbox1:
Mã:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
KeyAscii = ktra(KeyAscii, Len(Trim(TextBox1)))
End Sub
Các TextBox khác cung viết tương tự. Các bạn bổ xung thêm để khi nhập số liệu ít bị sai sót nhất
Mình nêu giải thuật thôi chứ các bạn phải hoàn thiện chứ.
Thôi thì mình hoàn thiện tiếp:
Nguyên tắc: Chỉ chấp nhận sô, dấu âm (-), dấu thập phân. Dấu âm chỉ gõ được khi là ký tự đầu tiên. Dấu thập phân chỉ gõ được khi đã có ký tự số.
Mình giả sử trên Form có rất nhiều textbox nhập số dạng này.
1. Trước hết, ta viết 1 hàm dùng chung, tránh viết đi viết lại code này nhiều lần
Mã:
Function ktra(ByVal ma As Integer, ByVal dai As Integer) As Integer
If IsNumeric(Chr(ma)) Then ktra = ma: Exit Function
If ma = 45 And dai = 0 Then ktra = 45: Exit Function
If ma = 46 And dai > 0 Then ktra = 46: Exit Function
ktra = 0
End Function
2/Ví dụ áp dụng cho textbox1:
Mã:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
KeyAscii = ktra(KeyAscii, Len(Trim(TextBox1)))
End Sub
Các TextBox khác cung viết tương tự. Các bạn bổ xung thêm để khi nhập số liệu ít bị sai sót nhất
Còn 1 vấn đề nữa là khi nhập dấu chấm (vbKeyDecimal) 2 lần thì nó vẫn cho, có cách nào khắc phục là chỉ cho 1 cái thôi, 2 cái trở lên thì không cho không anh ?
Còn 1 vấn đề nữa là khi nhập dấu chấm (vbKeyDecimal) 2 lần thì nó vẫn cho, có cách nào khắc phục là chỉ cho 1 cái thôi, 2 cái trở lên thì không cho không anh?
Sao phải làm phức tạp vấn đề lên thế nhỉ? Chỉ cho nhập số, thì dùng IsNumeric() là được rồi. Đương nhiên cho phép dấu thập phân, và chỉ cho phép 1 dấu. Còn dấu thousand seperator thì dùng định dạng cho nó hiện lên, chả ai trên đời gõ số mà muốn bỏ công gõ cái dấu đó cả. Dấu thập phân có người còn không muốn gõ nữa kia, đơn cử là các giáo viên nhập điểm số cho học sinh ấy.
Sao phải làm phức tạp vấn đề lên thế nhỉ? Chỉ cho nhập số, thì dùng IsNumeric() là được rồi. Đương nhiên cho phép dấu thập phân, và chỉ cho phép 1 dấu. Còn dấu thousand seperator thì dùng định dạng cho nó hiện lên, chả ai trên đời gõ số mà muốn bỏ công gõ cái dấu đó cả. Dấu thập phân có người còn không muốn gõ nữa kia, đơn cử là các giáo viên nhập điểm số cho học sinh ấy.
Em đồng ý với sư phụ!
Em nghĩ vầy: Nhập sao thì cứ việc ---> Sau đó nếu TÍNH TOÁN KHÔNG ĐƯỢC thì chứng tỏ số nhập tào lao ---> Lại quay về TextBox mà nhập lại ---> Thế thôi!
Em đồng ý với sư phụ!
Em nghĩ vầy: Nhập sao thì cứ việc ---> Sau đó nếu TÍNH TOÁN KHÔNG ĐƯỢC thì chứng tỏ số nhập tào lao ---> Lại quay về TextBox mà nhập lại ---> Thế thôi!
Muốn nhập vào giá trị là number, đừng nên chọn [A1] = Val(Textbox1) theo em chúng ta nên chọn như vầy là chắc ăn nhất bảo toàn được số thập phân cũng như cả dấu phân cách là dấu phẩy (,): [A1] = Textbox1 * 1 Nếu dùng Val(Textbox1) sẽ bị hiện tượng code sẽ hiểu sau dấu phân cách (,) là text, nó chỉ lấy số trước dấu phân cách. Các Thầy có công nhận điều này không, bởi đôi khi có người quen tay gõ dấu phân cách thì sao?
@ Thầy PTM: Số thập phân dù ghi hay không ghi vẫn là dạng số, ở cty em mà không ghi cái số thập phân ấy là chết liền, bởi vì trọng lượng tính bằng tấn mà "1000.999 mts" thì số lẻ của nó thôi (999) đã chiếm gần 1 tấn hàng rồi Thầy ạ.
Thầy PTM: Số thập phân dù ghi hay không ghi vẫn là dạng số, ở cty em mà không ghi cái số thập phân ấy là chết liền, bởi vì trọng lượng tính bằng tấn mà "1000.999 mts" thì số lẻ của nó thôi (999) đã chiếm gần 1 tấn hàng rồi Thầy ạ.
Minhthien hiểu sai ý lão chết tiệt rồi. Không gõ cái dấu thập phân, chứ không phải là không gõ số thập phân. Nghĩa là nếu điểm số là 3.1 thì gõ 31, điểm số là 5 thì gõ 50. Sau đó xử lý số đó (chia 10 chẳng hạn), nhằm mục đích gõ nhanh. Thậm chí tạo form thế nào để gõ xong 2 ký tự số như vậy khỏi cần nhấn enter nó cũng biến đi để gõ tiếp nữa đó. Trên GPE có khá nhiều giáo viên hỏi cách nhập liệu kiểu này.
Ai mà dám bỏ số thập phân đâu, có khi chỉ vì thiếu 0.1 điểm thi mà dang dở 1 đời người.
Các Thầy có công nhận điều này không, bởi đôi khi có người quen tay gõ dấu phân cách thì sao?
Ai quen tay gõ dấu phân cách hàng ngàn như thế nhỉ? Lão chết tiệt chưa hề thấy!
Khi người ta phải nhập liệu hàng ngày trên 100 dòng, thì sẽ thấy gõ cái dấu phân cách hàng ngàn là vô bổ, dư thửa và mất thì giờ. Thậm chí gõ 1 con số cũng không muốn gõ thừa 1 ký tự nữa kia.
Thế này nhé, nhập liệu thì nhập liệu từ chứng từ, đúng không? Thế mắt nhìn chứng từ, tay gõ, thì có đọc (nhẩm) 1 triệu hai trăm ba mươi bảy ngàn năm trăm sáu mươi hai chấm ba không? Đọc vậy gõ vậy thì chết. Chỉ đọc (nhẩm) một hai ba bảy năm sáu hai chấm ba thôi, đọc tới đâu gõ tới đó mới nhanh được.
Chỉ khi phải gõ văn bản trong Word thì bất đắc dĩ mới phải gõ dấu phân cách hàng ngàn thôi.
Sáng giờ mình có việc với Ngân hàng, chưa tham gia với mọi người được.
Yêu cầu của Topic này hoàn toàn chính đáng và là yêu cầu của rất nhiều bạn khác.Nhu cầu khống chế nhập liệu này là rất thiết thực trong việc áp dụng vào thực tiễn. Ví dụ hàng ngày mình nhập hàng trăm phiếu thu chi, nhập xuất mà lại bằng máy xách tay thì sai sót khó tránh được. May mà các phần mềm họ tổ chức bẫy lỗi khá tốt nên việc nhập sai quy tắc ít khi xảy ra. Có điều mình là dân nghiệp dư nên nghiên cứu tham khảo chưa thấu đáo, chưa có 1 giải pháp hoàn thiện. Vậy mọi người cùng lưu tâm xây dựng 1 giải pháp để tham khảo trong những trường hợp tương tự, tránh mầy mò mất nhiều thời gian.
Kính mong các nhà lập trình, các bạn có nhiều kinh nghiệm trong vấn đề này lên tiếng để anh em có cơ hội học hỏi thêm.
Mình nêu giải thuật thôi chứ các bạn phải hoàn thiện chứ.
Thôi thì mình hoàn thiện tiếp:
Nguyên tắc: Chỉ chấp nhận sô, dấu âm (-), dấu thập phân. Dấu âm chỉ gõ được khi là ký tự đầu tiên. Dấu thập phân chỉ gõ được khi đã có ký tự số.
Mình giả sử trên Form có rất nhiều textbox nhập số dạng này.
1. Trước hết, ta viết 1 hàm dùng chung, tránh viết đi viết lại code này nhiều lần
Mã:
Function ktra(ByVal ma As Integer, ByVal dai As Integer) As Integer
If IsNumeric(Chr(ma)) Then ktra = ma: Exit Function
If ma = 45 And dai = 0 Then ktra = 45: Exit Function
If ma = 46 And dai > 0 Then ktra = 46: Exit Function
ktra = 0
End Function
2/Ví dụ áp dụng cho textbox1:
Mã:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
KeyAscii = ktra(KeyAscii, Len(Trim(TextBox1)))
End Sub
Các TextBox khác cung viết tương tự. Các bạn bổ xung thêm để khi nhập số liệu ít bị sai sót nhất
Cách này rất hay nhưng khi ta gõ chữ có dấu nó vẫn nhận. Ví dụ khi gõ chữ a thì nó không hiện ra nhưng gõ tiếp chữ s thì nó hiện thành chữ á. Xử lý thế nào đây bác ơi.
Cách này rất hay nhưng khi ta gõ chữ có dấu nó vẫn nhận. Ví dụ khi gõ chữ a thì nó không hiện ra nhưng gõ tiếp chữ s thì nó hiện thành chữ á. Xử lý thế nào đây bác ơi.
Tôi nghĩ bạn khó mà thực hiện được yêu cầu này lắm... vì khi bạn gõ thì chương trình gõ tiếng Việt (như Unikey) có can thiệp vào quá trình Hook bàn phím nên bị... "loạn"
Nhớ không lầm thì yêu cầu loại này đã từng đăng trên diển đàn và đã... VÔ PHƯƠNG GIẢI QUYẾT
Cách tốt nhất: Nghe lời sư ptm0412 đi
Trước tiên em cám ơn Thầy PMT, khi dùng Textbox ngăn text thì không phải nói lại rồi, xài IsNumeric là tối ưu nhất.
Sẳn đây em muốn rộng hơn nữa là khi ta sửa từ 1 Listbox hay 1 Listview, dạng có số thập phân, định dạng "#,##0.000", thì khi sửa lại, chuyển ngược lên Form ta thường làm như sau:
Ví dụ:
Trước tiên em cám ơn Thầy PMT, khi dùng Textbox ngăn text thì không phải nói lại rồi, xài IsNumeric là tối ưu nhất.
Sẳn đây em muốn rộng hơn nữa là khi ta sửa từ 1 Listbox hay 1 Listview, dạng có số thập phân, định dạng "#,##0.000", thì khi sửa lại, chuyển ngược lên Form ta thường làm như sau:
Ví dụ:
Lở Control Panel trên 1 máy khác quy định dấu phân cách ngàn là dấu chấm thì làm sao mà nhân với 1 được chứ ---> Replace là hợp lý rồi (không chậm đâu)
Lở Control Panel trên 1 máy khác quy định dấu phân cách ngàn là dấu chấm thì làm sao mà nhân với 1 được chứ ---> Replace là hợp lý rồi (không chậm đâu)
Thử với số 1,234 xem (tức số 1234 đang định dạng có dấu phân cách ngàn là dấu phẩy)
Nếu trên máy bạn, Control Panel đang thiết lập dấu chấm là dấu phân cách ngàn, còn dấu phẩy là dấu thập phân ---> Vậy có phải nó sẽ hiểu 1,234 là 1 phẩy 234 không ---> Nhân với 1 nó ra bao nhiêu?
Thử với số 1,234 xem (tức số 1234 đang định dạng có dấu phân cách ngàn là dấu phẩy)
Nếu trên máy bạn, Control Panel đang thiết lập dấu chấm là dấu phân cách ngàn, còn dấu phẩy là dấu thập phân ---> Vậy có phải nó sẽ hiểu 1,234 là 1 phẩy 234 không ---> Nhân với 1 nó ra bao nhiêu?
Ah.... không! Bạn hiểu sai ý tôi rồi
Ví dụ dử liệu trên TextBox là 1,234 và bạn chưa biết trước Control Panel đang định dạng dấu phân cách là gì thì làm sao bạn "dám" nhân với 1
Ý tôi là vậy ---> Do bạn biết trước quy định của Control Panel và đã gõ đúng chuẩn thì đương nhiên nó phải ra kết quả đúng rồi