- ベストアンサー
Excelマクロでデータの平均化を1分値に!
- Windows7 Excel2007を使用しており、1秒ごとのデータを1分値にまとめたいです。データが膨大なため、Excelマクロを使用して平均化した値を表示させる方法を教えてください。
- データはワークシート1にあり、平均化した値はワークシート2に表示したいです。列EXの値に1/10、列FBの値に1/1000を掛けて平均化します。
- ネットで見つけたサンプルコードを改良して使用することも考えています。データの行数に応じて動的にセル範囲を指定できるようにしたいです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
先に一般によく引っかかる説明不足点として,幾つか指摘しておきます。 不明点のその1: >ほぼ 1秒毎のデータ >時間 2011/9/2 9:19 は一つのセルです 時刻列がどこなのか不明ですがまぁそれはたいしたことじゃなくて,「2011/9/2 9:19」は正確な内容は? 「2011/9/2 9:19:00」が並んでいるのか,実は「2011/9/2 9:19:01」「2011/9/2 9:19:02」…と実時刻が記録されているのを,単に表示でそう見えているだけなのか,という事です。 →後者を仮定します 不明点のその2: まぁアタリマエの事ですが,1分間に必ず60点のデータが記録されている「保証はない」(イチイチ毎分のデータ数を数える必要がある)という前提が必要か。 →必ずしも60点とは限らないを仮定します 不明点のその3: 1分値の開始と終了は「9:19:00以上から9:20:00未満まで」を9:19とするのか,「9:19:01から9:20:00」を9:20の値とするのか。 →実は後者を使う場合も多いのですが,今回は前者を仮定します #日付時刻がA列と仮定して sub macro1() dim ws1 as worksheet, ws2 as worksheet dim lastrow as long set ws1 = worksheets("Sheet1") set ws2 = worksheets("Sheet2") lastrow = ws1.cells(cells.rows.count ,"A").end(xlup).row ws2.range("A:F").clearcontents ws2.range("A3:F3") = array("datetime", "data count", "sum(EX)","sum(FB)","avr(EX)","avr(FB)") ’時刻が丸め済みなら下記の計算は不要,転記するだけで十分。 with ws2.range("A4:A" & lastrow) .formula = "=TEXT(Sheet1!A4,""yyyy/mm/dd hh:mm"")*1" .value = .value .numberformatlocal = "hhhh/mm/dd hh:mm" end with ’抽出 ws2.range("A3:A" & lastrow).removeduplicates columns:=1, header:=xlyes lastrow = ws2.cells(cells.rows.count, "A").end(xlup).row ’計算 ws2.range("B4:B" & lastrow).formula = "=COUNTIFS(Sheet1!A:A,"">=""&A4,Sheet1!A:A,""<""&(A4+TIME(0,1,0)))" ws2.range("C4:C" & lastrow).formula = "=SUMIFS(Sheet1!EX:EX,Sheet1!A:A,"">=""&A4,Sheet1!A:A,""<""&(A4+TIME(0,1,0)))/10" ws2.range("D4:D" & lastrow).formula = "=SUMIFS(Sheet1!FB:FB,Sheet1!A:A,"">=""&A4,Sheet1!A:A,""<""&(A4+TIME(0,1,0)))/1000" ws2.range("E4:E" & lastrow).formula = "=C4/B4" ws2.range("F4:F" & lastrow).formula = "=D4/B4" end sub
お礼
ありがとうございました! 100%解決できました。 マクロの凄さを体感しております。 教えて頂いてマクロを少し改造しながら使ってみています。 今 10秒平均に挑戦中です。