【VBA】ストップウォッチの作り方

今回は、ストップウォッチの作り方です。

下記の動画のようなストップウォッチを作りました。
タスクの時間計測用に作ったものなので、もしよければ参考にしてください。

↓実演動画
https://youtu.be/7lLrI7dDbIY

ソースコードは下記の通りです。

```
Private blnStop As Boolean
Private blnStart As Boolean

Sub StopWatch1()
    Dim dblTimer As Double
    Dim objWbk As Workbook                                          
    Set objWbk = ThisWorkbook
    
    If blnStart = True Then
        blnStop = True
        Exit Sub
    End If

    blnStart = True
    blnStop = False
    dblTimer = timer

    Do Until blnStop = True
　　　　dblLapse = (timer - dblTimer) + objWbk.Worksheets("Sheet1").Cells(2, 1)
        ' "時間"を求める
        intHour = Int(dblLapse / 3600)

        ' "分"を求める
        intMinute = Int((dblLapse Mod 3600) / 60)

        ' "秒"を求める
        dblSecond = ((dblLapse * 100) Mod 6000) / 100
        objWbk.Worksheets("Sheet1").Cells(2, 3) = intHour & "時間" & intMinute & "分" & dblSecond & "秒"
        DoEvents
    Loop

    objWbk.Worksheets("Sheet1").Cells(2, 1) = dblLapse
    blnStart = False
End Sub
```

詳細を説明します。

>Private blnStop As Boolean
>Private blnStart As Boolean

まずは、ストップとスタートを識別するためのフラグを用意します。

>Dim dblTimer As Double
>Dim objWbk As Workbook                                         
>Set objWbk = ThisWorkbook

次に上記の変数を用意します。
objWbkには、ストップウォッチを動かすエクセルファイルを指定するために用意します。
これが無いと、別のエクセルシートで作業する場合、別のエクセルシートに書き込みされてしまいます。

```
If blnStart = True Then
        blnStop = True
        Exit Sub
End If
```

上記のコードで、ストップウォッチが動いていればストップして、処理を終了するようにしています。

>blnStart = True
>blnStop = False

動いていなければ、スタートフラグをTrueに、ストップフラグをFalseにします。

>dblTimer = timer

上記で、dblTimerに現在の時間（秒）を代入します。

timer関数については、下記のサイトを参照願います。
https://www.tipsfound.com/vba/05timer

```
Do Until blnStop = True
     dblLapse = (timer - dblTimer) + objWbk.Worksheets("Sheet1").Cells(2, 1)
     ' "時間"を求める
     intHour = Int(dblLapse / 3600)

     ' "分"を求める
     intMinute = Int((dblLapse Mod 3600) / 60)

     ' "秒"を求める
     dblSecond = ((dblLapse * 100) Mod 6000) / 100
     objWbk.Worksheets("Sheet1").Cells(2, 3) = intHour & "時間" & intMinute & "分" & dblSecond & "秒"
     DoEvents
Loop
```

上記で、時間を求めています。
Do Untilでは、条件式に一![20210401_134507.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1242278/74b26b7c-ecb6-58af-c87f-a161697ffa86.jpeg)
致していない場合、処理を実行します。
今回は、「blnStop = True」でない場合に時間を求めます。

>dblLapse = (timer - dblTimer) + objWbk.Worksheets("Sheet1").Cells(2, 1)

まずは、dblLapseに現在時間と初期値の時間の差から、経過時間を求めます。
後ろの+以降で、「停止時間の保持」のセルに格納された時間を足すことで、ストップした時の時間からスタートすることが可能です。

>intHour = Int(dblLapse / 3600)
>intMinute = Int((dblLapse Mod 3600) / 60)
>dblSecond = ((dblLapse * 100) Mod 6000) / 100

上記でそれぞれ時間、分、秒を求めて変数に代入します。

>objWbk.Worksheets("Sheet1").Cells(2, 3) = intHour & "時間" & intMinute & "分" & dblSecond & "秒"

結果を「作業時間」のセルに書き出すようにしています。

>objWbk.Worksheets("Sheet1").Cells(2, 1) = dblLapse

ループを抜けた時に、「停止時間の保持」のセルに最終的な秒数を格納します。

>blnStart = False

最後に、スタートフラグをFalseにしてソースコードは完了です。

では、次はボタンを作っていきましょう。

ボタンの位置は、「開発」タブ→「挿入」→「ボタン（フォーム コントロール）」です。

![20210401_134507.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1242278/756d0996-cb38-bfa6-8c7f-095404003d03.jpeg)

ボタンを選択し適当なセルをクリックすることで、作成したマクロの一覧が開くので、先ほど作成したマクロを割り当ててください。

![20210401_134611.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1242278/9fd4918d-37be-4951-03a2-6d3a8ec83ebb.jpeg)

ボタンを設置したら、右クリックからテキストの編集を選び名前を変更してください。

![20210401_140140.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1242278/3b493eda-4cab-66b7-ff64-111f29a40744.jpeg)

ボタンの大きさを変更し、好きな位置に移動すれば、ストップウォッチの完成です。

![20210401_134721.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1242278/1b1ac15b-48e0-74d7-c220-5ed2a6de3c02.jpeg)

あとは、好きなタスク名を書いてお使いください。

以上が、ストップウォッチの作り方でした。