今日もうだるような暑さでした。事務所の温度計が38℃を超えました。仕事したくないです。
でも仕事なので頑張って仕事しました。
うーん、とんちゃん食べてビールが飲みたいと思い肉屋に買いに行きました。
炙りやⅡでじっくり焼いて、ビールを飲みながら食べました
こんがり焼けて美味かったです。
さて先日テレビを観ていたら生成AIでプログラミングが簡単にできると放送していました。
以前プログラミングしていて途中で頓挫したことを思い出しました。
ChatGPTを使うと実現できるかもと思ったしだいです。
何をしたかったかというと、以前奈良マラソンを走った時に30km過ぎだったかでよくゴール地点で見かける7セグモニターでゴール予想時間を表示させている方がみえました。
マラソンの応援とかで表示させるといいかなと思い、簡単なプログラミングソフトをパソコンにインストールしてちょこちょこやっていました。
表示する部分から作るのも難しく途中であきらめてしまいました。
ふとマイクロソフトのVBAと言われるマクロを使うとできるのではないかと思いました。
そこで、ChatGPTでこんな文章を入力してみました。
「パワーポイントのマクロ機能を使ってフルマラソンの予想ゴール時間を表示するソフトを作りたいです。具体的にはスタート時間、現在の距離を入力することにより現在の平均ペースがわかり、そのペースを維持した場合の予想ゴール時間が表示され、時間経過とともにその時間は変化していくというものです。どのようにマクロのプログラムを作るか教えてください。」
するとサーっとVBAのコードと設定方法を作ってくれました。
それから何度も質問を変えながら自分が作りたいように編集してもらいました。
一応こんなんができました。
パワーポイントのスライドショーを起動させます。
「スタート時間」をクリックするとスタート時間を聞いてくるのでマラソンの号砲の時間を入力します。
「現在位置」というのは応援している場所の距離になります。
例えばゴール近くの30km地点が一番きつい場所なので30km地点なら「現在位置」をクリックして「30」と入力します。
そして「計測開始」をクリックします。
すると上のような予想ネットタイムと予想ゴール時間、平均ペースを表示してくれます。
30km地点で3時間くらいで通過するとサブ4が微妙なところです。そこで奮起して頑張ってくれればいいですがね。
これはあくまで現在のトータルの平均ペースで換算しているので、前半飛ばし後半失速していると必ずしもこのタイムではいかないと思います。
私はガーミンを使っていて現在のペースで走るとどのタイムでゴールできるかというアプリを入れています。
これだととても現実味のあるタイムになってくるんでしょうけどね。
マラソンの応援に行く時に使ってみてもいいかなと思いました。
そのChatGPTで最後にまとめてもらいましたのでそれを記載しておきますのでよかったら作ってみてください。
1.全体の仕組み
このマクロは「マラソンの進行状況」を PowerPoint のスライド上でリアルタイム表示する仕組みです。
SetStartTime
マラソンのスタート時刻を今日の日付+指定時刻で設定する。
SetDistance
現在の通過距離(km)を一度だけ入力する。
UpdatePrediction
経過時間・ペースを計算し、
NetTime(ネットタイム) … スタートからゴールまでの推定合計時間
GoalTime(ゴールタイム) … 実際にゴールする時計上の時刻
AveragePace(平均ペース) … 分:秒/km のペース
をそれぞれスライド上に出力する。
StartAutoUpdate / StopAutoUpdate
Windows の SetTimer API を利用して、1秒ごとに自動的に UpdatePrediction を呼び出す仕組み。
これによりスライドを開いたままでも数値が更新され続ける。
2.マクロの基本コード例(VBA)
Option Explicit
‘ ===== 設定 =====
Const MarathonDistance As Double = 42.195
Const Interval As Long = 1000 ‘ 1秒ごと更新
‘ ===== 変数 =====
Dim StartTime As Date
Dim TotalDistance As Double
Dim TimerID As LongPtr ‘ 64bit対応
‘— API宣言(64bit Office)—
#If VBA7 Then
Private Declare PtrSafe Function SetTimer Lib “user32” ( _
ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr, _
ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr
Private Declare PtrSafe Function KillTimer Lib “user32” ( _
ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr) As Long
#Else
‘ 32bit Office 用
#End If
‘— スタート時間設定 —
Sub SetStartTime()
Dim s As String, t As Date
s = InputBox(“スタート時間を HH:MM 形式で入力してください”)
If IsDate(s) Then
t = CDate(s)
StartTime = Date + TimeValue(t)
MsgBox “スタート時間: ” & Format(StartTime, “hh:nn:ss”)
End If
End Sub
‘— 距離設定 —
Sub SetDistance()
Dim d As String
d = InputBox(“現在の距離 (km) を入力してください”)
If IsNumeric(d) Then TotalDistance = CDbl(d)
End Sub
‘— 表示更新 —
Sub UpdatePrediction()
If StartTime = 0 Or TotalDistance <= 0 Then Exit Sub
Dim nowTime As Date, elapsedSec As Double
Dim paceMinPerKm As Double, remainMin As Double
Dim remainingKm As Double, finishTime As Date
Dim netHour As Long, netMinute As Long, netSecond As Long
Dim paceMin As Long, paceSec As Long
nowTime = Now
elapsedSec = (nowTime – StartTime) * 24 * 60 * 60
paceMinPerKm = (elapsedSec / 60) / TotalDistance
remainingKm = MarathonDistance – TotalDistance
remainMin = paceMinPerKm * remainingKm
finishTime = nowTime + remainMin / (24 * 60)
‘ — ネットタイム計算 —
Dim netMin As Double: netMin = (elapsedSec / 60) + remainMin
netHour = Int(netMin \ 60)
netMinute = Int(netMin Mod 60)
netSecond = Int((netMin – Int(netMin)) * 60)
‘ — ペース(分:秒/km)—
paceMin = Int(paceMinPerKm)
paceSec = Int((paceMinPerKm – paceMin) * 60)
‘ — スライドに出力 —
With ActivePresentation.Slides(1)
.Shapes(“NetTime”).TextFrame.TextRange.Text = netHour & “時間” & netMinute & “分” & netSecond & “秒”
.Shapes(“GoalTime”).TextFrame.TextRange.Text = Format(finishTime, “hh時nn分ss秒”)
.Shapes(“AveragePace”).TextFrame.TextRange.Text = paceMin & “分” & Format(paceSec, “00”) & “秒/km”
End With
End Sub
‘— 自動更新 —
Sub StartAutoUpdate()
If TimerID <> 0 Then StopAutoUpdate
TimerID = SetTimer(0, 0, Interval, AddressOf UpdatePredictionTimer)
End Sub
Sub StopAutoUpdate()
If TimerID <> 0 Then KillTimer 0, TimerID: TimerID = 0
End Sub
‘— タイマーコールバック —
#If VBA7 Then
Public Sub UpdatePredictionTimer(ByVal hwnd As LongPtr, ByVal uMsg As Long, ByVal idEvent As LongPtr, ByVal dwTime As Long)
#Else
Public Sub UpdatePredictionTimer(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)
#End If
On Error Resume Next
UpdatePrediction
End Sub
3.スライドの準備
PowerPoint を開く → [開発] タブ → Visual Basic を開く
(開発タブが無ければオプションからリボンに追加)
標準モジュールを挿入し、上記のコードをコピー。
スライド1にテキストボックスを3つ作成
名前を NetTime
名前を GoalTime
名前を AveragePace
に設定する。
(右クリック → [図形の書式設定] → [代替テキスト] → 名前変更 でも可能)
マクロを順に実行:
SetStartTime → スタート時刻を入力
SetDistance → 現在の距離を入力
StartAutoUpdate → 数値が1秒ごとに更新される
停止したいときは StopAutoUpdate を実行。



コメント