clsTextBoxNum - Chỉ nhập số trên TextBox control

Liên hệ QC

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia
13/6/06
Bài viết
4,768
Được thích
10,281
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Chúng ta khi dùng Userform thường tạo TextBox để nhập liệu, tuy nhiên control này hỗ trợ cho giá trị kiểu chuỗi (String) còn về số hay ngày tháng thì không. Nhiều khi người dùng nhập toán loạn các laọi giá trị-->chương trình khó quản lý.

Tôi tạo ra class clsTextBoxNum để chúng ta có một TextBox chỉ nhập giá trị là số và giá trị trả về của nó cũng là số.

Rất mong các bạn tiếp tục phát triển với clsTextBoxNum.
 

File đính kèm

Chào các bạn,
Ngoài việc phát triển clsTextBoxNum các bạn có thể phát triển thêm clsTextBoxDate.

Nào cùng nhau phát triển.

Lê Văn Duyệt
 
Upvote 0
Anh Tuân ơi,
- Em vẫn đánh được chữ tiếng Việt vào các Textbox đó
VD: Em nhập vào số 123 rồi đánh chữ ê, thế là xoá số 3 và thay bằng chữ ê.
Và nếu dùng tổ hợp phím Alt+.... thì vẫn đánh được chữ
VD: Alt+65
- Anh xử lý cả việc Copy - Paste các chữ nữa nhé!
....
 
Upvote 0
Mời tiếp tục phát triển clsTextBoxNum và clsTextBoxDate

levanduyet đã viết:
Ngoài việc phát triển clsTextBoxNum các bạn có thể phát triển thêm clsTextBoxDate.

Nào cùng nhau phát triển.

Nếu các bạn phát triển clsTextBoxNumclsTextBoxDate thì chú ý tới các thủ tục EVENT của ctrl trong Class module:

Mã:
Private Sub ctrl_Change()
[COLOR="SeaGreen"]'    MsgBox ctrl.Value[/COLOR]
End Sub

Private Sub ctrl_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
[COLOR="SeaGreen"]'    MsgBox KeyCode[/COLOR]
End Sub

'Events
Private Sub ctrl_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Dim IsValid As Boolean

    IsValid = (KeyAscii >= 48 And KeyAscii <= 57) '0-9
    
    If KeyAscii = 46 Then ' Char "." Check for the decimal number
        IsValid = (InStr(ctrl.Value, ".") = 0)
    End If
    
    If KeyAscii = 43 Or KeyAscii = 45 Then ' Sign KeyAscii 43(+) ; KeyAscii 45(-)
        'Check...
        IsValid = True
    End If
    
    If Not IsValid Then
        KeyAscii = -1
    End If
[COLOR="SeaGreen"]'    MsgBox KeyAscii[/COLOR]
End Sub

Private Sub ctrl_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
[COLOR="SeaGreen"]'    MsgBox KeyCode[/COLOR]
End Sub
 
Upvote 0
nvson đã viết:
Anh Tuân ơi,
- Em vẫn đánh được chữ tiếng Việt vào các Textbox đó
VD: Em nhập vào số 123 rồi đánh chữ ê, thế là xoá số 3 và thay bằng chữ ê.
- Và cả Copy chữ rồi Paste được vào Textbox đó nữa
....

Cái này là lỗi do phần mềm bộ gõ có sử dụng Clipboard để xử lý chữ có dấu (nếu anh không nhầm thì em đang dùng Vietkey, nếu dùng Unikey thì không bị), còn vụ paste giá trị text từ ngoài vào thì khó đấy vì mình không kiểm soát được nó+-+-+-+ . Các điều khiển trong FM2.DLL (Userform) không có Handle (HWND) nên anh không thể dùng kỹ thuật API được. Để xử lỷ vụ này trong các control chuẩn (có handle) thì sẽ dùng các thông điệp của WINDOWS để bẫy như WM_CHAR, WM_PASTE, WM_COPY, WM_SETFORCUS, WM_LOSTFORCUS.

Nói chung lập trình trên Userform (thư viện FM2.DLL) là bị hạn chế rất nhiều, chúng ta sẽ cố gắng hết sức để đạt được sự tối ưu cao nhất có thể.

Mời các bạn tiếp tục phát triển.
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy còn cách này nữa (chắc đơn giản hơn) là xử lý sự kiện KeyPress của Textbox.
Mã:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
    Case vbKey0 To vbKey9
    Case vbKeyBack, vbKeyClear, vbKeyDelete
    Case vbKeyLeft, vbKeyRight, vbKeyUp, vbKeyDown, vbKeyTab
    Case Else
        KeyAscii = 0
End Select
End Sub
 
Upvote 0
levanduyet đã viết:
Chào các bạn,
Ngoài việc phát triển clsTextBoxNum các bạn có thể phát triển thêm clsTextBoxDate.

Nào cùng nhau phát triển.

Lê Văn Duyệt

Cái vụ TextBox gõ như Date control ko đơn giản đâu nha. Làm vỡ mật ra, thế mà khi gõ (với chế độ overwrite như MaskEdit), rồi xóa = phím Del, = phím BackSpace, rồi cái dấu "/" lúc nào cũng xuất hiện kể cả khi xóa nó đi, v.v... nó cứ xảy ra đủ lỗi.

Đó còn chưa kể hàm SendKeys của VB/VBA là có vấn đề cần phải viết lại nữa.

Nói chung phải hiểu 1 Date control hoạt động thế nào thì mới viết được cho đúng.

Còn vụ Textbox với "OnlyNumeric" (có dấu chấm, dấu phảy), "OnlyInteger" (chỉ số ko thôi) thì tìm trên Google có nhiều lắm.
 
Lần chỉnh sửa cuối:
Upvote 0
Em hay dùng đoạn này:
Mã:
    Select Case KeyAscii
    Case Asc(vbCr)
    KeyAscii = 0
    Case 8, 46
    Case 47 To 58
    Case Else
    KeyAscii = 0
    End Select
 
Upvote 0
TuanVNUNI đã viết:
Chúng ta khi dùng Userform thường tạo TextBox để nhập liệu, tuy nhiên control này hỗ trợ cho giá trị kiểu chuỗi (String) còn về số hay ngày tháng thì không. Nhiều khi người dùng nhập toán loạn các laọi giá trị-->chương trình khó quản lý.

Tôi tạo ra class clsTextBoxNum để chúng ta có một TextBox chỉ nhập giá trị là số và giá trị trả về của nó cũng là số.

Rất mong các bạn tiếp tục phát triển với clsTextBoxNum.


khi nhấn vào "Tạo TextBox trên Sheet" thì nó bị dự hình quá!
 
Upvote 0
Web KT

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

Back
Top Bottom