Code sự kiện Change chạy 03 lần là bị sai (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

letienmai

Thành viên hoạt động
Tham gia
16/7/14
Bài viết
146
Được thích
45
Chào anh/ chị
Em đang viết một code để nhập nhanh ngày tháng. Tuy nhiên khi chạy 03 ô liên tục thì sẽ hiện kết quả sai, ví dụ
- nhập tại ô A1 giá trị 11 enter hiện 01/01/2019
- nhập tại ô A2 giá trị 22 enter hiện 02/02/2019
- nhập tại ô A3 giá trị 33 enter hiện 03/03/2019
- nhập tại ô A4 giá trị 44 enter hiện <> 04/04/2019 --> Sai giá trị mong muốn
Mình mò mãi mà không hiểu lý do tại sao, mong ac có kinh nghiệm nhờ chia sẻ.
Nó hơi khó hiểu nhờ ac xem test chi tiết trong file đính kèm.
Cám ơn mọi sự đóng góp và giúp đỡ.
 

File đính kèm

Chào anh/ chị
Em đang viết một code để nhập nhanh ngày tháng. Tuy nhiên khi chạy 03 ô liên tục thì sẽ hiện kết quả sai, ví dụ
- nhập tại ô A1 giá trị 11 enter hiện 01/01/2019
- nhập tại ô A2 giá trị 22 enter hiện 02/02/2019
- nhập tại ô A3 giá trị 33 enter hiện 03/03/2019
- nhập tại ô A4 giá trị 44 enter hiện <> 04/04/2019 --> Sai giá trị mong muốn
Mình mò mãi mà không hiểu lý do tại sao, mong ac có kinh nghiệm nhờ chia sẻ.
Nó hơi khó hiểu nhờ ac xem test chi tiết trong file đính kèm.
Cám ơn mọi sự đóng góp và giúp đỡ.
Có khó gì đâu, do vùng nhập liệu của bạn đang dạng ngày tháng nên nó sai là đúng rồi, cũng code đó bạn nhập với vùng dữ liệu kiểu Text sẽ thấy ngay kết quả.
 
Upvote 0
Có khó gì đâu, do vùng nhập liệu của bạn đang dạng ngày tháng nên nó sai là đúng rồi, cũng code đó bạn nhập với vùng dữ liệu kiểu Text sẽ thấy ngay kết quả.
Quả thật là như vậy luôn anh.
Mà có vấn đề là tại sao nó lại sai khi nhập liên tiếp lần thứ 4 nếu mình nhập 3 lần liên tiếp thì nó vẫn đúng.
Anh có thể giải thích thêm giùm được không.
Cám ơn anh.
 
Upvote 0
Quả thật là như vậy luôn anh.
Mà có vấn đề là tại sao nó lại sai khi nhập liên tiếp lần thứ 4 nếu mình nhập 3 lần liên tiếp thì nó vẫn đúng.
Anh có thể giải thích thêm giùm được không.
Cám ơn anh.
Cái này tôi đoán chắc có lẽ do chức năng tự động chuyển đổi của Excel, bạn thử chọn ô và xem nó định dạng kiểu gì, sau đó nhập liệu và xem lại nó kiểu gì nhé.
 
Upvote 0
Cái này tôi đoán chắc có lẽ do chức năng tự động chuyển đổi của Excel, bạn thử chọn ô và xem nó định dạng kiểu gì, sau đó nhập liệu và xem lại nó kiểu gì nhé.
Với lại sao em test nhập 4 số.
Ví dụ: 2510 -->Mong muốn: 25/10/2019 thì nó lại hiện 10/25/2019, mặc dù em đã thêm dòng code Target.NumberFormar = "dd/mm/yyyy"
 
Upvote 0
Dùng hàm Dateserial() chứ không dùng hàm DateValue().

Dùng DateValue() thì lại cái vòng luẩn quẩn chẳng được tác dụng gì cả. Vẫn phụ thuộc vào format của hệ điều hành.

Dateserial() trả về giá trị chuẩn của ngày cần, rồi muốn format giời bể gì cũng đúng, cũng được.!
 
Upvote 0
Quả thật là như vậy luôn anh.
Lúc đó dữ liệu là text. Và một ngày đẹp trời sẽ có bài: "Tại sao công thức ... trả về kết quả sai". Sai vì dữ liệu là text giả bộ ngày tháng chứ không là ngày tháng theo cách hiểu của Excel. Sống chỉ biết hôm nay, ngày mai nghĩ tiếp?
 
Upvote 0
Với lại sao em test nhập 4 số.
Ví dụ: 2510 -->Mong muốn: 25/10/2019 thì nó lại hiện 10/25/2019, mặc dù em đã thêm dòng code Target.NumberFormar = "dd/mm/yyyy"
Bạn cắt có 1 ký tự mà đòi kết quả được 2 thì tui thua thật. Cách làm nhanh này không khuyến cáo, không lẽ lúc này cũng năm 2019. Giả sử hôm nay nhập, ngày mai (đã sang năm mới) cần sửa đổi thì lại vào code sửa nửa. Chán!
Bài đã được tự động gộp:

Lúc đó dữ liệu là text. Và một ngày đẹp trời sẽ có bài: "Tại sao công thức ... trả về kết quả sai". Sai vì dữ liệu là text giả bộ ngày tháng chứ không là ngày tháng theo cách hiểu của Excel. Sống chỉ biết hôm nay, ngày mai nghĩ tiếp?
Tôi thấy trên diễn đàn này có nhiều trường hợp giống thế này lắm.
 
Upvote 0
Dùng hàm Dateserial() chứ không dùng hàm DateValue().

Dùng DateValue() thì lại cái vòng luẩn quẩn chẳng được tác dụng gì cả. Vẫn phụ thuộc vào format của hệ điều hành.

Dateserial() trả về giá trị chuẩn của ngày cần, rồi muốn format giời bể gì cũng đúng, cũng được.!
Dùng DateSerial thì chuẩn rồi. Nhưng nếu chỉ sửa thành DateSerial thì cũng chả giải quyết được gì.
Bài đã được tự động gộp:

Bạn cắt có 1 ký tự mà đòi kết quả được 2 thì tui thua thật. Cách làm nhanh này không khuyến cáo, không lẽ lúc này cũng năm 2019. Giả sử hôm nay nhập, ngày mai (đã sang năm mới) cần sửa đổi thì lại vào code sửa nửa. Chán!
Người ta không nhập năm 2019 cứng nhắc. Người ta muốn nhập liệu với năm hiện hành và dùng Year(Date).
 
Upvote 0
Bạn cắt có 1 ký tự mà đòi kết quả được 2 thì tui thua thật. Cách làm nhanh này không khuyến cáo, không lẽ lúc này cũng năm 2019. Giả sử hôm nay nhập, ngày mai (đã sang năm mới) cần sửa đổi thì lại vào code sửa nửa. Chán!
Hi. Dạ cám ơn anh đã góp ý, tuy nhiên với với trường hợp Len(Target) = 4 thì em có cắt trái 2 ký tự và cắt phải 1 ký tự, còn cái năm thì em dùng Year(Date) để lấy năm hiện hành chứ không lấy chết năm 2019 ạ.
Bài đã được tự động gộp:

Lúc đó dữ liệu là text. Và một ngày đẹp trời sẽ có bài: "Tại sao công thức ... trả về kết quả sai". Sai vì dữ liệu là text giả bộ ngày tháng chứ không là ngày tháng theo cách hiểu của Excel. Sống chỉ biết hôm nay, ngày mai nghĩ tiếp?
Dạ em cám ơn anh góp ý, tuy nhiên định dạng Text em chỉ áp dụng cho mỗi cột ngày tháng thôi ạ để không ảnh hưởng đến phần công thức.
Bài đã được tự động gộp:

Dùng hàm Dateserial() chứ không dùng hàm DateValue().

Dùng DateValue() thì lại cái vòng luẩn quẩn chẳng được tác dụng gì cả. Vẫn phụ thuộc vào format của hệ điều hành.

Dateserial() trả về giá trị chuẩn của ngày cần, rồi muốn format giời bể gì cũng đúng, cũng được.!
Dạ em cám ơn anh, để em dùng áp dụng thử Dataserial.
 
Upvote 0
Dùng hàm Dateserial() chứ không dùng hàm DateValue().

Dùng DateValue() thì lại cái vòng luẩn quẩn chẳng được tác dụng gì cả. Vẫn phụ thuộc vào format của hệ điều hành.

Dateserial() trả về giá trị chuẩn của ngày cần, rồi muốn format giời bể gì cũng đúng, cũng được.!
Dạ anh cho em hỏi em dùng DateSerial nhưng sao em Enter thì nó hiển thị tháng/ngày/năm cụ thể nhập 2510 thì nó hiện là 10252019. cám ơn anh
 

File đính kèm

  • Capture.PNG
    Capture.PNG
    129.5 KB · Đọc: 14
Upvote 0
1/ Đọc kỹ hướng dẫn trước khi dùng
2/ Format gì tùm lum vậy?
Dạ rõ ràng em thêm Target.Numberformat = "dd/mm/yyyy" nhưng khi gán xuống cells thì lại thành mm/dd/yyyy nên em không hiểu.
Bài đã được tự động gộp:

Dạ rõ ràng em thêm Target.Numberformat = "dd/mm/yyyy" nhưng khi gán xuống cells thì lại thành mm/dd/yyyy nên em không hiểu.
Chết chết....em gõ nhầm "mm/dd/yyyy".
Em cám ơn các anh đã giúp đỡ.
 
Upvote 0
Dạ em cám ơn anh góp ý, tuy nhiên định dạng Text em chỉ áp dụng cho mỗi cột ngày tháng thôi ạ để không ảnh hưởng đến phần công thức.
Ý tôi nói là công thức nào đó tham chiếu tới cột mà bạn định dạng là text kia. Lúc đó công thức sẽ lỗi/sai.
 
Upvote 0
Giải thích các thắc mắc của chủ topic:
"Khi chạy 03 ô liên tục thì sẽ hiện kết quả sai"
Code không liên quan gì đến số lần cả. Nhập ô A4 là sai là do ô A4 đang được định dạng ngày tháng, giá trị .Value là ngày tháng nên độ dài (kết quả của hàm Len) là 10 và code không làm gì cả. Nhập 44 hiển thị 13/02/1900 là do 13/02/1900 là giá trị 44 định dạng dưới dạng ngày tháng.
1572054262580.png
Ngoài ra, sau khi code chuyển giá trị nhập vào thành ngày tháng thì Excel sẽ tự định dạng ô dạng ngày tháng nên nếu bạn nhập lại một lần nữa cũng sẽ bị tương tự như khi nhập ô vào ô A4.
Hướng giải quyết:
Sử dụng .Value2 thay cho .Value và định dạng General hoặc ngày tháng (không định dạng Text vì nó sẽ làm thay đổi kiểu dữ liệu của bạn.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim vCllVal As Variant
    If Target.Cells.Count > 1 Then Exit Sub
    vCllVal = Target.Value2
    If Not IsNumeric(vCllVal) Then Exit Sub
    If Len(vCllVal) = 2 Or Len(vCllVal) = 4 Then
        Application.EnableEvents = False
        Target.Value = DateSerial(Year(Date), Right(vCllVal, Len(vCllVal) / 2), Left(vCllVal, Len(vCllVal) / 2))
        Application.EnableEvents = True
    End If
End Sub
 
Upvote 0
Giải thích các thắc mắc của chủ topic:
"Khi chạy 03 ô liên tục thì sẽ hiện kết quả sai"
Code không liên quan gì đến số lần cả. Nhập ô A4 là sai là do ô A4 đang được định dạng ngày tháng, giá trị .Value là ngày tháng nên độ dài (kết quả của hàm Len) là 10 và code không làm gì cả. Nhập 44 hiển thị 13/02/1900 là do 13/02/1900 là giá trị 44 định dạng dưới dạng ngày tháng.
View attachment 227188
Ngoài ra, sau khi code chuyển giá trị nhập vào thành ngày tháng thì Excel sẽ tự định dạng ô dạng ngày tháng nên nếu bạn nhập lại một lần nữa cũng sẽ bị tương tự như khi nhập ô vào ô A4.
Hướng giải quyết:
Sử dụng .Value2 thay cho .Value và định dạng General hoặc ngày tháng (không định dạng Text vì nó sẽ làm thay đổi kiểu dữ liệu của bạn.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim vCllVal As Variant
    If Target.Cells.Count > 1 Then Exit Sub
    vCllVal = Target.Value2
    If Not IsNumeric(vCllVal) Then Exit Sub
    If Len(vCllVal) = 2 Or Len(vCllVal) = 4 Then
        Application.EnableEvents = False
        Target.Value = DateSerial(Year(Date), Right(vCllVal, Len(vCllVal) / 2), Left(vCllVal, Len(vCllVal) / 2))
        Application.EnableEvents = True
    End If
End Sub
Dạ chân thành cám ơn anh nhiều ạ. Nay em biết thêm Value2.
 
Upvote 0
Thực ra bài không hề khó. Khi tôi góp ý về TEXT thì tôi nghĩ là sẽ có câu đại loại như: "Ừ nhỉ. Thế làm thế nào để chuẩn, để là ngày tháng?". Nhưng nhận được câu trả lời thì tôi hiểu là người hỏi hài lòng rồi. Người ta không cần tò mò gì thêm nên tôi cũng thôi luôn.
Sử dụng .Value2 thay cho .Value và định dạng General hoặc ngày tháng (không định dạng Text vì nó sẽ làm thay đổi kiểu dữ liệu của bạn.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim vCllVal As Variant
    If Target.Cells.Count > 1 Then Exit Sub
    vCllVal = Target.Value2
    If Not IsNumeric(vCllVal) Then Exit Sub
    If Len(vCllVal) = 2 Or Len(vCllVal) = 4 Then
        Application.EnableEvents = False
        Target.Value = DateSerial(Year(Date), Right(vCllVal, Len(vCllVal) / 2), Left(vCllVal, Len(vCllVal) / 2))
        Application.EnableEvents = True
    End If
End Sub
Thế cần nhập vd. ngày 3 tháng 11 thì gõ thế nào? Gõ '0311 thì tốn 2 cú gõ '0.

Tôi làm cho VALUE.
Lưu ý:
- nếu ngày chỉ có 1 ký tự thì tháng ta gõ 1 hoặc 2 ký tự đều được. Vd. 51 -> 5/1, 501 -> 5/1, 511 -> 5/11
- nếu ngày có 2 ký tự thì tháng bắt buộc phải gõ 2 ký tự, thậm chí tháng 1-9. Vì nếu không sẽ có trường hợp không xác định. Vd. 311 là 31 tháng 1 hay 3 tháng 11?

Tóm lại nếu gõ 3 hoặc 4 ký tự thì 2 ký tự cuối luôn là tháng. Nếu ngày có 2 ký tự thì phải gõ 4 ký tự - vd. 2501, 2512.
Code chưa phục vụ lỗi. Vd. gõ 41,3
Định dạng General trên sheet.

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim text As String
    With Target
        If .Cells.Count > 1 Then Exit Sub
        text = CLng(.Value)
        Application.EnableEvents = False
        If Len(text) = 2 Then
            Target = DateSerial(Year(Date), Right(text, 1), Left(text, 1))
        ElseIf Len(text) <= 4 Then
            Target = DateSerial(Year(Date), Right(text, 2), Left(text, Len(text) - 2))
        End If
        Application.EnableEvents = True
    End With
End Sub
 
Upvote 0
Thực ra bài không hề khó. Khi tôi góp ý về TEXT thì tôi nghĩ là sẽ có câu đại loại như: "Ừ nhỉ. Thế làm thế nào để chuẩn, để là ngày tháng?". Nhưng nhận được câu trả lời thì tôi hiểu là người hỏi hài lòng rồi. Người ta không cần tò mò gì thêm nên tôi cũng thôi luôn.

Thế cần nhập vd. ngày 3 tháng 11 thì gõ thế nào? Gõ '0311 thì tốn 2 cú gõ '0.

Tôi làm cho VALUE.
Lưu ý:
- nếu ngày chỉ có 1 ký tự thì tháng ta gõ 1 hoặc 2 ký tự đều được. Vd. 51 -> 5/1, 501 -> 5/1, 511 -> 5/11
- nếu ngày có 2 ký tự thì tháng bắt buộc phải gõ 2 ký tự, thậm chí tháng 1-9. Vì nếu không sẽ có trường hợp không xác định. Vd. 311 là 31 tháng 1 hay 3 tháng 11?

Tóm lại nếu gõ 3 hoặc 4 ký tự thì 2 ký tự cuối luôn là tháng. Nếu ngày có 2 ký tự thì phải gõ 4 ký tự - vd. 2501, 2512.
Code chưa phục vụ lỗi. Vd. gõ 41,3
Định dạng General trên sheet.

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim text As String
    With Target
        If .Cells.Count > 1 Then Exit Sub
        text = CLng(.Value)
        Application.EnableEvents = False
        If Len(text) = 2 Then
            Target = DateSerial(Year(Date), Right(text, 1), Left(text, 1))
        ElseIf Len(text) <= 4 Then
            Target = DateSerial(Year(Date), Right(text, 2), Left(text, Len(text) - 2))
        End If
        Application.EnableEvents = True
    End With
End Sub
Em có vận dụng bài của anh như sau
1/ code chỉ cho kết quả ở cột F từ hàng thứ 10 trở xuống
2/ Tháng lấy ô A1 và năm lấy ô A2
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim text As String
    If CheckBox1 = False Then
        MsgBox "chua bat checkbox"
        Exit Sub
    End If
    With Target


        If Target.Count = 1 And Target.Column = 6 And Target.Row >= 10 Then
            If .Cells.Count > 1 Or Target < 1 Or Target > 31 Then
                MsgBox "Nhap ngày kg dung!"
                Target.NumberFormat = "General"
                Exit Sub
            End If
            text = CLng(.Value)
            Application.EnableEvents = False
            If Len(text) = 2 Then
                Target = DateSerial(Range("$A$2").Value, Range("$A$1").Value, Left(text, 2))
                '                Target = DateSerial(Range("$A$2").Value, Range("$A$1").Value, text)
                '        ElseIf Len(text) <= 4 Then
                '            Target = DateSerial(Year(Date), Range("A1"), Left(text, Len(text) - 2))
            End If
        End If

        Application.EnableEvents = True
    End With
    'End If
End Sub
Khi em gõ ở ô target từ 01 ->09 thì code không cho kết quả là ngày, tháng, năm
Anh vui lòng sửa giúp em, em cảm ơn
 

File đính kèm

Upvote 0
Khi em gõ ở ô target từ 01 ->09 thì code không cho kết quả là ngày, tháng, năm
Anh vui lòng sửa giúp em, em cảm ơn
Việc của người ta là gõ nhanh ngày tháng, việc của bạn là gõ ngày rồi kết hợp với tháng và năm cho trước để tạo ngày tháng năm.

Nhưng thôi, tôi viết "bản nháp" cho bạn. Tại sao tôi nói là bản nháp? Vì có nhiều điều phải thống nhất.
1. Nếu gõ nhầm là 1. hoặc 1.5 hoặc "a" thì sao? Bạn đừng nói là: Tôi sẽ nhớ và không gõ nhầm. Vì người viết code không có quyền giả thiết là người dùng nó sẽ luôn tỉnh táo, không nhầm lẫn. Rằng không có chuyện vừa làm việc vừa bận tâm, lo sợ. Không có chuyện: "Không biết sếp gọi lên thảm quỳ chiều nay để làm gì nhỉ. Thông báo tăng lương hay kỷ luật", "Vợ nhắn tin là có cuộc họp. Làm sao về sớm để đón con đây", "Bạn gái hôm qua còn khóc đòi cưới, hôm nay lại nhắn tin chia tay là sao", "Mẹ vợ ở quê lên chơi đang lạc ở bến xe mà sếp lại vừa giao bản báo cáo ...". Người viết code phải giả thiết là người dùng có thể không tỉnh táo, mệt mỏi, làm việc mà ý nghĩ lại bay bổng ở chốn chân trời. Rõ ràng gõ "a" thì báo lỗi rồi.

2. Nếu gõ 1. hoặc 1.5 thì sao? Báo lỗi hay làm tròn tới số nguyên dương? Thế nếu là -1.5 thì sao?

3. Kết quả có bắt buộc phải là tháng như ở A1 không? Tôi hỏi vì vd. A1 = 2 mà người ta gõ 30 thì báo lỗi hay trả về 02/03/2019 (không đúng là tháng 2 = A1)? Nếu A1 = 9 mà người ta gõ 31 thì báo lỗi hay trả về 01/10/2019 (không đúng là tháng 9 = A1)?

Khi hỏi thì phải cho phương án giải quyết những trường hợp "không bình thường". Người khác không thể đoán được cách mà bạn muốn giải quyết những "sự cố" đó.

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If CheckBox1 = False Then
        MsgBox "chua bat checkbox"
        Exit Sub
    End If
    With Target
        If .Count = 1 And .Column = 6 And .Row >= 10 Then
            If .Value < 1 Or .Value > 31 Then
                MsgBox "Nhap ngŕy kg dung!"
            Else
                Application.EnableEvents = False
                .Value = DateSerial(Range("$A$2").Value, Range("$A$1").Value, .Value)
                Application.EnableEvents = True
            End If
        End If
    End With
End Sub
 
Upvote 0
Việc của người ta là gõ nhanh ngày tháng, việc của bạn là gõ ngày rồi kết hợp với tháng và năm cho trước để tạo ngày tháng năm.

Nhưng thôi, tôi viết "bản nháp" cho bạn. Tại sao tôi nói là bản nháp? Vì có nhiều điều phải thống nhất.
1. Nếu gõ nhầm là 1. hoặc 1.5 hoặc "a" thì sao? Bạn đừng nói là: Tôi sẽ nhớ và không gõ nhầm. Vì người viết code không có quyền giả thiết là người dùng nó sẽ luôn tỉnh táo, không nhầm lẫn. Rằng không có chuyện vừa làm việc vừa bận tâm, lo sợ. Không có chuyện: "Không biết sếp gọi lên thảm quỳ chiều nay để làm gì nhỉ. Thông báo tăng lương hay kỷ luật", "Vợ nhắn tin là có cuộc họp. Làm sao về sớm để đón con đây", "Bạn gái hôm qua còn khóc đòi cưới, hôm nay lại nhắn tin chia tay là sao", "Mẹ vợ ở quê lên chơi đang lạc ở bến xe mà sếp lại vừa giao bản báo cáo ...". Người viết code phải giả thiết là người dùng có thể không tỉnh táo, mệt mỏi, làm việc mà ý nghĩ lại bay bổng ở chốn chân trời. Rõ ràng gõ "a" thì báo lỗi rồi.

2. Nếu gõ 1. hoặc 1.5 thì sao? Báo lỗi hay làm tròn tới số nguyên dương? Thế nếu là -1.5 thì sao?

3. Kết quả có bắt buộc phải là tháng như ở A1 không? Tôi hỏi vì vd. A1 = 2 mà người ta gõ 30 thì báo lỗi hay trả về 02/03/2019 (không đúng là tháng 2 = A1)? Nếu A1 = 9 mà người ta gõ 31 thì báo lỗi hay trả về 01/10/2019 (không đúng là tháng 9 = A1)?

Khi hỏi thì phải cho phương án giải quyết những trường hợp "không bình thường". Người khác không thể đoán được cách mà bạn muốn giải quyết những "sự cố" đó.
Nói chung bẫy lỗi chỉ mang tính chất tương đối thôi anh ạ, giảm được phần nào tốt phần đó . Vì việc nhập liệu là công việc nhàm chán nhất, dễ buồn ngủ
 
Upvote 0
Xin chân thành cám ơn các anh/ chị đã hỗ trợ hoàn thành ý tưởng nhập liệu nhanh ngày tháng của năm hiện tại.
Và đây là code hoàn chỉnh cuối cùng gửi cho những ai cần sau này để tham khảo.
Cách nhập: (Đã test các trường hợp)
15 --> 01/05/2019 (năm là hiện tại)
912 --> 09/12/2019 (năm là hiện tại)
154 --> 15/04/2019 (năm là hiện tại)
2810 --> 28/10/2019 (năm là hiện tại)
915 --> Báo lỗi
345 --> Báo lỗi
2813 --> Báo lỗi
3212 --> Báo lỗi
----------------------------------------------------------------------------------------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
Dim text As String
With Target
If .Cells.Count > 1 Then Exit Sub
text = CLng(.Value)
Application.EnableEvents = False
If Len(text) = 2 Then
Target = DateSerial(Year(Date), Right(text, 1), Left(text, 1))
ElseIf Len(text) <= 4 Then
If Right(text, 2) > 12 And Left(text, Len(text) - 2) > 31 Then GoTo loi
If Right(text, 2) > 12 And Left(text, Len(text) - 1) > 31 Then GoTo loi
If Right(text, 2) > 12 Then
Target = DateSerial(Year(Date), Right(text, 1), Left(text, Len(text) - 1))
Else
Target = DateSerial(Year(Date), Right(text, 2), Left(text, Len(text) - 2))
End If
End If
GoTo thoat
loi:
Target = ""
Target.Select
MsgBox "Sai ngày tháng.", vbOKOnly + 16, "Thông báo"
thoat:
Application.EnableEvents = True
End With
End Sub
 
Upvote 0
Và đây là code hoàn chỉnh cuối cùng gửi cho những ai cần sau này để tham khảo.
Cách nhập: (Đã test các trường hợp)
15 --> 01/05/2019 (năm là hiện tại)
912 --> 09/12/2019 (năm là hiện tại)
154 --> 15/04/2019 (năm là hiện tại)
2810 --> 28/10/2019 (năm là hiện tại)
915 --> Báo lỗi
345 --> Báo lỗi
2813 --> Báo lỗi
3212 --> Báo lỗi
Cách gõ nhanh những ngày sau như thế nào?

11, 20, 21, 30, 31 tháng 1
10 11, 20, 21 tháng 2
10, 20, 30 tháng 3, 4, 5, 6, 7, 8, 9
 
Upvote 0
Cách gõ nhanh những ngày sau như thế nào?

11, 20, 21, 30, 31 tháng 1
10 11, 20, 21 tháng 2
10, 20, 30 tháng 3, 4, 5, 6, 7, 8, 9
Bác có thể đặt luật ưu tiên. Ví dụ ưu tiên tháng: 212 tự động hiểu là 2 tháng 12 thay vì 21 tháng 2.

Tuy nhiên, luật là một chuyện, người gõ quen với luật là chuyện khác.

Theo tôi, cái ý tưởng "gõ nhanh" là ý tưởng "mời mọc dữ liệu rác"
 
Upvote 0
Bác có thể đặt luật ưu tiên. Ví dụ ưu tiên tháng: 212 tự động hiểu là 2 tháng 12 thay vì 21 tháng 2.
Thì trong bài #18 tôi cũng viết rồi. Nếu 3 ký tự thì 2 ký tự cuối luôn là tháng.
Tóm lại nếu gõ 3 hoặc 4 ký tự thì 2 ký tự cuối luôn là tháng.
Cái tôi hỏi là cụ thể. Đã có code của chủ thớt rồi. Bây giờ tôi chỉ hỏi cách gõ những ngày sau vì tôi không biết gõ.

11, 20, 21, 30, 31 tháng 1
10 11, 20, 21 tháng 2
10, 20, 30 tháng 3, 4, 5, 6, 7, 8, 9

Tôi hỏi vì nếu tôi hiểu được code thì chắc qui tắc là:
- Nếu ngày và tháng đều < 10 - đều có 1 ký tự - thì gõ 2 ký tự.
- Nếu ngày và tháng đều > 9 - đều có 2 ký tự - thì gõ 4 ký tự.
- Nếu trong ngày và tháng 1 cái có 1 ký còn cái kia 2 ký tự thì gõ 3 ký tự.

Như thế là hết các khả năng, chỉ có 3 khả năng.

Nếu tôi không lú lẫn thì với qui tắc đó phải gõ những ngày tôi chỉ ra như thế nào? Nếu gõ 3 ký tự chắc là không được, trừ phi tôi lú lẫn. Còn nếu phải gõ 4 ký tự thì hơi rắc rối. Vì bình thường gõ 3 ký tự cho trường hợp 3 nhưng riêng 30 ngày kể trên thì lại "đặc biệt" gõ theo trường hợp 2. Nhớ 30 ngày "đặc biệt" để gõ đúng 4 ký tự theo trường hợp 2 chứ không phải theo trường hợp 3 thì vài hôm là quên.

Đang gõ ngày 22-28 tháng 2 bằng 222, 232, 242, 252, 262, 272, 282, đùng một cái lại phải gõ ngày 20-21 tháng 2 là 2002, 2102? Nếu thế thì phải nhớ 30 "đặc biệt" thôi. Vài hôm không gõ là chắc chắn quên
Bài đã được tự động gộp:

Theo tôi, cái ý tưởng "gõ nhanh" là ý tưởng "mời mọc dữ liệu rác"
Nhất chí cả 4 tay. :D.
 
Lần chỉnh sửa cuối:
Upvote 0
...
Đang gõ ngày 22-28 tháng 2 bằng 222, 232, 242, 252, 262, 272, 282, đùng một cái lại phải gõ ngày 20-21 tháng 2 là 2002, 2102? Nếu thế thì phải nhớ 30 "đặc biệt" thôi. Vài hôm không gõ là chắc chắn quên
Chính xác là vậy. Và cũng chẳng cần vài hôm.
Bác nhờ một ngừoi nào đó gõ giùm cho bác 100 ngày. Giải thích cách gõ đàng hoàng. Sau đó bác kiểm tra lại xem ngừoi ta gõ gì.
 
Upvote 0
Chung quy tại chữ lười - cứ gõ chuẩn đi khỏi code mà xong ngay từ tuần trước
 
Upvote 0
Chung quy tại chữ lười - cứ gõ chuẩn đi khỏi code mà xong ngay từ tuần trước
Biết đâu đó lại là sáng kiến cải tiến năng suất công việc. Gặp đúng gu của sếp, gãi đúng chỗ ngứa của ổng thì sau vài ba sáng kiến kiểu đó biết đâu lại được tăng lương, thăng tiến lên làm quản lý. :D
 
Upvote 0
Biết đâu đó lại là sáng kiến cải tiến năng suất công việc. Gặp đúng gu của sếp, gãi đúng chỗ ngứa của ổng thì sau vài ba sáng kiến kiểu đó biết đâu lại được tăng lương, thăng tiến lên làm quản lý. :D
Thăng tiến thì hổng biết chứ thưởng và đạt "KPI" thì có. Sếp chỉ nhìn thấy lúc biểu diễn cho xem chứ lúc kết quả sai đâu có thấy được.
Ít lâu sau, khi chỉnh lại để lấp chỗ sai thì lại được khen thưởng sáng kiến lần nữa. Chứ làm hoàn chỉnh từ đầu thì chỉ thưởng 1 lần.
Tôi bảo đảm là tối thiểu đến cái "sáng kiến" buộc gõ đủ 4 chữ số mới hy vọng chấm dứt. Và từ giờ đến đó phải qua bao lần khen thưởng thì tuỳ theo trí tưởng tượng phong phú của thớt.

Cái này tụi Tây cũng có một loại tương tự, gọi là cowboy developer. Họ làm việc ở một chỗ chỉ một thời gian ngắn, thiết kế và hoàn tất thật nhanh, xong chuyển qua chỗ khác làm. Một thời gian sau, khi hệ thống đổ vỡ tùm lum thì chả ai biết họ ở đâu nữa để mà truy cứu.
 
Upvote 0
Thăng tiến thì hổng biết chứ thưởng và đạt "KPI" thì có. Sếp chỉ nhìn thấy lúc biểu diễn cho xem chứ lúc kết quả sai đâu có thấy được.
Ít lâu sau, khi chỉnh lại để lấp chỗ sai thì lại được khen thưởng sáng kiến lần nữa. Chứ làm hoàn chỉnh từ đầu thì chỉ thưởng 1 lần.
Tôi bảo đảm là tối thiểu đến cái "sáng kiến" buộc gõ đủ 4 chữ số mới hy vọng chấm dứt. Và từ giờ đến đó phải qua bao lần khen thưởng thì tuỳ theo trí tưởng tượng phong phú của thớt.

Cái này tụi Tây cũng có một loại tương tự, gọi là cowboy developer. Họ làm việc ở một chỗ chỉ một thời gian ngắn, thiết kế và hoàn tất thật nhanh, xong chuyển qua chỗ khác làm. Một thời gian sau, khi hệ thống đổ vỡ tùm lum thì chả ai biết họ ở đâu nữa để mà truy cứu.
Quan trọng là hôm nay thôi bác. Hôm nay có sáng kiến thì hóa ra mình tự tăng lương cho mình, tự bồi dưỡng. Còn vài năm nữa nó lòi ra là sáng kiến bê tông cốt tre thì mình đã ở chốn chân trời nào rồi. :D
 
Upvote 0
Quan trọng là hôm nay thôi bác. Hôm nay có sáng kiến thì hóa ra mình tự tăng lương cho mình, tự bồi dưỡng. Còn vài năm nữa nó lòi ra là sáng kiến bê tông cốt tre thì mình đã ở chốn chân trời nào rồi. :D
Cái vụ sáng kiến "từng phần" này chính tôi học được mấy chục năm trước. Sếp tôi lúc đó bảo: "cậu đừng có đưa ra hết một lần. Một là cơ hội không có nhiều, cậu nên để giành vốn. Và hai là ở trên nó cũng chả hiểu nổi mấy cái nghiên cứu sâu quá."

Chú: "bê tông cốt tre", theo như mấy bài tôi đọc của cụ Tô Hoài viết về Hà Nội thì cái "sáng kiến" này có từ thời Nhật đảo chính Pháp.
Tuy nhiên, tôi chỉ nói là tôi đọc thấy. Việc cụ Tô Hoài có được người ta công nhận là "viết sự thật" hay không thì tôi chả có cơ sở nào để bàn cãi.
 
Upvote 0
Chú: "bê tông cốt tre", theo như mấy bài tôi đọc của cụ Tô Hoài viết về Hà Nội thì cái "sáng kiến" này có từ thời Nhật đảo chính Pháp.
Tuy nhiên, tôi chỉ nói là tôi đọc thấy. Việc cụ Tô Hoài có được người ta công nhận là "viết sự thật" hay không thì tôi chả có cơ sở nào để bàn cãi.
Vụ này tôi đọc trên mạng. Vd.


 
Upvote 0
Thăng tiến thì hổng biết chứ thưởng và đạt "KPI" thì có. Sếp chỉ nhìn thấy lúc biểu diễn cho xem chứ lúc kết quả sai đâu có thấy được.
Ít lâu sau, khi chỉnh lại để lấp chỗ sai thì lại được khen thưởng sáng kiến lần nữa. Chứ làm hoàn chỉnh từ đầu thì chỉ thưởng 1 lần.
Tôi bảo đảm là tối thiểu đến cái "sáng kiến" buộc gõ đủ 4 chữ số mới hy vọng chấm dứt. Và từ giờ đến đó phải qua bao lần khen thưởng thì tuỳ theo trí tưởng tượng phong phú của thớt.

Cái này tụi Tây cũng có một loại tương tự, gọi là cowboy developer. Họ làm việc ở một chỗ chỉ một thời gian ngắn, thiết kế và hoàn tất thật nhanh, xong chuyển qua chỗ khác làm. Một thời gian sau, khi hệ thống đổ vỡ tùm lum thì chả ai biết họ ở đâu nữa để mà truy cứu.
Bác nói chuẩn...:D
Bài đã được tự động gộp:

Chung quy tại chữ lười - cứ gõ chuẩn đi khỏi code mà xong ngay từ tuần trước
Hihi. Không yêu thì cũng đừng nên nói lời cay đắng.
Bác cứ nói thế thì tại sao con người không đi làm, đi du lịch.... bằng đôi chân của mình mà phải đi bằng xe đạp, xe máy, xe hơi, tàu lửa. tàu siêu tốc, máy bay, du thuyền....:):)
Sự thật là những người lười là những người luôn có nhiều cải tiến để càng "lười hơn".
Ví dụ vui thôi.
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom