見出し画像

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


いいなと思ったら応援しよう!