残り時間をフォーム上に表示するようにVBAコードを修正します。以下のコードでは、フォームにラベルを追加し、タイマーの残り時間をリアルタイムで表示する仕組みを作ります。

手順

1. Excelを開き、Alt + F11でVBAエディタを開きます。


2. Insert > UserFormを選択し、フォームを作成します。


3. UserFormに以下のコントロールを追加します:

スタートボタン(CommandButton1)

ラベル(Label1): 残り時間を表示するためのもの



4. 以下のコードをフォームとモジュールに追加します。



フォームコード

フォームに配置したスタートボタン(CommandButton1)のクリックイベントを設定し、残り時間を更新する処理を追加します。

Private Sub CommandButton1_Click()
    StartPomodoro
End Sub

モジュールコード

残り時間を表示しながらタイマーを進行させるためのコードを以下に示します。

Option Explicit

Private running As Boolean ' タイマーの実行中を示すフラグ

Sub StartPomodoro()
    Dim startTime As Double
    Dim duration As Double
    Dim breakTime As Double
    Dim pomodoroCount As Integer
    Dim totalPomodoros As Integer
    Dim soundPath As String
    
    ' 設定:25分勉強、5分休憩、4セット
    duration = 25 * 60 ' 25分を秒に変換
    breakTime = 5 * 60 ' 5分を秒に変換
    totalPomodoros = 4 ' ポモドーロのセット数
    soundPath = "C:\Windows\Media\notify.wav" ' 音ファイルのパス
    running = True ' タイマー開始フラグ
    
    ' ポモドーロループ開始
    For pomodoroCount = 1 To totalPomodoros
        ' 勉強タイマー
        UpdateTimer duration, "勉強時間: 残り "
        If Not running Then Exit Sub
        BeepSound soundPath
        MsgBox "25分経過!休憩時間です。"

        ' 休憩タイマー
        UpdateTimer breakTime, "休憩時間: 残り "
        If Not running Then Exit Sub
        BeepSound soundPath
        MsgBox "5分休憩終了!次のポモドーロに移りましょう。"
    Next pomodoroCount

    BeepSound soundPath
    MsgBox "全てのポモドーロセットが完了しました!お疲れ様でした。"
End Sub

' 残り時間を更新するサブプロシージャ
Sub UpdateTimer(ByVal timeInSeconds As Double, ByVal labelPrefix As String)
    Dim startTime As Double
    Dim remainingTime As Double
    Dim minutes As Integer
    Dim seconds As Integer
    
    startTime = Timer
    Do While Timer < startTime + timeInSeconds
        remainingTime = timeInSeconds - (Timer - startTime)
        minutes = Int(remainingTime / 60)
        seconds = Int(remainingTime Mod 60)
        ' ラベルに残り時間を表示
        UserForm1.Label1.Caption = labelPrefix & minutes & "分 " & seconds & "秒"
        DoEvents ' 他の処理を行えるようにする
        If Not running Then Exit Sub
    Loop
End Sub

' WAVファイルを再生するサブプロシージャ
Sub BeepSound(soundPath As String)
    Dim snd As String
    snd = soundPath
    Call sndPlaySound(snd, 1)
End Sub

' WAVファイルを再生するAPI
Declare PtrSafe Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" _
    (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long

説明

1. 残り時間の表示: UpdateTimer サブプロシージャは、残り時間をラベル (Label1) に更新しながらタイマーを進行させます。勉強時間と休憩時間それぞれに残り時間をリアルタイムで表示します。


2. running フラグ: running というフラグを追加し、ユーザーがフォームを閉じたり、処理を中断できるようにしています。これは、途中でタイマーを終了させたい場合に対応します。


3. 音の再生: タイマーが終了したら、音を鳴らすために BeepSound を使用します。



使用方法

1. フォームを実行し、スタートボタンを押すとタイマーが開始します。


2. 残り時間がラベルにリアルタイムで表示されます。