AnhThu-1976
Thành viên tích cực


- Tham gia
- 17/10/14
- Bài viết
- 1,065
- Được thích
- 175
Trong module của Sheet1, dán sự kiện này vào:Em chào Thầy/cô và anh chị!
Em muốn như sau:
Nếu em đã check vào chechbox, thì em muốn sau 30 giây thì checkbox tự tắt (tự bỏ dấu check)
(nếu em đã tự bỏ thì thôi, code không làm gì cả)
Em cảm ơn!
Private Sub CheckBox1_Change()
If CheckBox1.Value Then
Application.Wait (Now + TimeSerial(0, 0, 30))
CheckBox1.Value = False
End If
End Sub
Giải quyết không khó, nhưng để xem tác giả nói gì.Application.Wait ngưng luôn cả Excel. Suốt 30 giây không cho làm gì cả.![]()
Giải quyết bằng cách dùng giải pháp khác, hay vẫn dùng hàm Wait?Giải quyết không khó, nhưng để xem tác giả nói gì.
Vẫn dùng Wait cho đơn giản anh.Giải quyết bằng cách dùng giải pháp khác, hay vẫn dùng hàm Wait?
Dùng code này chắc là ổn đó bác.Application.Wait ngưng luôn cả Excel. Suốt 30 giây không cho làm gì cả.![]()
Option Explicit
Private Sub CheckBox1_Change()
If CheckBox1.Value Then
autoOffCheckbox 10 'Don vi la giay (s)
End If
End Sub
Sub autoOffCheckbox(waitTime As Long)
Dim dtDate As Date, i As Long, strTime As String
strTime = "00:00:" & Right("0" & waitTime, 2)
dtDate = Now() + TimeValue(strTime)
For i = 1 To 1000
While Now() < dtDate
DoEvents
Wend
CheckBox1.Value = False
Exit For
Next i
End Sub
Tôi nghĩ giải pháp của bạn là OK nhất, bởi trong quá trình code chạy rất mượt so với vòng lặp sử dụng DoEvents, tác giả nên chọn code của bạn.Một cách khác code ít hơn.
Private Sub CheckBox1_Click()
OnTime CheckBox1.Value
End Sub
Sub TurnOffCheckbox()
Sheet1.CheckBox1.Value = False
End Sub
Sub OnTime(schedule As Boolean)
Static t As Date
If schedule Then
t = Now + TimeSerial(0, 0, 5)
End If
On Error Resume Next
If t > 0 Then Application.OnTime t, "'" & ThisWorkbook.Name & "'!Sheet1.TurnOffCheckbox", , schedule
If Not schedule Then t = 0
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Sheet1.OnTime False
End Sub
Private Sub Workbook_AddinUninstall()
Sheet1.OnTime False
End Sub
Mục đích để làm gì vậy nhỉ (vì yêu cầu không logic)?Em chào Thầy/cô và anh chị!
Em muốn như sau:
Nếu em đã check vào chechbox, thì em muốn sau 30 giây thì checkbox tự tắt (tự bỏ dấu check)
(nếu em đã tự bỏ thì thôi, code không làm gì cả)
Em cảm ơn!
@AnhThu-1976 bạn bổ sung như bạn @HeSanbi góp ý để bẫy lỗi nhé.@dangvandang
Còn 2 trường hợp mà mã gây ra lỗi:
1. Nhấn tích nhiều lần trước thời gian, tích sẽ tắt sớm hơn
2. Thoát Workbook trước thời gian, ứng dụng sẽ tự mở lại
JavaScript:Private Sub CheckBox1_Click() OnTime CheckBox1.Value End Sub Sub TurnOffCheckbox() Sheet1.CheckBox1.Value = False End Sub Sub OnTime(schedule As Boolean) Static t As Date If schedule Then t = Now + TimeSerial(0, 0, 5) End If On Error Resume Next If t > 0 Then Application.OnTime t, "'" & ThisWorkbook.Name & "'!Sheet1.TurnOffCheckbox", , schedule If Not schedule Then t = 0 End Sub
Tắt Ontime trước khi thoát
JavaScript:Private Sub Workbook_BeforeClose(Cancel As Boolean) Sheet1.OnTime False End Sub Private Sub Workbook_AddinUninstall() Sheet1.OnTime False End Sub
Thớt chỉ có ý tưởng nhưng chưa làm được cho nên không biết là trong trường hợp bình thường, việc này khá nguy hiểm.Mục đích để làm gì vậy nhỉ (vì yêu cầu không logic)?
Nếu chỉ là thích thì cư nhích tự viết code.
Mục đích của tác giả là sau khi kiểm tra gì gì đó và sau đó buộc phải bỏ check, nếu quên thì code tự động bỏ chọn thay vì thủ công, chỉ thế thôi.Thớt chỉ có ý tưởng nhưng chưa làm được cho nên không biết là trong trường hợp bình thường, việc này khá nguy hiểm.
Nếu đang vào dữ liệu, checkbox nó untick mà mình không hay (ngỡ là nó còn đó) thì sao?
Quả là VBA tạo cơ hội cho người ta lười.Mục đích của tác giả là sau khi kiểm tra gì gì đó và sau đó buộc phải bỏ check, nếu quên thì code tự động bỏ chọn thay vì thủ công, chỉ thế thôi.
Cái này gọi là "Cẩn tắc vô áy náy" thôi anh, kiểu người ta phòng ngừa lỡ quên thì nó tự động tương tác thôi.Quả là VBA tạo cơ hội cho người ta lười.
Ngược lại, nếu đang "kiểm soát cái gì đó" (xem trích dẫn sau) mà nó tắt mất thì có thể "kiểm soát" nhầm.Cái này gọi là "Cẩn tắc vô áy náy" thôi anh, kiểu người ta phòng ngừa lỡ quên thì nó tự động tương tác thôi.
Lý do tại sao phải bỏ "check" mới là quan trọng?Mục đích của tác giả là sau khi kiểm tra gì gì đó và sau đó buộc phải bỏ check, nếu quên thì code tự động bỏ chọn thay vì thủ công, chỉ thế thôi.
Kiểu như nhà bật đèn nhưng quên tắt đèn thì nó tự động tắt cho đỡ tốn điện.Ngược lại, nếu đang "kiểm soát cái gì đó" (xem trích dẫn sau) mà nó tắt mất thì có thể "kiểm soát" nhầm.
Lý do tại sao phải bỏ "check" mới là quan trọng?
Đã làm việc "kiểm soát" mà còn sợ "quên"? Dữ liệu kiểu này ai tin cậy nổi.
Tôi cho rằng bài 14 chỉ là cảnh báo sự "nguy hiểm" (sic) chứ không phải "bàn sâu vào công việc của họ". Giúp thì giúp nhưng nếu cần cũng nên cảnh báo.Dĩ nhiên người ta làm gì đều có mục đích cả, nếu như ta có giải pháp thì giúp, không thì đừng bàn sâu vào công việc của họ.