Textbox trong Excel

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

cavoi

Thành viên mới
Tham gia
29/10/08
Bài viết
43
Được thích
5
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
 
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
 
Upvote 0
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.

PHP:
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!
 
Upvote 0
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.
 
Upvote 0
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.

PHP:
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


PHP:
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


PHP:
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
 
Lần chỉnh sửa cuối:
Upvote 0
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.
 
Upvote 0
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?
 
Upvote 0
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
PHP:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Cancel = True
End Sub
 
Upvote 0
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
 
Upvote 0
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.
 
Upvote 0
1 code duy nhất!

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:

PHP:
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
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom