Lớp học GPE tháng 9 - TPHCM: Name động và Biểu đồ (tối 11, 13 và 15/9) | PivotTable (tối 12, 14 và 16/9) |
Hàm thống kê, chuỗi và công thức mảng (tối 18, 20 và 22/9)

Đăng ký học VBA và ADO - 3 chủ nhật 10, 17 và 24/9 - TPHCM

Đăng ký học VBA Cơ bản 8 buổi tối thứ 3-5-7 từ 19/9 - 5/10/2017 - TPHCM

Đồng hồ đếm ngược trên form

Thảo luận trong 'Lập Trình với Excel' bắt đầu bởi anktdn, 9 Tháng mười hai 2008.

  1. anktdn

    anktdn Thành viên chính thức

    Em cần đồng hồ đếm ngược trên form, khi chạy hết thời gian thì tự động khóa sheet lại, mong các Pác giúp.
     
  2. hoangdanh282vn

    hoangdanh282vn Nguyễn Cảnh Hoàng Danh Staff Member

    Về đồng hồ đếm ngược thì bạn tìm hiểu thêm trên diễn đàn. Mình chỉ nói đến thuật toán xác định thời gian đóng form

    Ta tạo 1 Userform. Sử dụng sự kiện Active để xác định thời gian mở form
    PHP:
    Private Sub UserForm_Activate()
    Application.OnTime Now TimeValue("00:00:05"), "dongform"
    End Sub
    Sau khi mở form 5 giây, thủ tục trên sẽ gọi thủ tục đóng form.
    Bạn Insert module và nhập thủ tục này vào.

    PHP:
    Sub dongform()
    UserForm1.Hide
    End Sub
     

    Các file đính kèm:

  3. anktdn

    anktdn Thành viên chính thức

    Có thêm đồng hồ đếm ngược chạy trên form thì hay quá .
     
  4. sealand

    sealand Thành viên gạo cội

    Không phải vậy đâu Hoang Danh à, ý bạn ấy là cần bổ xung điều khiển Timer trong VB ấy. Như vậy trong thời gian cho phép thì người dùng muốn làm gì thì làm nhưng hết giờ buộc phải thoát. Còn như bạn thì nó giống như flash form thôi. Không hiếu sao máy của mình có điều khiển Timer nhưng không ad được nên đành chịu.
     
    Lần chỉnh sửa cuối: 9 Tháng mười hai 2008
  5. anktdn

    anktdn Thành viên chính thức

    Đúng như ý bạn nói, mình muốn hiển thị thời gian chạy trên form ví dụ trên form sẽ hiển thị 10:15, khi chạy hết đúng 10phút 15 giây form sẽ đóng lại. Ai có ý tưởng hay xin chì giúp. thanks
     
  6. anktdn

    anktdn Thành viên chính thức

    Here is some code that works in Excel 97.

    On the userform., two buttons to start and stop the timer and a label, lblCountdown, and this code


    VBA:

    PHP:
    Private Sub cmdStart_Click() 
    nTime nCount 
    Call RunTimer 
    End Sub
    PHP:
    Private Sub cmsdStop_Click() 
    nTime 
    End Sub
    VBA tags courtesy of www.thecodenet.com

    In a general module, this code


    VBA:

    PHP:
    Public Const nCount As Long 30 ' secs 
    Public nTime As Double 
    Public Sub RunTimer() 
    If nTime > 1 Then 
    nTime = nTime - 1 
    UserForm1.lblCountDown.Caption = Format(TimeSerial(0, 0, nTime), "hh:mm:ss")
     Application.OnTime Now + TimeSerial(0, 0, 1), "RunTimer" 
    Else 
    Unload UserForm1 
    End If 
    End Sub
    VBA tags courte
    Tìm trên trang vba của tác giả XLD viết code cho bộ đồng hồ đếm ngược, mình đã thiết kế được đồng hồ trên form ,gửi file lên đẩ các bạn tham khảo, code đơn giản nhưng ứng dụng rất hay.
     

    Các file đính kèm:

    Chỉnh sửa lần cuối bởi điều hành viên: 15 Tháng năm 2009
  7. bogay54

    bogay54 Thành viên mới

    Có vấn đề khi dùng lệnh OnTime là người dùng nếu điều chỉnh lại đồng hồ của máy tính (win) thì tẻo, excel có nhược điểm là phụ thuộc vào giờ hệ thống (win) bởi vậy khi làm các file có các macro điều khiển bằng time thì bị người dùng sửa giờ hệ thống để lách. Đang đau đầu vì không biết làm thế nào để xây dựng được 1 cái đồng hồ độc lập (không phụ thuộc vào giờ hệ thống) để khi đến những mốc thời gian hạn định file tự chạy các macro theo mình mong muốn mà những người dùng khác không lách được.
     
  8. ndu96081631

    ndu96081631 Ăn cùng GPE, Ở cùng GPE, Sống cùng GPE Staff Member Super Moderator

    Xem file này thử nhé
     

    Các file đính kèm:

  9. ongtrungducmx25

    ongtrungducmx25 Thành viên gạo cội

    thấy đồng hồ đếm ngược không biết chèn âm thanh vào như thế nào đây!
     
  10. ndu96081631

    ndu96081631 Ăn cùng GPE, Ở cùng GPE, Sống cùng GPE Staff Member Super Moderator

  11. Candlelight

    Candlelight Thành viên chính thức

    Có thể tạo đồng hồ đếm ngược trên Form, nhưng đếm tới phần trăm của giây được không ạ?
    Thay vì "00:00:00" thì thành "00:00:00:00"

    Cám ơn rất nhiều ạ!
     
    Lần chỉnh sửa cuối: 2 Tháng bảy 2010
  12. Ếch Xanh

    Ếch Xanh Thành viên tích cực

    Có lẽ không được vì Excel chỉ có cấu trúc này:
    TimeSerial(0, 0, 0) hoặc TimeValue("00:00:00"), đâu có cái nào nói % đâu nhỉ? Ẹc ẹc...
     
  13. ndu96081631

    ndu96081631 Ăn cùng GPE, Ở cùng GPE, Sống cùng GPE Staff Member Super Moderator

    Chưa chắc đâu! Hàm Sleep (API) cho phép Delay 1/1000 giây
    Vậy:
    - Mỗi lần ta Delay 10 đơn vị, tương đương 1/100 giây
    - Mỗi lần Delay như thế, ta ghép giá trị tính toán vào 1 biến... Biến này sẽ dùng phép ghép chuổi để cho vào 2 số sau cùng của Label
    - Sau khi Delay đúng 1 giây, thì sẽ trừ giá trị giây 1 đơn vị
    vân.. vân...
    Tôi chưa làm nhưng tôi nghĩ là.. CÓ THỂ
     
    Lần chỉnh sửa cuối: 2 Tháng bảy 2010
  14. Candlelight

    Candlelight Thành viên chính thức

    Thầy nói cao siêu quá, em chẳng hiểu "tẹo" nào hết đó! Cám ơn Thầy!
     
  15. ndu96081631

    ndu96081631 Ăn cùng GPE, Ở cùng GPE, Sống cùng GPE Staff Member Super Moderator

    Ôi... tôi không nghĩ là nó quá khó hiểu
    - Đếm ngược như các bài trước người ta delay 1 giây 1 lần và mỗi lần như thế người ta trừ giá trị giây của Label 1 đơn vị, đúng không
    - Vậy để làm thêm 2 số như bạn nói thì trong khoảng thời gian 1 giây này, ta Delay thêm 100 lần nữa, mỗi lần là 10 đơn vị (của hàm Sleep), tương đương 1/100 giây
    Thuật toán chỉ vậy thôi, còn việc tính toán thế nào để đưa giá trị vào 2 số sau của Label là việc của... mọi người
     
  16. ndu96081631

    ndu96081631 Ăn cùng GPE, Ở cùng GPE, Sống cùng GPE Staff Member Super Moderator

    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 ControlTG As Doublems 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(0015), TimeValue(Left(LB.Caption8)))
      
    Cmd1.Caption IIf(Check"Stop""Start")
      Do While 
    Check
        DoEvents
        TG 
    TG TimeSerial(001)
        
    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 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
    untitled.JPG

    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!
     

    Các file đính kèm:

  17. thanhlanh

    thanhlanh Thành viên tích cực

    Để Form vừa chạy (macro hoạt động) mà ta vẫn làm việc trên Excel được (như đồng hồ trên) thì nhờ các câu lệnh nào?. Mong các cao thủ chỉ giáo, xin cảm ơn!
     
  18. ndu96081631

    ndu96081631 Ăn cùng GPE, Ở cùng GPE, Sống cùng GPE Staff Member Super Moderator

    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à Cmd1Cmd2, có Caption là StartClose 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
    PHP:
    Private Sub Cmd2_Click()
      
    StopTimer
      Unload UserForm1
    End Sub
    2> Trong Module
    PHP:
    Declare Function SetTimer Lib "User32" (ByVal hwnd As LongByVal nIDEvent As LongByVal uElapse As LongByVal lpTimerFunc As Long) As Long
    Declare Function KillTimer Lib "User32" (ByVal hwnd As LongByVal nIDEvent As Long) As Long
    Public iT As Doublems As DoubleTmp As Double
    PHP:
    Sub StartTimer()
      
    StopTimer
      SetTimer Application
    .hwnd110AddressOf TimeProc
    End Sub
    PHP:
    Sub StopTimer()
      
    KillTimer Application.hwnd1
    End Sub
    PHP:
    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
    3> Trong UserForm
    PHP:
    Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal lpClassName As StringByVal lpWindowName As String) As Long
    Private Declare Function SetWindowLong Lib "User32" Alias "SetWindowLongA" (ByVal hwnd As LongByVal nIndex As LongByVal dwNewLong As Long) As Long
    PHP:
    Private Sub UserForm_Initialize()
      
    Dim hwnd As LongHT 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
    PHP:
    Private Sub UserForm_Terminate()
      
    StopTimer
      ms 
    0iT 0Tmp 0
      Sheet1
    .Cmd1.Caption "Start"
    End Sub
    Xem file đính kèm! ---> Form cứ chạy và ta vẫn làm việc bình thường!
    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
     

    Các file đính kèm:

  19. thanhlanh

    thanhlanh Thành viên tích cực

    Bạn ndu kính mến! (nhưng có lẽ mình nhiều tuổi hơn Bạn, hì)
    Thật tình mình đâu dám làm phiền bạn nhiều vậy?
    Mình chỉ hỏi một vài câu lệnh mà Bạn làm cho cả bài, Bạn rất giỏi và nhiệt tì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à.
     
  20. Lão già Chết Tiệt

    Lão già Chết Tiệt Thành viên mới

    Tôi nghĩ không quá phức tạp đâu ông bạn ơi, mở VBA ra, chọn thuộc tính trên form là ShowModal chọn là False thì ông bạn có thể vừa thao tác trên form vừa thao tác trên excel được. Tôi nói vậy không biết có đúng ý ông anh không?
     

Chia sẻ trang này