【问题标题】:Excel VBA Keep Userform Timer running when Userform or Excel are closedExcel VBA 在用户窗体或 Excel 关闭时保持用户窗体计时器运行
【发布时间】:2020-12-05 06:01:07
【问题描述】:

最近我设法在用户表单上找到了一些关于计时器的代码,我的问题是即使用户表单或 excel 文件已关闭,我也需要保持计时器运行......有人可以看看代码并提供一些反馈?我的用户表单是:optionsForm

Dim dteStart As Date, dteFinish As Date  
Dim dteStopped As Date, dteElapsed As Date  
Dim boolStopPressed As Boolean, boolResetPressed As Boolean

Private Sub Reset_Timer_Click()  
dteStopped = 0  
dteStart = 0  
dteElapsed = 0  
Tech_Timer = "00:00:00"  
boolResetPressed = True  
End Sub  

Private Sub Start_Timer_Click()  
Start_Timer:  
dteStart = Time  
boolStopPressed = False  
boolResetPressed = False  
    Timer_Loop:  
           DoEvents  
             dteFinish = Time  
             dteElapsed = dteFinish - dteStart + dteStopped  
    If Not boolStopPressed = True Then  
        Tech_Timer = dteElapsed  
    If boolResetPressed = True Then GoTo Start_Timer  
    GoTo Timer_Loop  
Else  
    Exit Sub  
End If  
End Sub  

Private Sub Stop_Timer_Click()  
boolStopPressed = True  
dteStopped = dteElapsed  
End Sub  

Private Sub optionsForm_Initialize()  
Tech_Timer = "00:00:00"  
End Sub  

【问题讨论】:

  • 只是一个想法 - 如果 excel 文件已关闭,请将表单的值保存在 excel 的单元格中,然后在打开时继续。它会这样工作吗?
  • 是的,这没问题....我可以为此创建和隐藏一个新选项卡 sheet1...

标签: vba excel


【解决方案1】:

计时器的想法不是它运行,而是它记住一个时间点,并且可以让您知道该点与当前时刻之间的差异。如果您每秒都要求这种差异,那么它看起来就像手表一样运行。

这样的事情将是一个好的开始。在xl_main 中写入以下内容:

Option Explicit

Dim dtime As Date

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Cells(1, 1).Value = dtime
End Sub

Private Sub Workbook_Open()

    If Cells(1, 1).Value = 0 Then
        dtime = Now
    Else
        dtime = CDate(Cells(1, 1))
    End If

End Sub

您可以随意玩弄它并使其变得更好。例如。你可能会找到一种方法来重置dtime 或类似的东西。

【讨论】:

  • 感谢您的评论和那段重要的代码,但我如何将其发布到用户表单中?我可以这样做:Tech_Timer = dtime? ,我的意思是,直接在用户表单中的那个标签中?
  • 更像Tech_Timer = cdate(now-dtime)
  • 好的,我想出了要更改的内容:) 但是需要多考虑一下,因为我有几个用户表单,每个用户表单都需要单独的计时器。这样,他们都得到相同的计时器
【解决方案2】:

需要运行“某些东西”来处理计时器过程,因此如果您想使用 VBA,则 Excel 不能“关闭”本身,但是您可以让它看起来已关闭。

一个明显的选择是使用WindowState property 最小化 Excel 窗口(在显示用户窗体之前):

Application.WindowState = xlMinimized

...或者,使用 Visible property 完全隐藏 Excel 窗口:

Application.Visible = False

...或者如果问题是您需要一个“新”的 Excel 副本才能使用,您可以在启动 Excel 时按住 Alt 在新实例中执行此操作。

我已经发布了代码和一个倒数计时器的可下载示例,该计时器在另一个 @987654325 中使用Windows Timer API(而不是 Excel 的过程)在半独立于 Excel 窗口的用户窗体上显示剩余时间@

【讨论】:

    【解决方案3】:

    如果表单被卸载Unload optionsForm,这是不可能的。但是您可以尝试使用optionsForm.hide() '关闭'表单,这只会隐藏表单,然后计时器应该继续运行。

    即使 Excel 已关闭,我认为计算从开始时间经过的时间的唯一方法是不将开始时间保存在变量 dteStart 中,而是保存在 Excel 单元格中。

    【讨论】:

    • 嗨 Peh,是的,我目前有一个用于卸载它的用户窗体的关闭按钮...。将测试隐藏...如果我关闭 excel 文件,它会继续运行吗? ....对,不起作用...
    • 不!因此您需要使用 Excel 单元格来保存开始时间。
    【解决方案4】:

    实际上,您可以使用放置在模块中的代码。代码是:

    Option Explicit
    Dim T
    
    Sub stopTimer()
    On Error Resume Next
    Application.OnTime (T), Procedure:="Update", Schedule:=False
    End Sub
    
    Sub StartTimer()
    T = Now + TimeValue("00:00:01")
    Application.OnTime T, "Update"
    End Sub
    
    Sub Update()
    UserForm1.TextBox1.Value = Format(Now - Sheets("Sheet1").Range("E11").Value, 
    "hh:mm:ss")
    UserForm1.TextBox2.Value = Format(TimeValue("1:00:00") - (Now - 
    Sheets("Sheet1").Range("E11").Value), "hh:mm:ss")
    Call StartTimer
    End Sub
    

    此后,您现在可以通过调用它在用户窗体中引用它。这是一个典型的例子。这是

    Private Sub Userform_Activate()
    Sheet1.Activate
    Sheets("Sheet1").Range("E11").Value = Now
    Application.Run "StartTimer"
    If Sheets("Sheet1").Range("K27").Value = "K29" Then
    Me.CommandButton4.Caption = "Start"
    Me.CommandButton2.Visible = False
    End If
    End Sub
    

    【讨论】:

    • 当我们将它用作我们刚刚创建的 CBT 的计时器时,它工作得非常好。
    猜你喜欢
    • 1970-01-01
    • 2014-02-09
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多