ESP32の気温記録データから平均気温と最低・最高気温を出力するエクセルマクロ
毎日24時間、1時間毎にESP32で気温を外で計測させているのですが、平均気温と最低・最高気温の表示できないかと思い出し、マクロを作ってみました。
遊びで計測していたのですが、積算温度という概念がありスイカとかトマトなんかはこれを利用して食べ頃具合がわかるっていう記述を見つけたんですよね。
日の平均気温の積算で、スイカは開花から800〜1,100℃、トマトは開花から1,000〜1,200℃が目安だっていうので、この気温データを利用しない手は無いと思って作ってみようと考えたわけなんです。
それで、私のデータはこんな感じでグーグルドライブに自動で記録しているんですが、これをエクセルにコピーしてマクロを付けました。
日付のデータを読み取って、平均気温を計算し、最低気温と最高気温を見つけて出力してくれます。
自分で考えようかと始めたんですが、挫折。(笑)
AIにお願いしたら、あっさり作ってくれました。
便利な世の中ですね。



エクセルマクロはこちら。
Sub 日別平均最低最高気温を作成()
Dim src As Worksheet
Dim dst As Worksheet
Dim lastRow As Long
Dim i As Long
Dim dict As Object
Dim key As Variant
Dim parts As Variant
Dim dateStr As String
Dim temp As Double
Dim dataArr As Variant
Dim weekNames As Variant
weekNames = Array("日", "月", "火", "水", "木", "金", "土")
Dim y As Integer, m As Integer, d As Integer
Dim dt As Date
Dim w As Integer
Set src = ThisWorkbook.Sheets("DATA") ' ←元データのシート名に変更
Set dst = ThisWorkbook.Sheets("平均気温")
lastRow = src.Cells(src.Rows.Count, "A").End(xlUp).Row
Set dict = CreateObject("Scripting.Dictionary")
'--- 集計(合計・件数・最低・最高) ---
For i = 2 To lastRow
parts = Split(src.Cells(i, "A").Value, "_")
dateStr = parts(0)
temp = CDbl(src.Cells(i, "B").Value)
If Not dict.Exists(dateStr) Then
' (合計, 件数, 最低, 最高)
dict.Add dateStr, Array(CDbl(0), CLng(0), temp, temp)
End If
dataArr = dict(dateStr)
' 合計
dataArr(0) = CDbl(dataArr(0)) + temp
' 件数
dataArr(1) = CLng(dataArr(1)) + 1
' 最低
If temp < dataArr(2) Then dataArr(2) = temp
' 最高
If temp > dataArr(3) Then dataArr(3) = temp
dict(dateStr) = dataArr
Next i
'--- 出力 ---
dst.Cells.ClearContents
dst.Range("A1").Value = "日付"
dst.Range("B1").Value = "平均気温"
dst.Range("C1").Value = "最低気温"
dst.Range("D1").Value = "最高気温"
i = 2
For Each key In dict.Keys
' "26.04.12" → Date 型へ
y = CInt("20" & Left(key, 2))
m = CInt(Mid(key, 4, 2))
d = CInt(Right(key, 2))
dt = DateSerial(y, m, d)
w = Weekday(dt, vbSunday) - 1
dst.Cells(i, "A").Value = key & " (" & weekNames(w) & ")"
dst.Cells(i, "B").Value = dict(key)(0) / dict(key)(1) ' 平均
dst.Cells(i, "C").Value = dict(key)(2) ' 最低
dst.Cells(i, "D").Value = dict(key)(3) ' 最高
i = i + 1
Next key
MsgBox "平均・最低・最高気温を更新しました。"
End Sub
