[CHIA SẺ] TextBox nhập giờ (HH:mm).

Liên hệ QC

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,590
Được thích
16,653
Giới tính
Nam
Nhập giờ sao cho đúng và nhanh là một vấn đề rất thiết thực nếu ai thường xuyên nhập giờ trên form. Hôm nay tôi rảnh rỗi ngồi viết một số thuật toán dự trên các sự kiện của TextBox để tạo ra "công cụ" này. Hy vọng các bạn thích thú với nó. Cũng mong các cao thủ góp ý xây dựng thêm cho nó hoàn chỉnh hơn.

Cách mà nó vận hành:
- Mặc định khi mở form hiển thị: 00:00 và select số 0 đầu tiên
- Phím mũi tên trái (phải) click 01 lần nó sẽ select 01 ký số tương ứng.
- Nếu nó đang select ký số đầu tiên mà click mũi tên bên trái, nó sẽ select ký tự cuối cùng. Tương tự, nếu nó đang select ký số cuối cùng mà click vào mũi tên bên phải, nó sẽ select ký số đầu tiên (thuộc tính vòng).
- Không cho gõ ký tự, chỉ được gõ ký số.
- Khi gõ bất kỳ 01 ký số nào, nó sẽ tự động dịch chuyển select vào ký số kế tiếp.
- Nó không bao giờ chọn vào dấu 2 chấm :))
- Nếu nó đang select ký tự cuối cùng mà gõ số vào nó sẽ chuyển select về ký số đầu tiên.
- Khi nó đang ở ký tự đầu tiên, nếu gõ số lớn hơn 2 thì nó sẽ hiểu rằng đó chính là giờ nhập vào. VD: 00:00 mà gõ số 9 ngay lập tức nó điền 09:00 và chọn vào số 0 ở vị trí số 4.
- Tương tự nếu đang chọn vị trí của phút, nếu gõ số nào lớn hơn 5 nó hiểu chỉ nhập đúng số phút đó. VD: 00:00 gõ số phút là 6 nó sẽ hiểu 00:06 chứ không phải là 00:60.
-Nếu đã nhập số 2 ở vị trí đầu tiên tức là đang 20:30, tại vị trí ký số giờ thứ 2 mà bạn nhập số lớn hơn 3 VD: 24:30 thì nó "cự" bạn bằng 01 msgbox và xóa ngay số 24 và điền vào 00:30 để bạn nhập lại cho đúng số giờ.
1620982135101.png
 

File đính kèm

  • NhapGio.xlsm
    20.5 KB · Đọc: 42
Lần chỉnh sửa cuối:
Nhập giờ sao cho đúng và nhanh là một vấn đề rất thiết thực nếu ai thường xuyên nhập giờ trên form. Hôm nay tôi rảnh rỗi ngồi viết một số thuật toán dự trên các sự kiện của TextBox để tạo ra "công cụ" này. Hy vọng các bạn thích thú với nó. Cũng mong các cao thủ góp ý xây dựng thêm cho nó hoàn chỉnh hơn.

Các mà nó vận hành:
- Mặc định khi mở form hiển thị: 00:00 và select số 0 đầu tiên
- Phím mũi tên trái (phải) click 01 lần nó sẽ select 01 ký số tương ứng.
- Nếu nó đang select ký số đầu tiên mà click mũi tên bên trái, nó sẽ select ký tự cuối cùng. Tương tự, nếu nó đang select ký số cuối cùng mà click vào mũi tên bên phải, nó sẽ select ký số đầu tiên (thuộc tính vòng).
- Không cho gõ ký tự, chỉ được gõ ký số.
- Khi gõ bất kỳ 01 ký số nào, nó sẽ tự động dịch chuyển select vào ký số kế tiếp.
- Nó không bao giờ chọn vào dấu 2 chấm :))
- Nếu nó đang select ký tự cuối cùng mà gõ số vào nó sẽ chuyển select về ký số đầu tiên.
- Khi nó đang ở ký tự đầu tiên, nếu gõ số lớn hơn 2 thì nó sẽ hiểu rằng đó chính là giờ nhập vào. VD: 00:00 mà gõ số 9 ngay lập tức nó điền 09:00 và chọn vào số 0 ở vị trí số 4.
- Tương tự nếu đang chọn vị trí của phút, nếu gõ số nào lớn hơn 5 nó hiểu chỉ nhập đúng số phút đó. VD: 00:00 gõ số phút là 6 nó sẽ hiểu 00:06 chứ không phải là 00:60.
-Nếu đã nhập số 2 ở vị trí đầu tiên tức là đang 20:30, tại vị trí ký số giờ thứ 2 mà bạn nhập số lớn hơn 3 VD: 24:30 thì nó "cự" bạn bằng 01 msgbox và xóa ngay số 24 và điền vào 00:30 để bạn nhập lại cho đúng số giờ.
View attachment 258592
Mục đich của việc nhập này làm gì vậy Anh.
 
Upvote 0
Mục đich của việc nhập này làm gì vậy Anh.
Ai biết hehe, bởi công việc mình cần nhập giờ vào, giờ ra chẳng hạn v.v... cần thì trên UserForm của mình copy vào thôi.

Ví dụ như mình nhập dưới đây (mục thời điểm thanh toán):

1620982787947.png
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Em hay dùng cách này các anh tham khảo
1621013721823.png

Mã:
Private Sub txt_Time_AfterUpdate()
    Dim a As String
    a = Len(Me.txt_Time)
    If a <= 2 Then
        On Error Resume Next
        Me.txt_Time = Left(Me.txt_Time, a) & ":" & 0
    ElseIf a = 3 Then
        Me.txt_Time = Left(Me.txt_Time, 1) & ":" & Right(Me.txt_Time, 2)
    Else
        Me.txt_Time = Left(Me.txt_Time, 2) & ":" & Right(Me.txt_Time, 2)
    End If
    Me.txt_Time = Format(Me.txt_Time, "HH:MM AM/PM")
End Sub
 
Upvote 0
Em hay dùng cách này các anh tham khảo
View attachment 258642

Mã:
Private Sub txt_Time_AfterUpdate()
    Dim a As String
    a = Len(Me.txt_Time)
    If a <= 2 Then
        On Error Resume Next
        Me.txt_Time = Left(Me.txt_Time, a) & ":" & 0
    ElseIf a = 3 Then
        Me.txt_Time = Left(Me.txt_Time, 1) & ":" & Right(Me.txt_Time, 2)
    Else
        Me.txt_Time = Left(Me.txt_Time, 2) & ":" & Right(Me.txt_Time, 2)
    End If
    Me.txt_Time = Format(Me.txt_Time, "HH:MM AM/PM")
End Sub
Xét về sự kiện có tính cập nhật nhanh nhất (những thuộc tính dựa vào sự thay đổi) có thể bắt đầu từ:

1) KeyDown
2) KeyPress
3) KeyUp
4) Change
5) BeforeUpdate
6) AfterUpdate
7) Exit

Code của bạn dựa vào sự kiện thuộc nhóm 5, 6, 7 là những sự kiện sắp thoát hoặc thoát ra khỏi Control thì mới kích hoạt, như thế nó đã chậm mất rồi, giả sử nếu cái form chỉ duy nhất 1 TextBox hoặc các controls khác có thuộc tính TabStop = False thì dựa vào sự kiện trên là "tèo téo teo".

Tiện ích mà tôi đưa lên là khi bạn nhập giờ nhanh, VD bạn muốn hẹn hò lúc 8g, bạn chỉ việc gõ số 8 ngay lập tức nó đã thành 08:00 mà bạn không phải gõ thêm bất kỳ ký số nào nữa. Hoặc bạn hẹn lịch lúc 9g30, bạn chỉ gõ đúng 2 ký số đó là 9 và 3, ngay lập tức nó cho bạn kết quả là 09:30 không tốn thêm một xíu động tác nào nữa, cho nên bạn sẽ tiết kiệm được vài mili giây! Bạn không cần phải gõ thêm dấu 2 chấm ( : ) hoặc rê chuột đi đâu để chọn vị trí gõ vào, nó tự động select cho bạn nơi cần gõ vào.
 
Upvote 0
Em xin File như hình này mà anh, anh hiểu nhầm ý rồi. Nếu được em cám ơn nhiều!
Xin lỗi bạn, cái textbox ghi giờ là một công cụ rất nhỏ trong một chương trình rất lớn của tôi, tôi không thể chia sẻ cho người khác được, thông cảm bạn nhé.
 
Upvote 0
Xin lỗi bạn, cái textbox ghi giờ là một công cụ rất nhỏ trong một chương trình rất lớn của tôi, tôi không thể chia sẻ cho người khác được, thông cảm bạn nhé.
Okay anh, File a những mục khá hay nhưng chưa biết cách a làm. Nên tìm hiểu thêm, nâng cao kiến thức thôi ah
 
Upvote 0
Web KT
Back
Top Bottom