sealand
Thành viên gạo cội
- Tham gia
- 16/5/08
- Bài viết
- 4,883
- Được thích
- 7,688
- Giới tính
- Nam
- Nghề nghiệp
- Kế Toán
Mình thường gặp khó khăn trong việc tạo và định dạng các đối tượng trên Form để nhập các giá trị số. Khi nhập số thường có nhu cầu như sau:
-Trong ô dù con trỏ ở đâu, nếu nhấn phím “-“ thì số trong ô được chuyển thành số âm, nếu đang số âm chuyển thành số dương.
-Chỉ nhập các số, dấu thập phân và dấu trừ. Ngoài ra không cho nhập và phát ra tiếng Beep cảnh báo nhập sai.
-Nhập số đến đâu định dạng ngay đến đó để người nhập dễ dàng nhận biết mình nhập đúng hay sai.
-Trong ô cho phép nhập tối đa bao nhiêu số thập phân.
-v.v…
Mình viết 3 hàm ngắn để trong 1 Module giải quyết vấn đề này như sau:
1/ Hàm LocSo:
+Tác dung: Lọc các ký tự nhập vào, nếu hợp lệ mới cho ô nhận. Ngoài ra, chặn lại và phát tiếng Beep cảnh báo.
+Cú pháp: LocSo(Ma)
Trong đó : -Ma là mã Ascii của phím nhập.
+Nội dung hàm:
2/Hàm ToStr:
+Tác dụng: Chuyển 1 số, chuỗi dạng số hoặc chuỗi có thể chuyển thành số thành 1 chuỗi dạng số theo định dạng quy định trong Control Parnel.Cho phép chuyển thành số âm-dương bằng cách nhấn phím “-“ khi con trỏ ở bất cứ đâu trong ô. Hàm cũng hạn chế số thập phân theo yêu cầu.
+Cú pháp: ToStr(ch, n)
Trong đó:- ch là chuỗi cần chuyển.
-n số chữ số thập phân.
+ Nội dung hàm :
3/Hàm ToNum(ch)
+ Tác dụng : Chuyển các chuỗi đã định dạng thành số phục vụ tính toán hay nhập vào bảng tính
+ Cú pháp: ToNum(ch) (Trong đó ch là chuỗi số đã định dạng)
+Nội dung hàm:
Mẹo bắt KeyAscii trên ô nhập số: Ta lợi dụng sự kiện KeyPress chỉ trả về mã KeyAscii của các phím ký tự, còn các phím chức năng như Enter, Alt,Shift, Fn….bỏ qua. Vậy ta đặt hàm LocSo ở đây là hợp lý nhất, ít ảnh hưởng đến chức năng của các phím chức năng.
VÍ DỤ ÁP DỤNG:
Giả sử ta có 1 Form và có 3 Textbox:
Textbox1: Nhập tiền hàng
Textbox2: Thuế VAT 10%
Textbox1: Tổng cộng
Yêu cầu: Nhâp số vào ô tiền hàng tự động tính lại và định dạng các ô
Sửa ô Thuế sẽ ccaapj nhật lại ô tổng cộng
Mã sử lý của Form:
Để cụ thể các bạn xem file ví dụ kèm theo.
Đây là Code mình viết và tặng tất cả các bạn chứ không chép từ đâu cả. Rất mong các bạn tham gia hoàn thiện để chúng ta có 1 hỗ trợ tạo Form trong VBA.
-Trong ô dù con trỏ ở đâu, nếu nhấn phím “-“ thì số trong ô được chuyển thành số âm, nếu đang số âm chuyển thành số dương.
-Chỉ nhập các số, dấu thập phân và dấu trừ. Ngoài ra không cho nhập và phát ra tiếng Beep cảnh báo nhập sai.
-Nhập số đến đâu định dạng ngay đến đó để người nhập dễ dàng nhận biết mình nhập đúng hay sai.
-Trong ô cho phép nhập tối đa bao nhiêu số thập phân.
-v.v…
Mình viết 3 hàm ngắn để trong 1 Module giải quyết vấn đề này như sau:
1/ Hàm LocSo:
+Tác dung: Lọc các ký tự nhập vào, nếu hợp lệ mới cho ô nhận. Ngoài ra, chặn lại và phát tiếng Beep cảnh báo.
+Cú pháp: LocSo(Ma)
Trong đó : -Ma là mã Ascii của phím nhập.
+Nội dung hàm:
Mã:
Function Locso(ByVal ma As Long) As Long
If IsNumeric(Chr$(ma)) Then
Locso = ma
ElseIf ma = 45 Then
Locso = 45
ElseIf ma = 44 Or ma = 46 Then
Locso = Asc(Application.DecimalSeparator)
Else
Locso = 0: Beep
End If
End Function
+Tác dụng: Chuyển 1 số, chuỗi dạng số hoặc chuỗi có thể chuyển thành số thành 1 chuỗi dạng số theo định dạng quy định trong Control Parnel.Cho phép chuyển thành số âm-dương bằng cách nhấn phím “-“ khi con trỏ ở bất cứ đâu trong ô. Hàm cũng hạn chế số thập phân theo yêu cầu.
+Cú pháp: ToStr(ch, n)
Trong đó:- ch là chuỗi cần chuyển.
-n số chữ số thập phân.
+ Nội dung hàm :
Mã:
Function ToStr(ByVal ch As String, n As Integer)
Dim i, tam, Kt, Kt1
Kt = Application.DecimalSeparator
ch = Trim(ch)
'Dua dau tru ve dau dong va chuyen 2 dau am thanh duong
i = Len(ch) - Len(Replace(ch, "-", ""))
ch = IIf(i = 1, "-", "") & Replace(ch, "-", "")
'Dinh dang so
If InStr(1, ch, Kt) > 0 Then
tam = Split(ch, Kt)
ToStr = Format(tam(0), "#,##0") & Kt & tam(1)
Else
ToStr = Format(ch, "#,##0")
End If
'Cat so thap phan
If InStr(1, ToStr, Kt) > 0 Then ToStr = Left(ToStr, InStr(1, ToStr, Kt) + n)
End Function
+ Tác dụng : Chuyển các chuỗi đã định dạng thành số phục vụ tính toán hay nhập vào bảng tính
+ Cú pháp: ToNum(ch) (Trong đó ch là chuỗi số đã định dạng)
+Nội dung hàm:
Mã:
Function ToNum(ByVal ch As String)
Dim Kt
Kt = Application.ThousandsSeparator
ToNum = Val(Replace(ch, Kt, ""))
End Function
VÍ DỤ ÁP DỤNG:
Giả sử ta có 1 Form và có 3 Textbox:
Textbox1: Nhập tiền hàng
Textbox2: Thuế VAT 10%
Textbox1: Tổng cộng
Yêu cầu: Nhâp số vào ô tiền hàng tự động tính lại và định dạng các ô
Sửa ô Thuế sẽ ccaapj nhật lại ô tổng cộng
Mã sử lý của Form:
Mã:
Option Explicit
Private Sub TextBox1_Change()
TextBox1 = ToStr(TextBox1, 2)
TextBox2 = ToStr(ToNum(TextBox1) * 0.1, 2)
TextBox3 = ToStr(ToNum(TextBox1) + ToNum(TextBox2), 2)
End Sub
‘---------------------------------------------------------------------------------
Private Sub TextBox2_Change()
TextBox1 = ToStr(TextBox1, 2)
TextBox3 = ToStr(ToNum(TextBox1) + ToNum(TextBox2), 2)
End Sub
‘---------------------------------------------------------------------------------
Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
KeyAscii = Locso(KeyAscii)
End Sub
‘----------------------------------------------------------------------------------
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
KeyAscii = Locso(KeyAscii)
End Sub
‘-----------------------------------------------------------------------------------
Private Sub UserForm_Initialize()
Me.TextBox1 = 0
Me.TextBox1.SetFocus
End Sub
Để cụ thể các bạn xem file ví dụ kèm theo.
Đây là Code mình viết và tặng tất cả các bạn chứ không chép từ đâu cả. Rất mong các bạn tham gia hoàn thiện để chúng ta có 1 hỗ trợ tạo Form trong VBA.
File đính kèm
Lần chỉnh sửa cuối: