Chỉ cho phép gõ số mà không cho gõ ký tự a, b, c,... vào Textbox

Liên hệ QC

thanchetvnt

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

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

Back
Top Bottom