0

こんにちは仲間のVB開発者/ユーザー/愛好家。元気ですか?

2つのボタンがあるユーザーフォームがあります。

  1. 始める
  2. 止まる

を押すと、特定の列Startの形式で現在の時刻を記録したいと思います。dd/mm/yy hh:nn:ss

次に、Stopボタンを押すと、その隣のセルにもう一度時間を記録したいと思います。

次にもう一度押すStartと、最初のセルの現在のレコードの下に記録したいと思います。基本的に、特定のタスクにかかる時間を確認するためにデータを記録するタイマーを作成しています。

エクセルファイルを投稿し、必要に応じて詳細情報を提供します。

提供された助けに感謝します。

現在のコード

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

フィードバックと提案をありがとうございます。

これらは両方ともうまく機能します。コード内の特定のワークシートにデータを記録する際にまだ問題があります。現在のワークシートを使用したくありません。シート1にして、セル「A2」ではなくセル「A8」で記録を開始したいのですが。

ありがとう。

4

2 に答える 2

1

私は、SQL および MDX クエリを Excel アプリケーションから実行した場合にかかる時間を追跡するために、同様のことを行いました。何かにかかった時間 (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

開始と停止が正しい順序で行われているかどうかを確認していないことに注意してください。開始を 3 回押すと、終了時間が一致しない開始列に値が追加され続け、経過時間が明らかに汚くなります。私が提供したコードがあなたの求めているものである場合は、そのようなロジックをアプリに追加する必要があります。

于 2012-06-05T05:47:45.880 に答える
0

@Head of Catering の回答のシンプルさが気に入っています。発生する必要がある場合にのみ開始または停止できるように、ボタンを 1 つに変更することもできます。

ボタンのテキストだけでなく、視覚的なリマインダーにも色を付けることができます。

いくつか追加して、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 に答える