Excel VBA在Userform或Excel关闭时保持Userform Timer运行

时间:2017-03-03 09:12:22

标签: vba excel-vba excel

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

require_once PATH_site . 'typo3conf/ext/extension_name/Classes/Library/PHPExcel/IOFactory.php';

public function excelTest()
    {
        $objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');
        $objReader = $objectManager->get('PHPExcel_IOFactory');

    }

4 个答案:

答案 0 :(得分:2)

计时器的想法不是它运行,而是它记住了一个时间点,可以给你这个点和当前时刻之间的差异。如果你每秒都要求这种差异,那么看起来就像手表一样。

这样的事情将是一个良好的开端。在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或类似内容的方法。

答案 1 :(得分:1)

需要运行“Something”来处理计时器程序,所以如果你想使用VBA,那么Excel不能“关闭”本身,但是你可以让它显示为关闭。 / p>

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

Application.WindowState = xlMinimized

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

Application.Visible = False

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

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

答案 2 :(得分:0)

如果表单已卸载Unload optionsForm,则无法执行此操作。但你可以尝试用optionsForm.hide()“关闭”表单,这只隐藏表单,计时器应该继续运行。

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

答案 3 :(得分:0)

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

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