ExcelVBA練習　タイマーを作る

# はじめに
Excel VBAの練習としてタイマーを作るというのが流行っているみたいなので作ってみました。

## 動作確認環境
デスクトップアプリ版 Office 365 Enterprise Excel
（おそらく大体のバージョンで動作します）

# 目標のもの
最終的な目標の設定はとても重要です。
## 動作例
### ①　SETのセルに時間をセット
今回は分、秒、デシ秒(10分の1秒)まで設定できるようにしましょう。
![動作例図1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559085/fa6cd8a7-78ae-3c9e-e616-f30b84adba1f.png)

### ②　「開始」ボタンをクリック
ボタンをクリックすることでマクロを実行します。
![動作例図2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559085/6a7e4b52-2239-de2a-f561-112544f5c529.png)

### ③　NOWに現在の残り時間が表示されながら減少
この間，Excelでの操作はできないですが，今回はこれで妥協します。
![動作例図3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559085/79bbd158-97db-7789-844f-e1a6e4a6c284.png)

### ④　残り時間が 0分00.0秒になったら「時間です」とメッセージを表示
シンプルながらタイマーとしての役割は果たしています。
![動作例図4](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559085/a69b6e76-588e-a9d7-e6fa-ba8da536333c.png)

# ソースコード
これがソースコードの全文です。(ボタンへの追加などは後で)
```VB:Timerモジュール
'===================================='
'　タイマー　　　　　　　　　　　　　'
'　MysoShake 　　　　　　　　　　　　'
'===================================='

'変数選言の強制
Option Explicit

'ミリ秒単位で待機させる関数を使えるようにする
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

'ボタンクリック時に呼び出す
Sub OnButtonClick()
    
    'ループ用フラグ
    Dim run_flag As Boolean
    
    '今の残り時間
    Dim t_min As Long
    Dim t_sec As Long
    Dim t_dsec As Long
    
    'B2,C2,D2セルからそれぞれ分,秒,デシ秒を取得(minute,second,decisecond)
    t_min = Cells(2, 2).Value
    t_sec = Cells(2, 3).Value
    t_dsec = Cells(2, 4).Value
    
    'とりあえずはじめはループする
    run_flag = True
    
    Do Until run_flag = False
        
        '1回分(1ds = 100ms)残り時間を減らす
        t_dsec = t_dsec - 1
        
        '繰り下がり計算 [1秒-1デシ秒 = 9デシ秒]
        If t_dsec = -1 Then
            
            t_sec = t_sec - 1
            t_dsec = 9
            
            '繰り下がり計算2 [1分-1秒 = 59秒]
            If t_sec = -1 Then
                
                t_min = t_min - 1
                t_sec = 59
                
            End If
            
        End If
        
        'タイマーが0分0.0秒になったら終了
        If t_min = 0 And t_sec = 0 And t_dsec = 0 Then
            
            run_flag = False
            
        End If
        
        '今の残り時間をB4,C4,D4セルに表示
        Cells(4, 2).Value = t_min
        Cells(4, 3).Value = t_sec
        Cells(4, 4).Value = t_dsec
        
        '100ms待つ
        Call Sleep(100)
        
    Loop
    
    'お知らせ
    Call MsgBox("時間です")
    
End Sub
```

これを新しいモジュールTimer(好きな名前)に入れて保存しましょう。
![VBEでモジュール作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559085/21c84105-84e7-3929-1b9e-751157b22f8c.png)

# ボタンの追加と見た目の設定
あとは体裁を整えてボタンを配置するのみです。

### ①　体裁を整える
時間入力の枠を適当に作成します。(B2,C2,D2セルが初期設定，B4,C4,D4が処理中の値で，今回は変更できません)
![SETやNOWの枠を作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559085/248e6a86-2f03-6e18-76e4-3275d47fe175.png)


### ②-1　ボタンの配置
ボタンをメニューから選んで配置します。
![ボタンを配置するためのメニュー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559085/94168a87-c929-ae6c-b654-8176e35f78f3.png)

::: note info
[開発タブ] → [挿入] → [ボタン] (左上の何もない箱っぽいアイコン)がボタンです。
そのあとでシート上でドラッグ&ドロップするとボタンが作られます。
:::

### ②-2　マクロの登録
事前に作ったマクロを選んでOKを押しましょう。
![マクロ登録画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559085/1e8a151f-a999-ee92-12a4-7a5a6fc9ef1e.png)

::: note info
ボタンは右クリックすると編集モードになるので移動や表示ラベルの変更もできます。
また[Alt]キーを押しながら操作するとボタンをセルに合わせて配置できます。
![ボタンの配置](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559085/9150e40d-66d8-4a7f-8940-77bcf516824b.png)

:::

# おわりに
お読みくださりありがとうございました。
何かお気づきの点がありましたらお教えいただければ幸いです。

追伸
サクッと作ろうとしたのに、説明のスクショをとりながらの作業で少し長くなりました(所要時間 40分)

:::note info
ループがあって短いソースでも書けるので，適度に勉強になりそうないい題材だと思いました。
:::