PDA

View Full Version : Textbox trong Excel



cavoi
02-11-08, 11:57 AM
Diễn đàn này rất bổ ích, CV đang tập làm quen từ từ với Macro của Excel 2003

xin hỏi các anh chị

Cavoi có nhu cầu sau:

khi lập Form, tạo lập textbox với ví dụ như

Ngày: ... / ... / ...

Làm sao kiểm soát bàn phím nhập vào chỉ cho phép
a. Ghi 2 ký tự
b. Ghi số: 0..9

giống như trong Fox

Các anh chị hướng dẫn giúp

Xin cám ơn

nguoiconxunui
17-02-09, 09:00 PM
một textbox thì làm được ah check nó có phải là number không, nếu không thì để im con trỏ không cho di chuyển chổ khác he he

Mr Okebab
17-02-09, 09:22 PM
Diễn đàn này rất bổ ích, CV đang tập làm quen từ từ với Macro của Excel 2003

xin hỏi các anh chị

Cavoi có nhu cầu sau:

khi lập Form, tạo lập textbox với ví dụ như

Ngày: ... / ... / ...

Làm sao kiểm soát bàn phím nhập vào chỉ cho phép
a. Ghi 2 ký tự
b. Ghi số: 0..9

giống như trong Fox

Các anh chị hướng dẫn giúp

Xin cám ơn

Bạn thử nhé : Chỉ cho nhập số và dấu phân cách.


Private Sub H_TBCTNgay_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
On Error Resume Next
Select Case KeyAscii
Case 48 To 57
Case 45 ' 45 = "-"
KeyAscii = 47
Case 47 ' 47 = "/"
Case Else
KeyAscii = 0
End Select
End Sub

Còn nếu đúng format ngày thì thêm sự kiện AfterUpdate nữa là được

Thân!

hoa35ktxd
17-02-09, 09:29 PM
Thêm 1 điều kiện kiểm tra vị trí con trỏ nữa, nếu là 3, 5 thì chỉ cho nhập "/" còn lại cho nhập số, quá 10 ký tự thì bỏ qua. ngoài ra nếu cầu kỳ hơn thì nên kiểm tra cả về giá trị: 0< Ngày <= 31, 0 < tháng <=12 chưa kể đến ngày 28, 29, 30, 31 của từng tháng.

phamduylong
17-02-09, 11:45 PM
Kết hợp 2 sự kiện Change, KeyPress và hàm KiemTraNgay để kiểm soát nhập dữ liệu vào TextBox:

+ Chỉ cho phép nhập 0,1,2,3,4,5,6,7,8,9 và dấu /

+ Bắt buộc nhập theo dạng dd/mm/y (y tối đa 4 chữ số)
- mm=01, 03, 05, 07, 08, 10, 12 ==> dd từ 01 đến 31
- mm=04, 06, 09, 11 ==> dd từ 01 đến 30
- mm=02 ==> dd từ 01 đến 29

+ Kiểm tra nếu sai ở ký tự nào thì xóa hết các ký tự bên phải từ ký tự sai.


Private Sub TxtNgay_Change()
If TxtNgay.Value <> "" Then
For n = 1 To Len(TxtNgay)
Select Case n
Case 1, 2, 4, 5, 7 To 10
If Asc(Mid(TxtNgay, n, 1)) = 47 Then GoTo baoloi
Case 3, 6
If Asc(Mid(TxtNgay, n, 1)) <> 47 Then GoTo baoloi
End Select
Next
End If
Exit Sub
baoloi:
TxtNgay.Value = Left(TxtNgay, n - 1)
End Sub


Private Sub TxtNgay_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If (KeyAscii >= 48 And KeyAscii <= 57) Or KeyAscii = 47 Then
Select Case Len(TxtNgay)
Case 0, 1, 3, 4, 6 To 9
If KeyAscii = 47 Then KeyAscii = 0
Case 2, 5
If KeyAscii <> 47 Then KeyAscii = 0
End Select
Else
KeyAscii = 0
End If
If KeyAscii > 0 Then
If KiemTraNgay(TxtNgay & Chr(KeyAscii)) = False Then KeyAscii = 0
End If
End Sub


Function KiemTraNgay(txt As String) As Boolean
Select Case Len(txt)
Case 1, 2
If Val(txt) > 31 Then Exit Function
Case 4
If Val(Mid(txt, 4)) > 1 Then Exit Function
Case 5
If Val(Mid(txt, 4)) > 12 Then
Exit Function
Else
t30 = Val(Left(txt, 2))
Select Case Val(Mid(txt, 4))
Case 4, 6, 9, 11
If t30 = 31 Then Exit Function
Case 2
If t30 > 29 Then Exit Function
End Select
End If
Case 7
If Val(Mid(txt, 7)) = 0 Then Exit Function
Case 8
If Val(Mid(txt, 7)) < 19 Then Exit Function
End Select
KiemTraNgay = True
End Function

hoa35ktxd
18-02-09, 11:29 AM
Góp ý thêm chút: Không nên đưa vào sự kiện Change dẫn đến tình trạng đoạn mã trên chạy đi chạy lại nhiều lần gọi là đệ quy hay là gì đó tôi không rõ lắm.
Chỉ cần chặn lại ngay trong sự kiện Keypress là được rồi.
Về vấn đề kiểm tra ngày tháng ta hãy để cho việc nhập đủ 10 ký tự hãy kiểm tra cho đảm bảo chuẩn xác vì số ngày phụ thuộc vào năm và tháng, các năm thường thì tháng 2 có 28 ngày nhưng năm nhuận thì tháng 2 mới có 29 ngày.

phamduylong
18-02-09, 03:18 PM
Góp ý thêm chút: Không nên đưa vào sự kiện Change dẫn đến tình trạng đoạn mã trên chạy đi chạy lại nhiều lần gọi là đệ quy hay là gì đó tôi không rõ lắm.
Chỉ cần chặn lại ngay trong sự kiện Keypress là được rồi.
Về vấn đề kiểm tra ngày tháng ta hãy để cho việc nhập đủ 10 ký tự hãy kiểm tra cho đảm bảo chuẩn xác vì số ngày phụ thuộc vào năm và tháng, các năm thường thì tháng 2 có 28 ngày nhưng năm nhuận thì tháng 2 mới có 29 ngày.
sự kiện Change và Keypress khác nhau, mỗi sự kiện có cái ưu riêng của nó.
Keypress chỉ có tác dụng khi bấm các phím ký tự (số, dấu, chữ cái). Khi người dùng chỉnh, xóa thì Keypress không tác dụng, lúc đó Change mới phát huy.


Không nên đưa vào sự kiện Change dẫn đến tình trạng đoạn mã trên chạy đi chạy lại nhiều lần gọi là đệ quy hay là gì đó tôi không rõ lắm
sự kiện Change viết không khéo sẽ dẫn đến tình trạng trên.

Có vấn đề này hỏi các bạn:
Nếu phát hiện dữ liệu trong TextBox sai, có cách nào không cho con trỏ dời sang Control khác không?

hoa35ktxd
18-02-09, 04:03 PM
Mỗi người có một cách làm, tôi thì hay kiểm tra qua sự khiện KeyDown để chặn, còn kiểm tra sau khi xóa, back thì dùng KeyUp, nếu đưa vào sự kiên Change thì đoạn mã sẽ chạy 2 lần nếu ta xóa đi ký tự không hợp lệ.
Muốn cho con trở không dời đi ta set cái cancel = true là được

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Cancel = True
End Sub

thuthuthu
28-02-09, 10:50 PM
chào bạn! cho mình hỏi tẹo.
Ví dụ mình nhập ngày 30/11/2008
mình gửi 3 tháng
làm cách nào để cộng 3 tháng với ngày 30/11/2008
cảm ởn

Po_Pikachu
28-02-09, 11:00 PM
Bạn dùng DataSer ial(<year>,<month>+3,<day>)
Hoặc dùng Date(<year>,<month>+3,<day>) nếu dùng trong bảng tính
Thân.

ptm0412
01-03-09, 12:24 AM
Làm sao kiểm soát bàn phím nhập vào chỉ cho phép
a. Ghi 2 ký tự
b. Ghi số: 0..9
Dùng code sau đây có thể kiểm tra cả giá trị ngày không tồn tại như 31/02/2009 và lỗi nhập liệu text, ... Con trỏ ở lại textbox để nhập liệu lại:


Private Sub Ngaytxt_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If IsDate(Ngaytxt) = False Or Len(Ngaytxt) < 8 Then
Cancel = True
MsgBox "Ngay phai du ngay thang nam dang dd/mm/yy"
Ngaytxt = ""
End If
End Sub