Chỉ cho phép gõ số mà không cho gõ ký tự a, b, c,... vào Textbox (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

thanchetvnt

Thành viên chính thức
Tham gia
28/7/08
Bài viết
75
Được thích
21
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.

Bạn chép đoạn code này vào rồi tuỳ biến nhé!
PHP:
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
 
Upvote 0
Để đơn giản nhất bạn gán code như sau:

Mã:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If Not IsNumeric(Chr(KeyAscii)) Then KeyAscii = 0
End Sub
 

File đính kèm

Upvote 0
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.
Bạn thử xem nhé
Mã:
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
 
Upvote 0
Để đơn giản nhất bạn gán code như sau:

Mã:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If Not IsNumeric(Chr(KeyAscii)) Then KeyAscii = 0
End Sub

Code của sealand rất hay, nhưng còn 1 chỗ chưa hay! Vì sao? Nếu tôi muốn gõ 123.456 (dạng: ###0.000) đây là một dạng của số, vậy sao không được nhỉ???
 
Upvote 0
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
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
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 ?
 
Upvote 0
minhthien đã viết:
Code của sealand rất hay, nhưng còn 1 chỗ chưa hay! Vì sao? Nếu tôi muốn gõ 123.456 (dạng: ###0.000) đây là một dạng của số, vậy sao không được nhỉ???
dom đã viế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?

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.
 
Upvote 0
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!
 
Upvote 0
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 ạ.
 
Upvote 0
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.
 
Lần chỉnh sửa cuối:
Upvote 0
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.
 
Upvote 0
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.
 
Upvote 0
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
 
Upvote 0
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ụ:

Me.Textbox1= Val(Trim(Replace(Me.ListView1.SelectedItem.SubItems(9), ",", "")))

Em thấy làm như vậy sẽ tốn 3 hàm (Val, Trim, Replace), như vậy sẽ chậm hơn 1 tí, em chỉ tốn thêm phần toán tử thôi là giải quyết vấn đề:

Me.Textbox1= Me.ListView1.SelectedItem.SubItems(9) * 1

Cái này em mới phát hiện, mong các Thầy kiểm tra tính hiệu quả khi nhân 1 giá trị number ở dạng text cho 1 khi thực hiện trên Form.
 
Upvote 0
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ụ:

Me.Textbox1= Val(Trim(Replace(Me.ListView1.SelectedItem.SubItems(9), ",", "")))

Em thấy làm như vậy sẽ tốn 3 hàm (Val, Trim, Replace), như vậy sẽ chậm hơn 1 tí, em chỉ tốn thêm phần toán tử thôi là giải quyết vấn đề:

Me.Textbox1= Me.ListView1.SelectedItem.SubItems(9) * 1

Cái này em mới phát hiện, mong các Thầy kiểm tra tính hiệu quả khi nhân 1 giá trị number ở dạng text cho 1 khi thực hiện trên Form.
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)
 
Upvote 0
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)

Để em thử chuyển Region & Language trên máy em, xong em sẽ báo kết quả Thầy nhé!

Sau khi kiểm tra, em thấy vẫn không có gì thay đổi, kết quả vẫn cho ra đúng! Không biết trên các máy khác thế nào.
 
Lần chỉnh sửa cuối:
Upvote 0
Để em thử chuyển Region & Language trên máy em, xong em sẽ báo kết quả Thầy nhé!

Sau khi kiểm tra, em thấy vẫn không có gì thay đổi, kết quả vẫn cho ra đúng! Không biết trên các máy khác thế nào.
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,2341 phẩy 234 không ---> Nhân với 1 nó ra bao nhiêu?
 
Upvote 0
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,2341 phẩy 234 không ---> Nhân với 1 nó ra bao nhiêu?

Hiện tại, Trên máy em định dạng #,##0.00
1,234 khi thử nhân cho 1, nó ra kết quả 1234

Khi thử em định dạng ngược lại, #.##0,00
1.234 khi thử nhân cho 1, nó ra kết quả 1234

Như vậy, nó đúng với mọi định dạng (trên máy em).
 
Upvote 0
Hiện tại, Trên máy em định dạng #,##0.00
1,234 khi thử nhân cho 1, nó ra kết quả 1234

Khi thử em định dạng ngược lại, #.##0,00
1.234 khi thử nhân cho 1, nó ra kết quả 1234

Như vậy, nó đúng với mọi định dạng (trên máy em).
Ah.... không! Bạn hiểu sai ý tôi rồi
Ví dụ dử liệu trên TextBox là 1,234bạ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
 
Upvote 0
Ah.... không! Bạn hiểu sai ý tôi rồi
Ví dụ dử liệu trên TextBox là 1,234bạ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

Khi bẫy lỗi là Not IsNumeric thì đâu sợ nhập lộn hả Thầy??? Nó báo liền đấy!
 
Upvote 0
Khi bẫy lỗi là Not IsNumeric thì đâu sợ nhập lộn hả Thầy??? Nó báo liền đấy!
Vâng! Thì đúng là vậy... nhưng tôi đặt tình huống thế này:
- Control Panel đang set dấu chấm là dấu phân cách ngàn
- Bạn thì "tưởng" ngược lại (tưởng rằng dấu phân cách ngàn là dấu phẩy) và đã "lở tay" gõ vào 20 cái TextBox theo "kiểu" mà bạn đã tưởng
- Sau khi nhập liệu xong, bạn nhấn nút 1 nhát, nó báo lổi SỐ SAI QUY CÁCH ---> Vậy bạn làm sao? Sửa lại toàn bộ dử liệu trong 20 cái TextBox à?
- Trừ phi bạn gõ đến đâu, xử lý đến nấy... nhưng tôi cho rằng cách này không hay... vì... code phải xử lý liên tục làm chậm tiến trình
 
Upvote 0
Vâng! Thì đúng là vậy... nhưng tôi đặt tình huống thế này:
- Control Panel đang set dấu chấm là dấu phân cách ngàn
- Bạn thì "tưởng" ngược lại (tưởng rằng dấu phân cách ngàn là dấu phẩy) và đã "lở tay" gõ vào 20 cái TextBox theo "kiểu" mà bạn đã tưởng
- Sau khi nhập liệu xong, bạn nhấn nút 1 nhát, nó báo lổi SỐ SAI QUY CÁCH ---> Vậy bạn làm sao? Sửa lại toàn bộ dử liệu trong 20 cái TextBox à?
- Trừ phi bạn gõ đến đâu, xử lý đến nấy... nhưng tôi cho rằng cách này không hay... vì... code phải xử lý liên tục làm chậm tiến trình

Dạ, liệu những cái như Thầy nói liệu có áp dụng với Replace hay không? nếu Replace cái dấu phẩy (,) mà không là dấu chấm (.) ???

===> Nếu ta quy định loại control panel gì, thì mình quy ước theo cách gõ dấu hoặc replace nó theo kiểu đó! Thầy cũng thấy đó, việc nhân cho 1 số định dạng text ở ngay trong Excel khi nhân cho 1 nó cũng chuyển liền sang dạng number --> Form cũng theo quy tắc đó.
 
Upvote 0
Theo em nghĩ thì khi load form mình qui định cho nó 1 định dạng nào đó (Theo định dạng Anh chẳng hạn) rồi sau đó qui định nhập trong textbox là xong.

Khi load form sẽ cho về định dạng #,###.##

Mã:
Private Sub UserForm_Initialize()
With Application
        .DecimalSeparator = "."
        .ThousandsSeparator = ","
        .UseSystemSeparators = False
End With
End Sub

Qui định nhập trong textbox. Nếu nhập dấu chấm >=2 lần thì không cho nhập.

Mã:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If ((KeyAscii >= 32 And KeyAscii <= 45) Or _
        (KeyAscii = 47) Or (KeyAscii >= 58)) Then
    KeyAscii = 0
    End If
    If InStr(1, TextBox1.Text, ".") > 1 And KeyAscii = 46 Then
    KeyAscii = 0
    End If
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Ý của anh ndu96081631 là rủi hai máy định dang dấu thập phân khác nhau thì pó tay (Một máy dấu hàng ngàn là "." một máy là ","). Em thấy chỉ có cách như của anh domfootwear như bài 24 là khả thi thôi kiểm tra dấu thập phân và qui về 1 định dạng theo ý mình.
 
Upvote 0
Em thấy chỉ có cách như của anh domfootwear như bài 24 là khả thi thôi kiểm tra dấu thập phân và qui về 1 định dạng theo ý mình.
Vâng! Hướng đi là vậy, nhưng chú ý thế này
- Kiểm tra xem Control Panel đã thiết lập đúng ý ta chưa?
- Nếu chưa đúng, chỉnh lại thiết lập và lưu ý khi thoát file phải trả mọi thứ về như củ
- Nếu Control Panel đã đúng ---> Không làm gì cả
------------------------------------
Khi viết code ta không nên tự ý chỉnh bất cứ thứ gì trong máy của người khác, vì chắc chắn chẳng ai thích vậy bao giờ ---> Có chỉnh gì thì cũng "nhớ" trả về nguyên gốc
 
Upvote 0
Ý của anh ndu96081631 là rủi hai máy định dang dấu thập phân khác nhau thì pó tay (Một máy dấu hàng ngàn là "." một máy là ","). Em thấy chỉ có cách như của anh domfootwear như bài 24 là khả thi thôi kiểm tra dấu thập phân và qui về 1 định dạng theo ý mình.
Góp thêm 1 cách nhập số trong textbox:
- Nhập số trong bảng tính hay trong textbox thì không nên nhập dấu ngàn, nó làm cho việc nhập số chậm đi và sinh lỗi do nhập sai vi trí (trong bảng tính thì format number sẽ thêm dấu ngàn nếu muốn). Chỉ nhập dấu thập phân khi cần thiết (số thập phân buộc phải nhập, số nguyên không cần nhập).
- Do thói quen VN dấu thập phân là dấu phẩy, nên trong textbox vẫn nhập dấu phẩy bình thường. Khi cần lấy chuỗi trong texbox ra tính toán hay ghi vào bảng tính thì chuyển chuỗi đó thành số (không ảnh hưởng đến thiết lập trong Control Panel)
Từ ý trên, cách xử lý của tôi khi nhập vào textbox như sau:
- Chỉ cho nhập các số 0 > 9 và dấu phẩy.
- Không cho nhập liên tiếp 2 số 0 ở vị trí đầu tiên.
- Không cho nhập dấu phẩy ở vị trí đầu tiên và nhập dấu phẩy 2 lần.

Mã:
Private Sub Txt_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case 44
  If Len(Txt) = 0 Or InStr(1, Txt, ",") Then KeyAscii = 0
Case 48 To 57
  If Txt = "0" And KeyAscii = 48 Then KeyAscii = 0
Case Else
  KeyAscii = 0
End Select
End Sub

Xử lý textbox khi nhấn nút CommandButton1 sẽ ghi số vào ô A1
Mã:
Private Sub CommandButton1_Click()
Dim num As Double, nguyen As String, thapphan As String
If Right(Txt, 1) = "," Then Txt = Left(Txt, Len(Txt) - 1)
If InStr(1, Txt, ",") Then
  nguyen = Left(Txt, InStr(1, Txt, ",") - 1)
  thapphan = Mid(Txt, InStr(1, Txt, ",") + 1)
  num = nguyen + thapphan / (10 ^ Len(thapphan))
Else
  num = Txt
End If
[a1] = num
End Sub
 
Upvote 0
Thầy ơi, oạn code này:
PHP:
Private Sub CommandButton1_Click()
   Dim num As Double, nguyen As String, thapphan As String
   If Right(Txt, 1) = "," Then Txt = Left(Txt, Len(Txt) - 1)
   If InStr(1, Txt, ",") Then
     nguyen = Left(Txt, InStr(1, Txt, ",") - 1)
     thapphan = Mid(Txt, InStr(1, Txt, ",") + 1)
     num = nguyen + thapphan / (10 ^ Len(thapphan))
   Else
     num = Txt
   End If
    [a1] = num
End Sub
Em thấy hơi.. dư ---> Sao thầy không dùng Replace, đổi dấu phẩy thành Application.DecimalSeparator là tính toán được rồi, chẳng hạn:
PHP:
Private Sub CommandButton1_Click()
   Dim CheckUSS As Boolean
   CheckUSS = Application.UseSystemSeparators
   Application.UseSystemSeparators = True
   [a1] = CDbl(Replace(Txt.Value, ",", Application.International(3)))
   Application.UseSystemSeparators = CheckUSS
End Sub
- Code này cho phép nhập dấu phẩy ở vị trí đầu tiên luôn
Ví dụ: Nhập ,05 thì Excel nó hiểu đó là 0 phẩy 05
-
Sau khi hoàn tất, trả mọi thứ về nguyên gốc
 
Lần chỉnh sửa cuối:
Upvote 0
Theo em nghĩ thì khi load form mình qui định cho nó 1 định dạng nào đó (Theo định dạng Anh chẳng hạn) rồi sau đó qui định nhập trong textbox là xong.

Khi load form sẽ cho về định dạng #,###.##

Mã:
Private Sub UserForm_Initialize()
With Application
        .DecimalSeparator = "."
        .ThousandsSeparator = ","
        .UseSystemSeparators = False
End With
End Sub
Qui định nhập trong textbox. Nếu nhập dấu chấm >=2 lần thì không cho nhập.

Mã:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If ((KeyAscii >= 32 And KeyAscii <= 45) Or _
        (KeyAscii = 47) Or (KeyAscii >= 58)) Then
    KeyAscii = 0
    End If
    If InStr(1, TextBox1.Text, ".") > 1 And KeyAscii = 46 Then
    KeyAscii = 0
    End If
End Sub
Chào domfootwear
Bạn giúp luôn đọan code trả về nguyên gốc
 
Upvote 0
Bạn dùng code này để trả về:

Mã:
[LEFT][B][COLOR=black][FONT=Courier New] With Application[/FONT][/COLOR][/B][/LEFT]
 [B][COLOR=black][FONT=Courier New]      .UseSystemSeparators = True[/FONT][/COLOR][/B]
 
[LEFT][B][COLOR=black][FONT=Courier New] End With[/FONT][/COLOR][/B][/LEFT]
 
Upvote 0
Bạn dùng code này để trả về:

Mã:
[LEFT][B][COLOR=black][FONT=Courier New] With Application[/FONT][/COLOR][/B][/LEFT]
 [B][COLOR=black][FONT=Courier New]      .UseSystemSeparators = True[/FONT][/COLOR][/B]
 
[LEFT][B][COLOR=black][FONT=Courier New] End With[/FONT][/COLOR][/B][/LEFT]
Đây không phải là cách "TRẢ VỀ NGUYÊN GỐC" ---> Bạn làm sao biết trước đó người ta set UserSystemSeparators là TRUE hay FALSE
???
Vì thế, nhất định bạn phải đặt 1 biến kiểm tra, sau khi xong việc, thiết lập UserSystemSeparators = biến này (giống bài trên tôi vừa làm ấy)

 
Upvote 0
Bạn chép đoạn code này vào rồi tuỳ biến nhé!
PHP:
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
Không biết code cua anh bị sao mà cả hai máy đều bị lỗi Run time 438.Nó bị lỗi trong 2 truòng hợp là không nhập gì,vẫn hiện thông báo.Khi nhấn OK để tat hộp thoại thì bị lỗi.Nó cũng tương tụ như nhập TEXT.Còn số thì không có hề hấn gì.Anh xem lại thử
 
Upvote 0
Để chương trình của ta không ảnh hưởng gì đến thiết lập nguyên gốc ta dùng code sau:

Mã:
Public m_DecimalSeparator As String
Public m_ThousandsSeparator As String
Public m_UseSys As Boolean
[COLOR=Red]'------------------------------------------------------------------[/COLOR]
Sub Set_User()
With Application
m_UseSys = .UseSystemSeparators
m_DecimalSeparator = .DecimalSeparator
m_ThousandsSeparator = .ThousandsSeparator
.UseSystemSeparators = False
 .DecimalSeparator = ","
.ThousandsSeparator = "."
End With
End Sub
[COLOR=Red]'------------------------------------------------------------------
[/COLOR]Sub Set_General()
With Application
.UseSystemSeparators = False
 .DecimalSeparator = m_DecimalSeparator
.ThousandsSeparator = m_ThousandsSeparator
.UseSystemSeparators = m_UseSys
End With
End Sub
Khi load Form gọi Set_User
Khi Close Form gọi Set_General
 
Upvote 0
Không biết code cua anh bị sao mà cả hai máy đều bị lỗi Run time 438.Nó bị lỗi trong 2 truòng hợp là không nhập gì,vẫn hiện thông báo.Khi nhấn OK để tat hộp thoại thì bị lỗi.Nó cũng tương tụ như nhập TEXT.Còn số thì không có hề hấn gì.Anh xem lại thử

Tôi không biết bạn nói lỗi là lỗi gì, bạn xem file nhé!
 
Upvote 0

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

Back
Top Bottom