Nhờ giúp về nhắc nhở công việc sau khoảng thời gian chọn trước (1 người xem)

Liên hệ QC

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

pinklove

Thành viên thường trực
Tham gia
21/1/08
Bài viết
336
Được thích
42
Tôi muốn tạo một file nhắc nhở công việc (tôi đã tạo form ở file đính kèm) với yêu cầu là: Khi khởi động lên nó chỉ hiện form. Tôi sẽ nhập nội dung công việc, sau đó chọn nhắc nhở sau bao nhiêu phút tính từ thời điểm nhập (ngay sau khi ấn OK). Dữ liệu sẽ được nhập vào sheet DATA. Lần sau nhập sẽ nhập vào hàng tiếp theo. Với nút xóa toàn bộ dữ liệu tôi có thể xóa hết tất cả để nhập lại từ đầu.
Khi đến thời gian đã chọn sẽ hiện lên cảnh báo (dạng như Msgbox) để nhắc nhở.

Việc này rất cần thiết đối với công việc của tôi vì có những việc quy định phải hoàn thành trong thời gian cho phép, nếu quên vượt quá sẽ bị phạt nên rất mong sớm nhận được sự giúp đỡ của các anh em trong GPE. Xin chân thành cảm ơn.
 
Lần chỉnh sửa cuối:
Tôi muốn tạo một file nhắc nhở công việc (tôi đã tạo form ở file đính kèm) với yêu cầu là: Khi khởi động lên nó chỉ hiện form. Tôi sẽ nhập nội dung công việc, sau đó chọn nhắc nhở sau bao nhiêu phút tính từ thời điểm nhập (ngay sau khi ấn OK). Dữ liệu sẽ được nhập vào sheet DATA. Lần sau nhập sẽ nhập vào hàng tiếp theo. Với nút xóa toàn bộ dữ liệu tôi có thể xóa hết tất cả để nhập lại từ đầu.
Khi đến thời gian đã chọn sẽ hiện lên cảnh báo (dạng như Msgbox) để nhắc nhở.

Việc này rất cần thiết đối với công việc của tôi vì có những việc quy định phải hoàn thành trong thời gian cho phép, nếu quên vượt quá sẽ bị phạt nên rất mong sớm nhận được sự giúp đỡ của các anh em trong GPE. Xin chân thành cảm ơn.
Tôi thấy bài viết của bạn cũng nhiều mà lệnh Application.OnTime bạn không nghiên cứu được. Lần này bạn tự nghiên cứu nghe.
 

File đính kèm

Upvote 0
Tôi thấy bài viết của bạn cũng nhiều mà lệnh Application.OnTime bạn không nghiên cứu được. Lần này bạn tự nghiên cứu nghe.
Nếu bạn có đọc những bài viết của tôi thì bạn đều thấy tôi đi hỏi là chủ yếu chứ có viết code được đâu. Qua nhiều lần hỏi thì cũng mượn code người này người kia xào xáo thành một số file mình cần được. Tôi cũng đã tìm hiểu trên diễn đàn ko có bài nào theo đúng yêu cầu tôi mới phải đi hỏi. Chứ nếu có tôi cũng đã cố gắng tìm tòi để sửa cho mình rồi. Đâu ai thích đi hỏi nhiều làm gì.
Còn vấn đề bạn trách ko làm nút show form thì quả thực tôi chưa làm với form lần nào nên ko biết. Cái form tôi vẽ ra đó cũng copy từ file bạn khác rồi sửa theo ý mình cần chứ tôi cũng chưa tự tạo được. Trong sheet data tôi để trống vì tôi ko biết dạng bài này thì dữ liệu cần lưu gồm những gì. Có cân cột phụ ko. Thực ra nó chỉ để lưu nội dung và giờ nên tôi nghĩ ko cần tiêu đề vì chỉ làm việc trêb form sau đó hiện msgbox. Sau đó lại clean.
dù sao cũng cảm ơn những góp ý của bạn để tôi có thể tốt hơn. Hi vọng bạn hiểu và hõ trợ tôi.
 
Upvote 0
Vài lời góp ý:

1. Bạn đã từng được giúp code => có hiểu code và có chỉnh sửa được. => có kinh nghiệm viết bài trên GPE
2. Mà bây giờ bạn lập đề tài nhờ giúp mà nửa vời???
+ Tạo cái Form xong, cũng không làm cái Button để show ra sẵn (hiểu & tạo được Form thì tất nhiên có hiểu về User Form & tạo cái Sub gán vào Button để show form là điều đương nhiên.). Chả nhẻ người xem phải Alt+F11 vào User Form mà xem Form của bạn tạo có cái giống gì trong đó ah?
+ Nội dung trên topic thì lưu vào sheet Data, trong khi sheet Data thì 1 Trang trắng, chẳng có tiều đề cột dòng. ==> Lưu vào đâu??? Cứ như cưỡi ngựa xem hoa vậy?

Nói túm lại, với bài của hỏi của mình mà hỏi & trình bày 1 cách vô trách nhiệm đối với bản thân mình như vậy thì chắc còn lâu mới được giúp!

Vài lời góp ý, có gì không phải bỏ qua nha!


Mày mò mãi đền giờ mới tạo được cái nút bấm load Form. Có tìm hiểu thêm nhưng thật sự là khả năng chỉ mới đến đó chẳng giải quyết được gì hơn. Tôi gửi lại file nhờ các bạn giúp dùm code với yêu cầu như sau:
- ở cột "Giờ bắt đầu" sẽ lấy giờ hiện tại ngay khi nhập
- "Giờ kết thúc" = "giờ bắt đầu" + "số phút được nhập ở form" (Sau bao nhiêu phút)
Khi đến giờ kết thúc thì sẽ đưa ra cảnh báo. Có thể là MsgBox hoặc load một useForm với nội dung "Chú ý: đến thời gian của ...." với dấu 3 chấm là nội dung được nhập vào. Cái nào cũng được miễn là khi đó dù đang làm việc gì trên PC thì nó vẫn hiện lên cho biết.
- Khi bấm OK sẽ nhập dữ liệu vào và được tiếp tục nhập thêm dữ liệu mới.
- Lúc khởi động load UseForm, hide bảng tính "Nhac nho cong viec" nhưng cac bảng tính khác vẫn làm việc bình thường.
Mong nhận được sự hỗ trợ của các bạn. Nếu vẫn còn gì chưa tốt mong được bỏ qua. Xin cảm ơn!
 

File đính kèm

Upvote 0
Vì chưa ai giúp nên tôi đang tự mày mò. Nhưng đến đoạn này bị bí nhờ mọi người tư vấn giúp:
Tôi muốn hỏi hàm nào để cộng thêm một số phút vào thời gian cho trước.
VD:
B2 = 2:25:42 PM
C2 = 90
D2 = Thời gian ở B2 + số phút ở C2.

Tôi tìm được hàm NOW()+90*(1/24/60) để cộng từ thời gian hiện tại nhưng không sửa được để nó lấy giá trị từ ô B2. Mong nhận được sự tư vấn ở các bạn.
 
Upvote 0
////// hay quá mà em không biết làm, nào có cho em xem với hjhjjj
 
Upvote 0
Vì chưa ai giúp nên tôi đang tự mày mò. Nhưng đến đoạn này bị bí nhờ mọi người tư vấn giúp:
Tôi muốn hỏi hàm nào để cộng thêm một số phút vào thời gian cho trước.
VD:
B2 = 2:25:42 PM
C2 = 90
D2 = Thời gian ở B2 + số phút ở C2.

Tôi tìm được hàm NOW()+90*(1/24/60) để cộng từ thời gian hiện tại nhưng không sửa được để nó lấy giá trị từ ô B2. Mong nhận được sự tư vấn ở các bạn.
Bạn dùng lệnh này thử xem:
NOW()+Range("C2").Value*(1/24/60)
 
Upvote 0
Bạn dùng lệnh này thử xem:
NOW()+Range("C2").Value*(1/24/60)
Ý của tôi là thời gian bắt đầu tính không phải thời điểm hiện tại mà là thời gian được đặt ở ô B2 bạn ạ. Nếu dùng Now() thì nó tính từ thời điểm hiện tại. Nhưng nếu thế thì khi tôi thêm một công việc vào hàng phía dưới thì thời gian đó sẽ bị sửa lại vào thời điểm mới tác động chứ không theo thời gian công việc cũ.

Với lại công thức của bạn ở trên nó cứ báo lỗi chỗ Value
 
Lần chỉnh sửa cuối:
Upvote 0
Ý của tôi là thời gian bắt đầu tính không phải thời điểm hiện tại mà là thời gian được đặt ở ô B2 bạn ạ. Nếu dùng Now() thì nó tính từ thời điểm hiện tại. Nhưng nếu thế thì khi tôi thêm một công việc vào hàng phía dưới thì thời gian đó sẽ bị sửa lại vào thời điểm mới tác động chứ không theo thời gian công việc cũ. Bạn có thể xem file kèm theo để hiểu ý tôi hơn.
Tại ô D2 bạn gõ công thức như sau:
Mã:
=TIME(HOUR(B2),MINUTE(B2),SECOND(B2))+C2*(1/24/60)
 
Upvote 0
Tại ô D2 bạn gõ công thức như sau:
Mã:
=TIME(HOUR(B2),MINUTE(B2),SECOND(B2))+C2*(1/24/60)
Ồ được rồi, trước đó tôi có thử với công thức
Mã:
=TIME(HOUR(B2),MINUTE(B2)+C2*(1/24/60),SECOND(B2))
Tôi cứ nghĩ cộng thêm phút thì phải cộng vào MINUTE chứ quên mất là phải lấy tất cả cộng với ô C2. Giờ ngồi nghiên cứu tiếp cái Application.Ontime. Mò từ chiều giờ chưa ra kết quả như mong muốn. Sẽ cố gắng đến lúc không được nhờ bạn hỗ trợ với nhé.
 
Lần chỉnh sửa cuối:
Upvote 0
Đến thời điểm này thì bó tay thật sự. Tôi có tìm được cái code nhưng chẳng hiểu vì sao nó không chạy. Bỏ riêng vào 1 file test code thì lúc chạy lúc không. Mấy hôm nay cũng loay hoay đọc, sửa đủ cách rồi mà chẳng được. Rất mong nhận được sự hỗ trợ của các bạn.
 

File đính kèm

Upvote 0
Có bạn nào giúp tôi với ạ. Thật sự rất cần cái này mà bí quá rồi.
 
Upvote 0
Đến thời điểm này thì bó tay thật sự. Tôi có tìm được cái code nhưng chẳng hiểu vì sao nó không chạy. Bỏ riêng vào 1 file test code thì lúc chạy lúc không. Mấy hôm nay cũng loay hoay đọc, sửa đủ cách rồi mà chẳng được. Rất mong nhận được sự hỗ trợ của các bạn.
Mục đích của bạn là gì thì nói rõ ra để giúp một lần cho xong, chứ bạn cứ hỏi trả lời xong lại phát sinh cái khác chỉ hoài không được đâu. Mình thấy file của bạn có ghi 2 dòng có phải ý bạn muốn đến giờ đó thì nhắc việc đúng không? hay là gì? nêu ra cụ thể đi.
 
Upvote 0
Mục đích của bạn là gì thì nói rõ ra để giúp một lần cho xong, chứ bạn cứ hỏi trả lời xong lại phát sinh cái khác chỉ hoài không được đâu. Mình thấy file của bạn có ghi 2 dòng có phải ý bạn muốn đến giờ đó thì nhắc việc đúng không? hay là gì? nêu ra cụ thể đi.
Đúng đó bạn. Mục đích của mình là với form nhập liệu, khi mình nhập số liệu vào thì sẽ có ngày giờ từng việc cụ thể ở cột D. Mình muốn đến giờ của việc nào thì sẽ hiện lên nhắc nhở của việc đó. Trong file có 2 dòng nhưng thực tế mỗi ngày có thể có đến khoảng vài chục việc cần phải được nhắc bạn ạ. File này mình chỉ sử dụng trong ngày thôi.
 
Upvote 0
Bài này cũng khá hay và loằng nhoằng.
Giả sử có n công việc cần cảnh báo tại thời điểm t nào đó.
Khi bắt đầu khởi chạy (tính thời gian nhắc nhở), duyệt qua trong các thời điểm t, thời điểm t(i) nào gần với thời điểm hiện tại (now) nhất thì cho vào Application.Ontime.
Tới đúng thời điểm t(i) thì hiện thông báo. Tắt thông báo đó đi (có thể cho tự động tắt sau vài giây gì đó) thì lại quay lại duyệt xem t(i) nào gần hiện tại nhất...
Chóng mặt -+*/-+*/
 
Upvote 0
Đúng đó bạn. Mục đích của mình là với form nhập liệu, khi mình nhập số liệu vào thì sẽ có ngày giờ từng việc cụ thể ở cột D. Mình muốn đến giờ của việc nào thì sẽ hiện lên nhắc nhở của việc đó. Trong file có 2 dòng nhưng thực tế mỗi ngày có thể có đến khoảng vài chục việc cần phải được nhắc bạn ạ. File này mình chỉ sử dụng trong ngày thôi.
Điều kiện thời gian phải theo thứ tự tăng dần (Cho dễ khỏi phải tìm kiếm nhọc nhằng), thời gian định dạng giờ:phút:giây. Bạn xem đúng như yêu cầu của bạn chưa.
 

File đính kèm

Upvote 0
Điều kiện thời gian phải theo thứ tự tăng dần (Cho dễ khỏi phải tìm kiếm nhọc nhằng), thời gian định dạng giờ:phút:giây. Bạn xem đúng như yêu cầu của bạn chưa.

Phần cảnh báo đúng giờ thì được rồi bạn ạ. Nhưng có một vấn đề, đó là đến cảnh báo nào thì nó cảnh báo luôn cả những công việc sau đó chứ không chỉ riêng mình nó. Nhờ bạn xem lại.
 
Upvote 0
Phần cảnh báo đúng giờ thì được rồi bạn ạ. Nhưng có một vấn đề, đó là đến cảnh báo nào thì nó cảnh báo luôn cả những công việc sau đó chứ không chỉ riêng mình nó. Nhờ bạn xem lại.
Có phải là nếu thông báo công việc 1 thì cũng sẽ thông báo công việc sắp đến (Công việc 2) phải không? Nếu vậy mà bạn không làm được thì bó tay luôn, chắc tôi chạy chủ đề này của bạn quá.!$@!!!$@!!!$@!!
 
Upvote 0
Có phải là nếu thông báo công việc 1 thì cũng sẽ thông báo công việc sắp đến (Công việc 2) phải không? Nếu vậy mà bạn không làm được thì bó tay luôn, chắc tôi chạy chủ đề này của bạn quá.!$@!!!$@!!!$@!!

Không phải, ý tôi là chỉ muốn đến việc nào nó cảnh báo việc đó, không cảnh báo việc tiếp theo. Nhưng với file trên của bạn thì nếu đến việc thứ 1 mà sau đó có cả chục việc khác thì nó cảnh báo luôn cả chục việc đó. Không biết diễn đạt thế bạn đã hiểu chưa ạ.
 
Upvote 0
Không phải, ý tôi là chỉ muốn đến việc nào nó cảnh báo việc đó, không cảnh báo việc tiếp theo. Nhưng với file trên của bạn thì nếu đến việc thứ 1 mà sau đó có cả chục việc khác thì nó cảnh báo luôn cả chục việc đó. Không biết diễn đạt thế bạn đã hiểu chưa ạ.
Sao máy mình vẫn chạy bình thường mà, mỗi một việc mới báo một lần. Bạn kiểm tra lại biến lCount thử xem có chạy đúng không? Bản sửa lại code này và kiểm tra biến lCount xem sao
Mã:
Private Sub Msg()
  If lCount <> 2 Then
     Application.WindowState = xlMaximized
     MsgBox "Da den gio! " & " - " & Range("A" & (lCount - 1)).Value & lCount
  End If
  If Range("D" & lCount).Text <> "" Then
        Application.OnTime TimeValue(Range("D" & lCount).Text), "Msg"
        lCount = lCount + 1
  End If
End Sub
 
Upvote 0
Sao máy mình vẫn chạy bình thường mà, mỗi một việc mới báo một lần. Bạn kiểm tra lại biến lCount thử xem có chạy đúng không? Bản sửa lại code này và kiểm tra biến lCount xem sao
Mã:
Private Sub Msg()
  If lCount <> 2 Then
     Application.WindowState = xlMaximized
     MsgBox "Da den gio! " & " - " & Range("A" & (lCount - 1)).Value & lCount
  End If
  If Range("D" & lCount).Text <> "" Then
        Application.OnTime TimeValue(Range("D" & lCount).Text), "Msg"
        lCount = lCount + 1
  End If
End Sub

Vẫn thế bạn ạ. Chỉ có nó thay đổi ở cảnh báo. Ví dụ: có 3 cảnh báo: cb1,cb2,cb3 thì lúc nó hiện nó sẽ là: cb13, cb24, cb35.
Còn cách kiểm tra biến bạn nói tôi chưa rõ phải kiểm tra thế nào. +-+-+-+
 
Upvote 0
Vẫn thế bạn ạ. Chỉ có nó thay đổi ở cảnh báo. Ví dụ: có 3 cảnh báo: cb1,cb2,cb3 thì lúc nó hiện nó sẽ là: cb13, cb24, cb35.
Còn cách kiểm tra biến bạn nói tôi chưa rõ phải kiểm tra thế nào. +-+-+-+
À thì ra mình bị sơ xuất chỉ test trên sheet Data, không thử trên Sheet khác. Bây giờ chắc không bị lỗi nửa đâu.
 

File đính kèm

Upvote 0
À thì ra mình bị sơ xuất chỉ test trên sheet Data, không thử trên Sheet khác. Bây giờ chắc không bị lỗi nửa đâu.

Cảm ơn bạn đã rất nhiệt tình. Nhưng file mới này tôi lại ko thấy nó chạy. Riêng file của bạn gửi ở bài #20. Có lẽ do tôi đặt trong code của button OK ở form nhaplieu thêm một lần gọi Auto_open nên sau mỗi lần nhập nó lại load lại Auto_open 1 lần, do đó co cảnh báo dồn. Tôi dòng gọi Auto_Open đó đi thì code nó không chạy. Sau đó tôi lại gọi Auto_Open ở button close, có nghĩa là tôi nhập xong vài công việc rồi mới Close một lần thì nó chạy đúng. Chỉ cảnh báo một công việc khi đến thời gian.
Mặc dù vậy lại phát sinh tiếp vấn đề:
-VD lúc đầu tôi nhập 3 cảnh báo, khi hết thời gian của 3 cb đó tôi nhập tiếp thì không chạy. phải xóa hết cac cảnh báo cũ rồi làm lại từ đầu mới được.
- Chỉ cảnh báo lần đầu tiên nó hiện msg thì dù mình đang làm việc gì nó cũng hiện lên. Còn các lần sau nó chỉ nháy biểu tượng Excel ở thanh taskbar. Tôi muốn mỗi lần có msg thì dù đang làm gì trên PC nó cũng show cái msg đó lên, phải ok thì mới làm tiếp việc khác được.
Tôi cũng đã thử trường hợp tách riêng một nút để gọi auto_open chỉ một lần, còn các lần nhập sau không gọi nhưng vẫn không khả quan.

Ngồi test cả trưa được chừng đó. Nhờ bạn nghiên cứu tiếp dùm tôi.
Nhân đây nhờ bạn giải thích giùm tại sao biến Icount lúc đầu lại đặt =2
 
Upvote 0
Cảm ơn bạn đã rất nhiệt tình. Nhưng file mới này tôi lại ko thấy nó chạy. Riêng file của bạn gửi ở bài #20. Có lẽ do tôi đặt trong code của button OK ở form nhaplieu thêm một lần gọi Auto_open nên sau mỗi lần nhập nó lại load lại Auto_open 1 lần, do đó co cảnh báo dồn. Tôi dòng gọi Auto_Open đó đi thì code nó không chạy. Sau đó tôi lại gọi Auto_Open ở button close, có nghĩa là tôi nhập xong vài công việc rồi mới Close một lần thì nó chạy đúng. Chỉ cảnh báo một công việc khi đến thời gian.
Mặc dù vậy lại phát sinh tiếp vấn đề:
-VD lúc đầu tôi nhập 3 cảnh báo, khi hết thời gian của 3 cb đó tôi nhập tiếp thì không chạy. phải xóa hết cac cảnh báo cũ rồi làm lại từ đầu mới được.
- Chỉ cảnh báo lần đầu tiên nó hiện msg thì dù mình đang làm việc gì nó cũng hiện lên. Còn các lần sau nó chỉ nháy biểu tượng Excel ở thanh taskbar. Tôi muốn mỗi lần có msg thì dù đang làm gì trên PC nó cũng show cái msg đó lên, phải ok thì mới làm tiếp việc khác được.
Tôi cũng đã thử trường hợp tách riêng một nút để gọi auto_open chỉ một lần, còn các lần nhập sau không gọi nhưng vẫn không khả quan.

Ngồi test cả trưa được chừng đó. Nhờ bạn nghiên cứu tiếp dùm tôi.
Nhân đây nhờ bạn giải thích giùm tại sao biến Icount lúc đầu lại đặt =2
Vậy mình chịu thua vậy, máy nhà test rất nhiều lần vẫn chạy tốt.
Còn việc làm của mình như sau: Bạn có thể nghiên cứu, nếu thấy sai xót và sửa lại theo ý mình.
Mã:
Public lCount As LongPrivate
 Sub Msg()  
      If lCount <> 2 Then 'Nếu lCount=2 tức là mới chạy lần đầu thì không thông báo     Application.WindowState = xlMaximized ' Hiển thị cửa sổ Excel 
             MsgBox "Da den gio! " & " - " & ThisWorkbook.Sheets("DATA").Range("A" & (lCount - 1)).Value ' Thông báo đã đến giờ kết hợp với nội dung công việc trong cột A  
      End If 
      If ThisWorkbook.Sheets("DATA").Range("D" & lCount).Text <> "" Then ' Nếu trong cột D và dòng lCount có dữ liệu                                    Application.OnTime TimeValue(ThisWorkbook.Sheets("DATA").Range("D" & lCount).Text), "Msg" 'Sẽ chạy thủ tục Msg sau khoảng thời gian tại cột D và dòng lCount        
               lCount = lCount + 1    ' Khi đã xong công việc thì tự động tăng giá trị lCount (Sang công việc tiếp theo).  
      End If
End Sub

Sub Auto_Open() 
     lCount = 2 ' Do dữ liệu của mình lấy từ dòng 2 nên gán lCount=2  
     Application.WindowState = xlMinimized 'Ẩn của sở Excel xuống thanh Taskbar
     Call Msg 'Gọi thủ tục Msg
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bạn. Vậy bạn cho tôi hỏi tiếp. Khi xong công việc thì tự động tăng giá trị ICount lên để sang công việc tiếp theo. Nếu tiếp theo ngay lúc đó chưa có công việc thì biến đó sẽ thế nào? có quay trở lại tìm lần nào nữa không? Nếu không thì giải pháp nào để sau một khoảng thời gian nào đó sẽ thực hiện lại công việc từ đầu?
 
Upvote 0
Cảm ơn bạn. Vậy bạn cho tôi hỏi tiếp. Khi xong công việc thì tự động tăng giá trị ICount lên để sang công việc tiếp theo. Nếu tiếp theo ngay lúc đó chưa có công việc thì biến đó sẽ thế nào? có quay trở lại tìm lần nào nữa không? Nếu không thì giải pháp nào để sau một khoảng thời gian nào đó sẽ thực hiện lại công việc từ đầu?
Muốn quay lại từ đầu hay không là do bạn thiết lập chứ, còn code của mình thì không quay lại từ đầu. Bạn muốn quay lại từ đầu thì dùng cái If nửa ra ngay thôi.
Còn quên là nếu quay lại từ đầu thì bạn cần phải kiểm tra thời gian còn phù hợp nửa hay không? nếu quay lại ô đầu, thời gian ban đầu phải kiểm tra xem đã qua chưa, nếu chưa qua thì khỏe, còn nếu đã qua rồi thì đợi 24 giờ sau mới nhắc tiếp công việc... Bạn ngẩn tò te mà đợi dài cổ.
Hình như tôi nói hơi nhiều ở topic này rồi, để cao thủ khác giúp bạn nhé! thân!
 
Upvote 0
Muốn quay lại từ đầu hay không là do bạn thiết lập chứ, còn code của mình thì không quay lại từ đầu. Bạn muốn quay lại từ đầu thì dùng cái If nửa ra ngay thôi.
Còn quên là nếu quay lại từ đầu thì bạn cần phải kiểm tra thời gian còn phù hợp nửa hay không? nếu quay lại ô đầu, thời gian ban đầu phải kiểm tra xem đã qua chưa, nếu chưa qua thì khỏe, còn nếu đã qua rồi thì đợi 24 giờ sau mới nhắc tiếp công việc... Bạn ngẩn tò te mà đợi dài cổ.
Hình như tôi nói hơi nhiều ở topic này rồi, để cao thủ khác giúp bạn nhé! thân!
Nhờ các gợi ý diễn giải về code ở bài trên của bạn mà tôi đưa ra giải pháp thế này:
PHP:
Private Sub Msg()
  Application.WindowState = xlMaximized 
MsgBox "Da den gio! " & " - " & Range("A2").Value  
Range("A2").EntireRow.Delete 
 Auto_Open
End Sub

Sub Auto_Open()
On Error Resume Next 
 Application.WindowState = xlMinimized
 Application.OnTime Range("D2"), "Msg"
End Sub

Tôi chỉ áp dụng Application.Ontime cho ô D2, Mỗi công việc sau khi hoàn thành thì dòng đó cũng bị delete luôn, rồi Application.Ontime lại lấy giá trị mới ở ô D2 mới. Tôi tạo thêm một button run sub Auto_Open. Khi nhập dữ liệu xong, nếu trước đó chưa có công việc nào thì sẽ chạy Auto_Open, còn nếu dũ liệu ở ô D2 đang còn thì không cần chạy. Đã test kỹ và khá ổn.
Chỉ có một vấn đề hơi bất tiện, đó là ô D2 chứa công thức, nên khi del nó cũng mất. Tôi phải kéo Fill công thức xuống.
PHP:
D2 = IF(B2="";"";TIME(HOUR(B2);MINUTE(B2);SECOND(B2))+C2*(1/24/60))
Tôi nhờ các bạn viết hộ code cho công thức đó ở cột D hộ tôi, và sắp xếp thứ tự tăng dần theo thời gian ở cột D luôn. Tôi đã đọc về định dạng ngày tháng, thời gian nhưng vẫn chưa thể chuyển thành code cho đúng được. Xin cảm ơn.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Nhờ các gợi ý diễn giải về code ở bài trên của bạn mà tôi đưa ra giải pháp thế này:
PHP:
Private Sub Msg()
  Application.WindowState = xlMaximized 
MsgBox "Da den gio! " & " - " & Range("A2").Value  
Range("A2").EntireRow.Delete 
 Auto_Open
End Sub

Sub Auto_Open()
On Error Resume Next 
 Application.WindowState = xlMinimized
 Application.OnTime Range("D2"), "Msg"
End Sub

Tôi chỉ áp dụng Application.Ontime cho ô D2, Mỗi công việc sau khi hoàn thành thì dòng đó cũng bị delete luôn, rồi Application.Ontime lại lấy giá trị mới ở ô D2 mới. Tôi tạo thêm một button run sub Auto_Open. Khi nhập dữ liệu xong, nếu trước đó chưa có công việc nào thì sẽ chạy Auto_Open, còn nếu dũ liệu ở ô D2 đang còn thì không cần chạy. Đã test kỹ và khá ổn.
Chỉ có một vấn đề hơi bất tiện, đó là ô D2 chứa công thức, nên khi del nó cũng mất. Tôi phải kéo Fill công thức xuống.
PHP:
D2 = IF(B2="";"";TIME(HOUR(B2);MINUTE(B2);SECOND(B2))+C2*(1/24/60))
Tôi nhờ các bạn viết hộ code cho công thức đó ở cột D hộ tôi, và sắp xếp thứ tự tăng dần theo thời gian ở cột D luôn. Tôi đã đọc về định dạng ngày tháng, thời gian nhưng vẫn chưa thể chuyển thành code cho đúng được. Xin cảm ơn.
Bạn thêm code sau vào sau dòng Range("A2").EntireRow.Delete thử xem
Mã:
    ThisWorkbook.Sheets("DATA").Range("D2").FormulaR1C1 = _
        "=IF(RC[-2]="""","""",TIME(HOUR(RC[-2]),MINUTE(RC[-2]),SECOND(RC[-2]))+RC[-1]*(1/24/60))"
    ThisWorkbook.Sheets("DATA").Range("A2:D20").Select
    ThisWorkbook.Worksheets("DATA").Sort.SortFields.Clear
    ThisWorkbook.Worksheets("DATA").Sort.SortFields.Add Key:=Range("D2:D20"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ThisWorkbook.Worksheets("DATA").Sort
        .SetRange Range("A1:D20")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
 
Upvote 0
Bạn thêm code sau vào sau dòng Range("A2").EntireRow.Delete thử xem
Mã:
    ThisWorkbook.Sheets("DATA").Range("D2").FormulaR1C1 = _
        "=IF(RC[-2]="""","""",TIME(HOUR(RC[-2]),MINUTE(RC[-2]),SECOND(RC[-2]))+RC[-1]*(1/24/60))"
    ThisWorkbook.Sheets("DATA").Range("A2:D20").Select
    ThisWorkbook.Worksheets("DATA").Sort.SortFields.Clear
    ThisWorkbook.Worksheets("DATA").Sort.SortFields.Add Key:=Range("D2:D20"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ThisWorkbook.Worksheets("DATA").Sort
        .SetRange Range("A1:D20")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

Cảm ơn bạn, code chạy ổn nhưng tôi phải đặt nó trong Auto_Open chứ không phải trong Msg. Vì nếu đặt trong msg thì công việc đầu tiên sẽ không thực hiện được vì D2 không tính được kết quả. Nhưng vẫn còn một vấn đề, đó là nếu tôi nhập công việc đầu tiên xong. Công việc thứ 2 có thời gian trước việc 1, nhưng lúc đó auto_open chưa chạy thì phải làm sao.
Tiếp tục, để bỏ nút click chạy Auto_Open, tôi thay code trong button OK như sau:
Mã:
Private Sub CommandOK_Click()
Dim iRow As Long
Dim ws As Worksheet
Set ws = Worksheets("DATA")
If ws.Range("D3") <> Empty Then
    MsgBox "Da nhap cong viec", vbInformation, "THÔNG BÁO"
Else
    MsgBox "Da nhap cong viec", vbInformation, "THÔNG BÁO"
    Auto_Open
End If
iRow = ws.Cells(Rows.Count, 1) _
  .End(xlUp).Offset(1, 0).Row
If Trim(Me.tbxnoidung.Value) = "" Then
  Me.tbxnoidung.SetFocus
  Exit Sub
End If
ws.Cells(iRow, 1).Value = Me.tbxnoidung.Value
ws.Cells(iRow, 3).Value = Me.tbxphut.Value
Me.tbxnoidung.Value = ""
Me.tbxphut.Value = ""
End Sub
Nó sẽ kiểm tra nếu sau khi tôi nhập công việc xong, ở ô D3 không có dữ liệu, tức là công việc là đầu tiên thì sẽ chạy Auto_Open, còn nếu ô D3 có thì sẽ không chạy. Tôi có chút vướng mắc chỗ này với lệnh IF đó, vì với chỗ
Mã:
If ws.Range("D3") <> Empty Then
    MsgBox "Da nhap cong viec", vbInformation, "THÔNG BÁO"
đúng ra sẽ là một câu lệnh để nó hiểu là nếu D3 trống thì không làm gì cả, nhưng tôi không biết thể hiện nó thế nào nên phải bỏ cái Msgbox vào đó.
Một vấn đề nữa, đó là với button OK, khi nhập xong ấn Enter thì phải ấn 2 lần control mới nhảy về chỗ nhập công việc, còn nếu tôi đặt cái Msgbox ở đó thì Enter xong ấn OK ở msgBox control vẫn nằm ở button ok, phải enter lần nữa. Nếu như vậy thì với công việc đầu tiên, khi mình ấn enter 2 lần nó sẽ chạy 2 lần auto_open, và như vậy thì khi cảnh bảo việc 1, nó sẽ cảnh báo và xóa luôn việc 2. Tôi tạm thời khắc phục vấn đề này bằng cách dùng chuột. Nhưng thế hơi bất tiện nên tôi muốn nhờ các bạn hướng dẫn tôi khắc phục vấn đề trên.
- thứ nhât: ở nút OK chỉ cần Enter 1 lần nó sẽ nhảy trở về ô nhập công việc ngay (Index 0).
- Chỉ cho tôi câu lệnh để sau lệnh "If...then" không thực hiện việc gì cả.

Và giờ tôi đang đọc tiếp để thực hiện việc đến giờ sẽ có cảnh báo bằng âm thanh, sau khi click OK ở msgbox, dòng công việc bị xóa thì mới tắt. Mong các bạn có gợi ý nào thì giúp tôi tham khảo.
 
Lần chỉnh sửa cuối:
Upvote 0
- thứ nhât: ở nút OK chỉ cần Enter 1 lần nó sẽ nhảy trở về ô nhập công việc ngay (Index 0).
- Chỉ cho tôi câu lệnh để sau lệnh "If...then" không thực hiện việc gì cả.
Thứ nhất: Bạn nói mình chưa rõ chổ này, có thể gửi file và ghi yêu cầu trong đó lên đây.
Thứ hai: Bạn sửa code
Mã:
If ws.Range("D3") <> Empty Then
    MsgBox "Da nhap cong viec", vbInformation, "THÔNG BÁO"
Else
    MsgBox "Da nhap cong viec", vbInformation, "THÔNG BÁO"
    Auto_Open
End If
như sau:
Mã:
If  not (ws.Range("D3") <> Empty) Then
    MsgBox "Da nhap cong viec", vbInformation, "THÔNG BÁO"
    Auto_Open
End If
 
Upvote 0
Thứ nhất: Bạn nói mình chưa rõ chổ này, có thể gửi file và ghi yêu cầu trong đó lên đây.
Với gợi ý code của bạn tôi đã bỏ được cái Msg trong button OK và giờ ý của tôi là thế này. Khi chạy Form "NHAP CONG VIEC", sau khi nhập nội dung --->Enter thì control nhảy xuống ô Nhập thời gia. Sau khi nhập thời gian ---> Enter ----> OK. Khi đó Enter tiếp thì dữ liệu sẽ được nhập, nhưng khi đó control vẫn nằm ở nút OK. Phải Enter thêm 1 lần nữa Control mới quay trở về ô để nhập công việc mới. Bây giờ tôi muốn làm sao khi nhập xong công việc chỉ cần ấn Enter 1 lần thì Control quay trở về ô để nhập công việc mới, không nằm ở nút OK nữa.
Lý do: nếu nhập công việc đầu tiên, ô D3 trống khi ta ấn OK thì sẽ gọi Auto_Open, lúc đó nếu ân Enter 1 lần nữa (tức là sẽ bấm OK lần nữa) sẽ gọi Auto_open tiếp vì lúc đó ô D3 vẫn trống. Như vậy sẽ có cảnh báo 2 lần liên tiếp. Hậu quả là nếu trong thời gian chờ cảnh báo 1, ta nhập tiếp cảnh báo 2 thì khi đến thời gian cảnh báo 1 nó sẽ cảnh báo và xóa luôn công việc 2 dù chưa đến giờ.
Việc này có thể tạm khăc phục bằng cách dùng chuột nhưng như thế hơi bất tiện.
 

File đính kèm

Upvote 0
Với gợi ý code của bạn tôi đã bỏ được cái Msg trong button OK và giờ ý của tôi là thế này. Khi chạy Form "NHAP CONG VIEC", sau khi nhập nội dung --->Enter thì control nhảy xuống ô Nhập thời gia. Sau khi nhập thời gian ---> Enter ----> OK. Khi đó Enter tiếp thì dữ liệu sẽ được nhập, nhưng khi đó control vẫn nằm ở nút OK. Phải Enter thêm 1 lần nữa Control mới quay trở về ô để nhập công việc mới. Bây giờ tôi muốn làm sao khi nhập xong công việc chỉ cần ấn Enter 1 lần thì Control quay trở về ô để nhập công việc mới, không nằm ở nút OK nữa.
Lý do: nếu nhập công việc đầu tiên, ô D3 trống khi ta ấn OK thì sẽ gọi Auto_Open, lúc đó nếu ân Enter 1 lần nữa (tức là sẽ bấm OK lần nữa) sẽ gọi Auto_open tiếp vì lúc đó ô D3 vẫn trống. Như vậy sẽ có cảnh báo 2 lần liên tiếp. Hậu quả là nếu trong thời gian chờ cảnh báo 1, ta nhập tiếp cảnh báo 2 thì khi đến thời gian cảnh báo 1 nó sẽ cảnh báo và xóa luôn công việc 2 dù chưa đến giờ.
Việc này có thể tạm khăc phục bằng cách dùng chuột nhưng như thế hơi bất tiện.
Bạn thêm code sau vào trong Form
Mã:
Private Sub tbxphut_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim iRow As Long
Dim ws As Worksheet
If KeyCode = 13 Then
Set ws = Worksheets("DATA")
iRow = ws.Cells(Rows.Count, 1) _
  .End(xlUp).Offset(1, 0).Row
If Trim(Me.tbxnoidung.Value) = "" Then
  Me.tbxnoidung.SetFocus
  Exit Sub
End If
ws.Cells(iRow, 1).Value = Me.tbxnoidung.Value
ws.Cells(iRow, 3).Value = Me.tbxphut.Value
Me.tbxnoidung.Value = ""
Me.tbxphut.Value = ""
Me.tbxnoidung.SetFocus
End If
End Sub
 
Upvote 0
Chưa đúng ý của mình bạn ạ. Thêm code đó nó bỏ qua luôn nút OK. Còn tôi muốn vấn ấn nút OK nhưng chỉ 1 lần thôi là Control quay về ô nhập công việc.
 
Upvote 0
Chưa đúng ý của mình bạn ạ. Thêm code đó nó bỏ qua luôn nút OK. Còn tôi muốn vấn ấn nút OK nhưng chỉ 1 lần thôi là Control quay về ô nhập công việc.
Vậy bạn sử dụng thêm một biến kt kiểu Boolean, sau đó bật / tắt nó và kiểm tra thế là xong chứ gì.
 
Upvote 0
Chưa biết về cái bạn nói, để nghiên cứu đã.;;;;;;;;;;;;;;;;;;;;;;. Có thể cho tôi cái link về vấn đề này không bạn?
Thì bạn sử dụng biến kt as boolean, khi mở form lên bạn gián biến kt=true, khi bạn nháy nút OK thì bạn kiểm tra biến kt=true thì gọi thủ tục auto_open và gán biến kt=false.
 
Upvote 0

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

Back
Top Bottom