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

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

Back
Top Bottom