Textbox để nhập số hiện giống như máy tính bỏ túi

  • Thread starter Thread starter SoiBien
  • Ngày gửi Ngày gửi
Liên hệ QC

SoiBien

Thành viên tiêu biểu
Tham gia
3/9/07
Bài viết
734
Được thích
609
Để tiện cho các bạn nhập số liệu có nhiều số, mình đang xây dựng cái Textbox Calculator_Screen như thế này, Khi nhập sẽ hiển thị luôn cả dấu phân chia hàng ngàn, dấu thập phân (khi có), số âm, không cho nhập ký tự.
Chỉ sử dụng với các máy có Regional Setting cho Decimal là dấu "." và Digit Grouping là dấu "," (Cái này là mặc định trên hầu hết máy tính)
các bạn cứ dùng thử rồi cho ý kiến nhé.

Đây là code cho Textbox
PHP:
Option Explicit
Private Sub txtscreen_Change()
Dim Value As String
Dim strFmt As String
Dim i As Integer
Value = txtscreen.Text
strFmt = ""
If Value Like "*" & "." & "*" & "." & "*" Then Value = Left(Value, Len(Value) - 1)
'check valid character
If Not (IsNumeric(Value) _
    Or Value = "-" _
    Or Value = "." _
    Or Value = "-0" _
    Or Value = "-." _
    Or Value = "-0.") _
    Or Right(Value, 1) = "," Then
        If Len(Value) > 0 Then Value = Left(Value, Len(Value) - 1)
Else
    ' Check Negative value with many 0 leader
    If Not (Left(Value, 1) = "-" And Val(Value) = 0) Then
        'start string Format
        strFmt = "#,##0"
        'check if it is Decimal or not
        If Value Like "*" & "." & "*" Then
            strFmt = strFmt & "."
            For i = 1 To Len(Value) - InStr(1, Value, ".")
                'Increse Zero Number after Decimal
                strFmt = strFmt & 0
            Next
        End If
        strFmt = strFmt ' & ";-" & strFmt
        Value = Format(Value, strFmt)
    End If ' End check negative value with many 0 leader
End If ' End check valid Character
txtscreen.Text = CStr(Value)
End Sub

thân.
 

File đính kèm

Lần chỉnh sửa cuối:
ui trời, sao phải làm thê cho phức tạp, chỉ dùng 1 dòng code nhỏ là được rồi mà
 
Upvote 0
linhdt đã viết:
ui trời, sao phải làm thê cho phức tạp, chỉ dùng 1 dòng code nhỏ là được rồi mà
Bạn cho hỏi cái code nhỏ mà bạn nói nó như thế nào? Có thể post lên cho mọi người tham khảo dc ko?
ANH TUẤN
 
Upvote 0
Em thường dùng thuộc tính FormatNumber của textbox cũng có thể phân cách được. Text1 = FormatNumber(Text1.Text)
Không biết có hiểu đúng ý của anh Soibien không?+-+-+-+
 
Lần chỉnh sửa cuối:
Upvote 0
Em làm vậy được không anh/-*+/

PHP:
Private Sub txtscreen_Change()
Me.txtscreen = Format(Me.txtscreen.Value, "#,##0")
End Sub
 
Upvote 0
Tks Sky!
Cái mà mình muốn đề cập là User gõ tới đâu, nó tự hiển thị tới đó, còn dùng lệnh FormatNumber không thôi thì phải dùng sự kiện After Update.
 
Upvote 0
Tks Darkmoon!

Cái đó thì chỉ nhập được số nguyên thôi D ơi! nhập được cả chữ cái luôn!
 
Upvote 0
Vậy thì dùng afterupdate, còn vụ nhập chữ thì dùng presskey kiểm soát cho đơn giản.

Thân!
 
Upvote 0
Upvote 0
SoiBien đã viết:
Mình đề cập chuyện này bác Bap ơi!


Cái này chắc phải dùng Onchange thôi chứ đúng không bác?

Cũng có thể, tớ thì hay dùng presskey hơn, vì nó kiểm soát tốt hơn.

Thân!
 
Upvote 0
Làm như bạn SoiBien cũng là được rồi. Theo kinh nghiệm và tôi đã nhìn các mã nguồn của các "Đại gia" thì người ta dùng các sự kiện WM_KEYDOWN (WM_KEY*), hay là KEYDOWN,KEYPRESS. Việc dùng sự kiện CHANGE như cách của SoiBien, cứ mỗi một giá trị được nhập thì lại phải chạy lại vòng lặp For i=1 To Len(Value) điều này có ảnh hưởng tới tốc độ xử lý (nếu khối lượng TextBox ít thì không sao).
 
Upvote 0
TuanVNUNI đã viết:
Làm như bạn SoiBien cũng là được rồi. Theo kinh nghiệm và tôi đã nhìn các mã nguồn của các "Đại gia" thì người ta dùng các sự kiện WM_KEYDOWN (WM_KEY*), hay là KEYDOWN,KEYPRESS. Việc dùng sự kiện CHANGE như cách của SoiBien, cứ mỗi một giá trị được nhập thì lại phải chạy lại vòng lặp For i=1 To Len(Value) điều này có ảnh hưởng tới tốc độ xử lý (nếu khối lượng TextBox ít thì không sao).

Bạn có thể nói rõ hơn dùm mình được không? Theo ý mình, thì code trên chỉ chạy khi mình đang nhập dữ liệu tại textbox đó? vậy thì nhiều hay ít textbox đâu có liên hệ đâu phải không bạn?

Còn dùng KeyPress thì liệu có phải xử lý vòng lặp để đếm số lượng ký tự sau dấu chấm?

Mong được hướng dẫn thêm, cho cái Calculator_Screen_Textbox này nhìn nó Pro hơn :D

Thành thật xin lỗi các bạn, ở Code trước mình bị sai ở chỗ không thể nhập được các số trong khoảng -0.1---->0, Mình đã post lại file Fix lỗi và code.
 
Upvote 0
Tôi thường sử dụng cái này:
Mã:
Private Sub txtSoLuong_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Select Case KeyAscii
    Case Asc("0") To Asc("9")
        'Chang lam gi ca
    Case Asc("-")
        If InStr(1, Me.txtSoLuong.Text, "-") > 0 Or Me.txtSoLuong.SelStart > 0 Then
            'Neu dau tru khong nam o dau chuoi thi khong nhap
            KeyAscii = 0
        End If
    Case Asc(".")
        If InStr(1, Me.txtSoLuong.Text, ".") > 0 Then
            'Neu co dau cham thu hai thi khong nhap
            KeyAscii = 0
        End If
    Case Else
        'Cac ky tu khac thi khong cho phep nhap
        KeyAscii = 0
    End Select
End Sub
Nên nhớ rằng sự kiện KeyPress sẽ xử lý trước sự kiện Change.

Lê Văn Duyệt
 
Upvote 0
Anh Duyet ơi, thế anh có thể làm thêm cho nó cái phần Format không anh? vì mục đích là muốn có dấu phân chia . , hiển thị khi nhập số.
 
Upvote 0
SoiBien đã viết:
Anh Duyet ơi, thế anh có thể làm thêm cho nó cái phần Format không anh? vì mục đích là muốn có dấu phân chia . , hiển thị khi nhập số.

Em viết thêm là được mà :)

LVD
 
Upvote 0
Làm sao vẫn giữ được giá trị của số nhập vào ?

Nhưng mà giá trị số này sau khi VAL thì chỉ còn phần trước dấu phẩy đầu tiên. Có cách nào giữ được giá trị của số nhập này không ?
 
Upvote 0
Web KT

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

Back
Top Bottom