0

您好 VB 开发人员/用户/爱好者。你好吗?

我有一个有两个按钮的用户窗体:

  1. 开始
  2. 停止

当我按下 时Start,我希望它以dd/mm/yy hh:nn:ss特定列中的格式记录当前时间。

然后,当我按下Stop按钮时,我希望它在旁边的单元格中再次记录时间。

然后,如果我Start再次按下,我希望它记录在第一个单元格的当前记录下方。基本上,我正在构建一个计时器来记录数据,以查看某些任务需要多长时间。

我将发布 excel 文件并在必要时提供更多信息。

感谢您提供的任何帮助。

当前代码

Public runTimer As Double
Public startTime As Date
Dim counter As Date

Sub setStart()
    counter = 0
    startTime = Now
    runTimer = Now + TimeSerial(0, 0, 1)

    Application.OnTime runTimer, "setStart", , True

    Set myTime = Sheet4.Range("F1")
    Set timeRng = Sheet4.Range("C8:C100")
    i = WorksheetFunction.CountA(timeRng)
    i = i + 1

    Cells(i, "C") = myTime
    Sheet4.Cells(i, "C").NumberFormat = "yyyy/mm/dd HH:mm:ss"

    If i >= 2 Then
        Cells(i, "D8") = Cells(i, "C8") - Cells(i - 1, "C8")
        Sheet4.Cells(i, "C").NumberFormat = "yyyy/mm/dd HH:mm:ss"
    End If
    Application.EnableEvents = False
End Sub

Sub setStop()
    Application.OnTime runTimer, "setStop", , True

    Set myTime = Sheet4.Range("F1")
    Set timeRng = Sheet4.Range("D8:D100")
    i = WorksheetFunction.CountA(timeRng)
    i = i + 1

    Application.EnableEvents = False
    Cells(i, "D") = myTime
    Sheet4.Cells(i, "D").NumberFormat = "yyyy/mm/dd HH:mm:ss"
End Sub

感谢您的反馈和建议。

这两个都很好用。我仍然无法在代码中的特定工作表中记录数据。我不想使用当前的工作表。我希望它是 sheet1 并在单元格“A8”而不是单元格“A2”中开始录制

谢谢。

4

2 回答 2

1

我做了类似的事情来跟踪从 Excel 应用程序运行 SQL 和 MDX 查询需要多长时间。用户对某件事需要多长时间(花了 5 分钟!)和实际发生的事情的感觉并不总是一致的。我需要知道某些事情需要多长时间来保护应用程序或了解我需要优化什么。

我设置了一张表来模仿你的例子。第 1 行中的标题:

Start Time     Stop Time     Elapsed Time

我还有一个开始按钮和一个停止按钮。我分配setStart给开始按钮和setStop停止按钮。

编码:

Option Explicit

Sub setStart()
    Dim NextRow As Long
    NextRow = GetLastRow("A") + 1

    With Range("a" & NextRow)
        .Value = Now
        .NumberFormat = "yyyy/mm/dd HH:mm:ss"
    End With
End Sub

Sub setStop()
    Dim NextRow As Long
    NextRow = GetLastRow("B") + 1

    With Range("b" & NextRow)
        .Value = Now
        .NumberFormat = "yyyy/mm/dd HH:mm:ss"
    End With
    calcElapsedTime (NextRow)
End Sub

Sub calcElapsedTime(NextRow As Long)
    With Range("c" & NextRow)
        .Formula = "=B" & NextRow & "-A" & NextRow
        .NumberFormat = "HH:mm:ss"
    End With
End Sub

Function GetLastRow(ColumnLetter As String) As Long
    GetLastRow = Range(ColumnLetter & ActiveSheet.Rows.Count).End(xlUp).Row
End Function

请注意,我不是在检查启动和停止是否以正确的顺序完成。如果按 start 3 次,它将继续在 start 列中添加没有匹配停止时间的值,这显然会弄乱经过的时间。如果我提供的代码是您所追求的,那么您需要将这种逻辑添加到您的应用程序中。

于 2012-06-05T05:47:45.880 回答
0

我喜欢@Head of Catering 的简单回答。您可以将其稍微更改为单个按钮,以便您只能根据需要进行启动或停止。

您可以设置按钮文本的颜色格式以及视觉提醒。

只需添加几个并在 CommandButton1 上运行 startTimer

    Option Explicit
Sub startTimer()
If ActiveSheet.CommandButton1.Caption = "START" Then
        setStart
    Else
        setStop
    End If
End Sub
Sub setStart()
    Dim NextRow As Long
    NextRow = GetLastRow("A") + 1

    With Range("a" & NextRow)
        .Value = Now
        .NumberFormat = "yyyy/mm/dd HH:mm:ss"
    End With
   ActiveSheet.CommandButton1.Caption = "STOP"
End Sub

Sub setStop()
    Dim NextRow As Long
    NextRow = GetLastRow("B") + 1

    With Range("b" & NextRow)
        .Value = Now
        .NumberFormat = "yyyy/mm/dd HH:mm:ss"
    End With
    calcElapsedTime (NextRow)
    ActiveSheet.CommandButton1.Caption = "START"
End Sub

Sub calcElapsedTime(NextRow As Long)
    With Range("c" & NextRow)
        .Formula = "=B" & NextRow & "-A" & NextRow
        .NumberFormat = "HH:mm:ss"
    End With
End Sub

Function GetLastRow(ColumnLetter As String) As Long
    GetLastRow = Range(ColumnLetter & ActiveSheet.Rows.Count).End(xlUp).Row
End Function
于 2012-06-05T19:49:17.900 回答