Nếu thế thì em gọi bằng ANH vậy!Bạn ndu kính mến! (nhưng có lẽ mình nhiều tuổi hơn Bạn, hì)
Để Form hoạt động mà ta vẫn thao tác được trên sheet thì trong phần Properties của UserForm, set mục ShowModal = False (như hình)Mình hỏi thêm là cái đồng hồ này khác với đồng hồ cũ (file CountDown_on_Form_3.xls) như thế nào? Vì đồng hồ cũ khi vừa chạy mình cũng đã vừa làm việc trên file được rồi mà.
Tuy nhiên, để có thể THAO TÁC TRÊN SHEET 1 CÁCH BÌNH THƯỜNG thì không đơn giản thế ---> Anh mở file CountDown_in_Form_3.xls, cho Form chạy xem có Format Cells, tô chữ đậm, nghiêng, chọn size chữ... được hay không? (thậm chí Undo còn không được nữa là...)
Gọi là THAO TÁC BÌNH THƯỜNG có nghĩa là Form chạy cứ chạy mà không ảnh hưởng tí gì đến các thao tác của ta ---> Và làm được điều đó chỉ có thể là hàm SetTimer (API)
Tham khảo bài viết sau nhéCho em hỏi nếu thay chạy trên Form bằng hiển thị trực tiếp vào Cell thì làm thế nào?
Làm luôn cho bạn đây:
PHP:Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Public Check As Boolean
PHP:Private Sub Cmd1_Click() Dim LB As Control, TG As Double, ms As Long On Error Resume Next Set LB = UserForm1.Label1 Check = (Cmd1.Caption = "Start") If UserForm1.Visible = False Then UserForm1.Show TG = IIf(LB.Caption = "00:00:00:00", TimeSerial(0, 0, 15), TimeValue(Left(LB.Caption, 8))) Cmd1.Caption = IIf(Check, "Stop", "Start") Do While Check DoEvents TG = TG - TimeSerial(0, 0, 1) ms = 100 Do ms = ms - 1 LB.Caption = Format(TG, "hh:mm:ss") & ":" & Format(ms, "00") Sleep 10 DoEvents If LB.Caption = "00:00:00:00" Then Check = False Cmd1.Caption = "Start" End If Loop Until ms = 0 Or Check = False Loop End Sub
PHP:Private Sub Cmd2_Click() If UserForm1.Visible Then Check = False Unload UserForm1 Cmd1.Caption = "Start" End If End Sub
View attachment 48173
Mới tạm xong! Chắc còn có thể rút gọn thêm nữa ---> Bạn "cày" thử xem!
Xem file này thử nhé
Làm được như bạn nói thật chẳng dễ ăn đâu! Nếu không dùng hàm API thì... đừng có mơ
Cách làm như sau:
1> Trên Sheet
- Vẽ 2 CommandButton, đặt tên là Cmd1 và Cmd2, có Caption là Start và Close Form
- Code cho 2 Command Button này:
PHP:Private Sub Cmd1_Click() With Sheet1.Cmd1 .Caption = IIf(.Caption = "Start", "Stop", "Start") Run IIf(.Caption = "Stop", "StartTimer", "StopTimer") End With With UserForm1 If .Visible = False Then .Show If .Visible Then If .Label1.Caption = "00:00:00:00" Then Tmp = TimeValue("00:00:15") End If End With End Sub
2> Trong ModulePHP:Private Sub Cmd2_Click() StopTimer Unload UserForm1 End Sub
PHP:Declare Function SetTimer Lib "User32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long Declare Function KillTimer Lib "User32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long Public iT As Double, ms As Double, Tmp As Double
PHP:Sub StartTimer() StopTimer SetTimer Application.hwnd, 1, 10, AddressOf TimeProc End Sub
PHP:Sub StopTimer() KillTimer Application.hwnd, 1 End Sub
3> Trong UserFormPHP:Function TimeProc() On Error Resume Next With UserForm1 If .Label1.Caption = "00:00:00:01" Then StopTimer Sheet1.Cmd1.Caption = "Start" End If iT = iT + 1 ms = (100 - (iT Mod 100)) Mod 100 If ms = 99 Then Tmp = Tmp - TimeValue("00:00:01") .Label1.Caption = Format(Tmp, "hh:mm:ss") & ":" & Format(ms, "00") End With End Function
PHP:Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function SetWindowLong Lib "User32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
PHP:Private Sub UserForm_Initialize() Dim hwnd As Long, HT As Double HT = Me.Height - Me.InsideHeight hwnd = FindWindow("ThunderDFrame", Me.Caption) SetWindowLong hwnd, -16, &H84080080 Me.Height = Me.Height - HT Tmp = TimeValue("00:00:15") End Sub
Xem file đính kèm! ---> Form cứ chạy và ta vẫn làm việc bình thường!PHP:Private Sub UserForm_Terminate() StopTimer ms = 0: iT = 0: Tmp = 0 Sheet1.Cmd1.Caption = "Start" End Sub
Vì dùng hàm SetTimer khá nguy hiểm nên các bạn hãy test thử xem có trục trặc gì không nha