gõ 6 số ra ngày tháng năm trong textbox

Liên hệ QC

NguyenthiH

Thành viên mới đăng ký
Tham gia
11/12/16
Bài viết
940
Được thích
172
Giới tính
Nữ
Chào các anh chị. Em có textbox ngày trong Userform, em muốn chỉ gõ 6 số và enter là ra ngày tháng năm được không ạ.
Ví dụ như em gõ:
310719 enter thì ra ngày 31/07/2019
030819 enter thì ra ngày 03/08/2019.
Mong các anh chị chỉ giáo ạ.
 
Sub ChuanNgay(ctl As Control)
Dim v As String
v = ctl.Text
Select Case Len(v)
Case 10 ' chuẩn rồi khỏi sửa
Exit Sub
Case 8
ctl.Text = Left(v, 2) & "/" & Mid(v, 3, 2) & "/" & Right(v, 4)
Case 6
ctl.Text = Left(v, 2) & "/" & Mid(v, 3, 2) & "/20" & Right(v, 2)
Case Else
ctl.Text = "Sai rồi bạn ơi"
End Select
End Sub

Trong mấy cái Sub event, ví dụ TextBox1.Exit, thêm dòng này
ChuanNgay TextBox1
 
Lần chỉnh sửa cuối:
Upvote 0
Nhớ không nhầm có người làm cho rồi.

 
Upvote 0
À,anh @VetMini ơi sao em thử gõ 300219 thì không báo lỗi anh ơi!
 
Upvote 0
Bạn chỉ hỏi cách đổi dạng thôi chứ đâu có hỏi cách xét mức độ xài được của nó đâu.
Muốn xét mức độ xài được thì phải thêm một hàm xét.
 
Upvote 0
Chào các anh chị. Em có textbox ngày trong Userform, em muốn chỉ gõ 6 số và enter là ra ngày tháng năm được không ạ.
Ví dụ như em gõ:
310719 enter thì ra ngày 31/07/2019
030819 enter thì ra ngày 03/08/2019.
Mong các anh chị chỉ giáo ạ.
Thử Code
Mã:
Sub Ngay_ddmmyy()
  Dim Ngay As String, tmp As String
  Ngay = TextBoxl.Text
  If Len(Ngay) = 6 Then
    If IsDate("20" & Mid(Ngay, 5, 2) & "/" & Mid(Ngay, 3, 2) & "/" & Mid(Ngay, 1, 2)) Then
      TextBoxl.Text = Mid(Ngay, 1, 2) & "/" & Mid(Ngay, 3, 2) & "/" & "20" & Mid(Ngay, 5, 2)
      Exit Sub
    End If
  End If
  MsgBox ("Du Lieu Ngay Thang Sai Bet !")
End Sub
 
Upvote 0
Thử Code
Mã:
Sub Ngay_ddmmyy()
  Dim Ngay As String, tmp As String
  Ngay = TextBoxl.Text
  If Len(Ngay) = 6 Then
    If IsDate("20" & Mid(Ngay, 5, 2) & "/" & Mid(Ngay, 3, 2) & "/" & Mid(Ngay, 1, 2)) Then
      TextBoxl.Text = Mid(Ngay, 1, 2) & "/" & Mid(Ngay, 3, 2) & "/" & "20" & Mid(Ngay, 5, 2)
      Exit Sub
    End If
  End If
  MsgBox ("Du Lieu Ngay Thang Sai Bet !")
End Sub
Lỡ tôi gõ 04/08/2019 ; toi sẽ được dịp vò đầu bứt tai "ngày của tôi sai chỗ nào?"
 
Upvote 0
Lỡ tôi gõ 04/08/2019 ; toi sẽ được dịp vò đầu bứt tai "ngày của tôi sai chỗ nào?"
Thêm hướng dẫn
Mã:
Sub Ngay_ddmmyy()
  Dim Ngay As String
  Ngay = TextBoxl.Text
  If Len(Ngay) = 6 Then
    If IsDate("20" & Mid(Ngay, 5, 2) & "/" & Mid(Ngay, 3, 2) & "/" & Mid(Ngay, 1, 2)) Then
      TextBoxl.Text = Mid(Ngay, 1, 2) & "/" & Mid(Ngay, 3, 2) & "/" & "20" & Mid(Ngay, 5, 2)
      Exit Sub
    End If
  End If
  TextBoxl.Text = ""
 Ngay= MsgBox ("Nhap Lai theo dang: ddmmyy", 0, "Du Lieu Ngay Thang Sai Bet !")
End Sub
 
Upvote 0
Thiệt ra khi thớt hỏi cái vụ 310719 --> 31/07/2019 vì không có kinh nghiệm về gõ dữ liệu (data entry) cho nên đã suy nghĩ quá đơn giản.
Sau phi gõ, Textbox bị đổi từ 310719 sang 31/07/2019. Nhưng nếu người gõ quay trở lại thì sao? Hiển nhiên là lúc ấy Textbox đang chứa 31/07/2019.
Vì vậy, hàm chuyển đổi phải có khả năng chấp nhận 310719, 31072019, và 31/07/2019 là 3 dạng tối thiểu. Nếu tử tế thì thêm dạng 31/07/19.

Người làm việc với giao diện người dùng (user interface) đáng lẽ nên nghĩ thêm về những phản ứng phụ trong nhu cầu của mình trước khi đưa chúng lên thành yêu cầu.
 
Upvote 0
Theo tôi đây chỉ là những trò nhí nhố. Người ta gõ 310719 thì code biến thành 31/07/2019. Nếu tôi gõ sai vì ngày lẽ ra là 21 thì tôi phải bôi đen toàn bộ và gõ lại tất cả từ đầu.
Việc gõ trong TextBox trên Form đâu có là việc làm mỗi ngày hàng nghìn lần đâu mà phải tiết kiệm từng ký tự.

Mà tại sao lại cứ phải đổi cứng nhắc thành dạng ngày/tháng/năm thế nhỉ. Có lẽ một hòn đảo, một mình ta chăng. Không làm việc nhóm, không có đối tác nước ngoài?

Nếu tôi là đối tác của chủ thớt thì tôi không làm việc được với tập tin của chủ thớt. Nơi tôi ở chuẩn thiết lập là yyyy-mm-dd. Nếu tôi nhập và code biến thành dd/mm/yyyy thì:

Giả sử trong TextBox1 đang có 31/07/2019. Nếu tôi muốn nhập xuống sheet thì
Mã:
Range("B3").Value = TextBox1.Value

Tôi sẽ có text 31/07/2019. Đây không là ngày tháng theo cách hiểu của Excel.

Nếu tôi có code khác
Mã:
Range("B3").Value = CDate(TextBox1.Value)

thì ở B3 tôi có ngày tháng chuẩn 2019-07-31.

Nhưng nếu trong TextBox1 tôi có 12/07/2019 thì dù dùng code nào tôi cũng có 2019-12-07. Tuy cả 2 đều là ngày tháng nhưng là ngày tháng sai. Phải là ngày trong tháng 7 mới là dụng ý của tôi.

Như vậy nếu dùng dạng cứng nhắc thì khi tôi có lúc này 31/07/2019 lúc khác có 12/07/2019, và cả 2 tôi đều nhập xuống sheet thì chỉ trong 1 cell có ngày tháng chính xác.
 
Upvote 0
Thiệt ra hồi thời chưa có máy tính PC, màn hình là dạng điển hình 80 ký tự x 24 dòng (hoàn toàn ký tự, không có graphic) thì chúng tôi thiết kế gõ nhập ngày dạng đại khái như DDMMYY. Do những yếu tố sau đây:
1. Lúc ấy, dân làm văn phòng là dân chuyên nghiệp gõ, hằng 100 từ/phút, không có loại ỏng ẹo 10 từ/phút như bây giờ.
2. Lúc ấy, người ta được huấn luyện nhập dữ liệu số theo dạng batch. Cuối ngày người ta gộp các chứng từ lại, và tuần tự nhập, cứ mỗi chứng từ là 1 phát sinh (transaction) và được gõ thành 1 dòng.
3. Gõ bằng cái bàn phím số. Và gõ theo đúng format được thiết kế.
Ví dụ nhập 100 đồng phát sinh thì người ta nhập:
100.111.222.310180<Return (hết dòng, qua dòng kế)>
4. Phần mềm sẽ dịch ra là số tiền 100, nợ tài khoản 111, có tài khoản 222, ngày 31/01/1980, và ghi vào CSDL.
Chú i: nếu tính bằng đô la thì con số 100 đô được nhập là 10000, tức là kèm 2 chữ số cho xu
Chú ii: những phát sinh có ghi chú thì hơi cực hơn 1 chút, nhưng chủ yếu vẫn là mỗi phát sinh thì nhập bằng 1 dòng
Chú iii: hồi xưa ngừoi ta chỉ trữ số năm bằng 2 chữ số, 1980 thì trữ là 80 (bạn có nhớ câu chuyện Y2K meltdown?)

Nhưng đấy là chuyện của thế kỷ 20, của thời đại mainframe.

Bây giờ là thời đại của máy tính con nối mạng, của dân kéo chuột và màn hình graphic, giao diện cửa sổ. Dữ liệu được nhập qua form và controls.
Và quan trọng hơn cả là kỹ năng nhập số bằng bàn phím số, mắt không rời chồng chứng từ (tức là mắt không nhìn màn hình) đã trở thành huyền thoại.

Cách thiết kế input ngày nay khác hoàn toàn. Mỗi công ty, mỗi môi trường có một cách nhìn dữ liệu ngày tháng năm, tuỳ theo đường lối riêng của họ.

Chú: với máy móc hiện đại hơn, người ta ngỡ rằng năng suất và hiệu quả của một chuyên viên nhập liệu sẽ cao hơn ngày xưa. Thực tế không như vậy. Tốc dộ nhập liệu ngày nay thấp hơn, và tỷ lệ sai nhiều hơn xưa.
(mỗi lần ôi thấy một bạn đăng bài lên với câu "làm thủ công chắc em chết quá" là tôi cười thầm trong bụng - mấy bạn này chưa biết "thủ công" là gì)
 
Upvote 0
Anh Hiếu ơi, trong code anh em muốn khi báo lỗi nhập sai ngày tháng năm thì TextBox1 được Focus.
Trong form của em có thêm TextBox2 nữa, em chọn TabIndex của TextBox1 là 1 và TexBox2 là 2, Em có chèn thêm code như sau:
Mã:
Sub Ngay_ddmmyy()
  Dim Ngay As String
  Ngay = TextBoxl.Text
  If Len(Ngay) = 6 Then
    If IsDate("20" & Mid(Ngay, 5, 2) & "/" & Mid(Ngay, 3, 2) & "/" & Mid(Ngay, 1, 2)) Then
      TextBoxl.Text = Mid(Ngay, 1, 2) & "/" & Mid(Ngay, 3, 2) & "/" & "20" & Mid(Ngay, 5, 2)
      Exit Sub
    End If
  End If
  TextBoxl.Text = ""
 Ngay= MsgBox ("Nhap Lai theo dang: ddmmyy", 0, "Du Lieu Ngay Thang Sai Bet !")
 TextBox1.SetFocus <-----chen them
End Sub
nhưng khi báo lỗi xong, nhấn Enter thì TextBox2 lại Focus.
 
Upvote 0
Sub GiDo(theTextbx As Control)
' xét ngày trong theTextBox và chỉnh dạng
Dim ngay As String
ngay = ChinhDDMMYYYY(theTextBox.Text)
If ChuanNgay(ngay) Then
theTextBox.Text = ngay
Else
MsgBox "báo lỗi gì đó"
theTextBox.SetFocus
End If
End Sub

Private Function ChinhDDMMYYYY(s As String) As String
' chỉnh 1 string từ dạng DDMMYY thành dạng DD/MM/YYYY
Select Case Len(s)
Case 10 ' hy vọng chuẩn rồi khỏi sửa
ChinhDDMMYYYY = s
Case 8 ' dạng ddmmyyyy
ChinhDDMMYYYY = Left(s, 2) & "/" & Mid(s, 3, 2) & "/" & Right(s, 4)
Case 6 ' dạng ddmmyy
ChinhDDMMYYYY = Left(s, 2) & "/" & Mid(s, 3, 2) & "/20" & Right(s, 2)
Case Else
ChinhDDMMYYYY = ""
End Select
End Function

Private Function ChuanNgay(s As String) As Boolean
Dim d as Variant, ng As Integer, th As Integer, nm As Integer
If s Like "[0-3][0-9]/[0-1][0-9]/20[0-9][0-9]" Then ' xét dạng dd/mm/yyyy
ng = CInt(Left(s, 2))
th = CInt(Mid(s, 4, 2))
nm = CInt(Right(s, 4))
' xét độ hợp lý của ngày
d = DateSerial(nm, th, ng)
' hàm dateserial có khả năng đôn ngày cho nên phải xem lại nó có đôn hay không
If Day(d) = ng And Month(d) = th And Year(d) = nm Then ChuanNgay = True
End If
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ em cám ơn anh @VetMini nhiều, em sẽ Test thử ạ.
 
Upvote 0
Sao em bê nguyên code của anh @VetMini và sửa "thetextbox" thành "ngay1" theo tên textbox ngày của em, và thêm GiDo vào sub ngay1_AfteUpdate () thì lỗi tại GiDo anh @VetMini ơi.
 
Upvote 0
Bạn đã sửa thế nào mà không viết rõ lên đây?

Sub ngay1_AfteUpdate ()
' xét ngày trong ngay1 và chỉnh dạng
Dim ngay As String
ngay = ChinhDDMMYYYY(ngay1.Text)
If ChuanNgay(ngay) Then
ngay1.Text = ngay
Else
MsgBox "báo lỗi gì đó"
ngay1.SetFocus
End If
End Sub

???
 
Upvote 0
Cám ơn Thầy @batman1, em chỉnh theo Thầy thì không lỗi nữa, nhưng ý em khi có msgBox báo lỗi ->enter -> textbox ngay1 được focus, để gõ lại ạ.
Code của anh Hiếu, và anh Vetmini khi báo lỗi lại nhảy qua textbox khác.
 
Upvote 0
Web KT
Back
Top Bottom