Code sự kiện Change chạy 03 lần là bị sai

Liên hệ QC

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

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
Web KT

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

Back
Top Bottom