• ベストアンサー

VBA 5分間間隔でデータ記録

こんにちわ。 いつも諸先輩方に教えて頂きありがとうございます。 感謝しております。 早速ですが以下のようなVBを教えてもらいまして、 C3のセルにリアルタイムで変化する数字があります。 それを、3秒おきに時間とともにC6から順に記録して 1分間溜まったら、 E6に時間、 F6その1分間の最初の値、 G6にその1分間での最高値 H6にその1分間での最低値 I6にその1分間での最後の値 が順番に記録されるようになっております。    このマクロを改正して、  (1)1秒感覚でC3から下へ順に記録。  (2)5分間隔でE6^I6に4種の値を下へ順に記録   (このデータはずっと起動している間は下へ記録し続けたいです)   というように変更したいのですがうまくいかず、四苦八苦しておりました。 お忙しいところ申し訳ありませんが、 ヒントなるものでも結構ですので教えて頂ければ幸いです。 以上宜しくお願いいたします。       UNO     ========================================================= Option Explicit Public STOP_B As Boolean Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Sub ストップ() STOP_B = False End Sub Sub スタート() Dim i As Integer Dim t As Integer Dim n As Integer Dim R As Range Dim timenow As Variant i = 6 n = 6 STOP_B = True Do While True t = 0 timenow = Format(Now(), "HH:mm") While t < 300 Call Sleep(10) DoEvents t = t + 1 Wend If timenow = Format(Now(), "HH:mm") Then Sheet1.Cells(i, 3).Value = Sheet1.Range("C3").Value i = i + 1 Else Sheet1.Cells(n, 5).Value = timenow Sheet1.Cells(n, 6).Value = Sheet1.Cells(6, 3).Value Set R = Sheet1.Range(Sheet1.Cells(6, 3), Sheet1.Cells(i, 3)) Sheet1.Cells(n, 7).Value = WorksheetFunction.Max(R) Sheet1.Cells(n, 8).Value = WorksheetFunction.Min(R) Sheet1.Cells(n, 9).Value = Sheet1.Cells(i - 1, 3).Value Sheet1.Range(Sheet1.Cells(6, 3), Sheet1.Cells(i, 3)).Clear i = 6 Sheet1.Cells(i, 3).Value = Sheet1.Range("C3").Value i = i + 1 n = n + 1 End If If STOP_B = False Then Exit Sub End If Loop End Sub Function xSleep(ByVal dwMilliseconds As Long) Call Sleep(dwMilliseconds) End Function =====================================================

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

Sub スタート() Dim i As Integer Dim t As Integer Dim n As Integer Dim R As Range 'Dim timenow As Variant Dim timenow As Date i = 6 n = 6 STOP_B = True ' 5分後の時刻を算出 timenow = DateAdd("n", 5, Now()) Do While True t = 0 'timenow = Format(Now(), "HH:mm") ' 1秒間ウェイト While t < 10 Call Sleep(100) DoEvents t = t + 1 Wend 'If timenow = Format(Now(), "HH:mm") Then ' 5分後の時刻に達していない場合 If DateDiff("s", timenow, Now) < 0 Then Sheet1.Cells(i, 3).Value = Sheet1.Range("C3").Value i = i + 1 Else Sheet1.Cells(n, 5).Value = timenow Sheet1.Cells(n, 6).Value = Sheet1.Cells(6, 3).Value Set R = Sheet1.Range(Sheet1.Cells(6, 3), Sheet1.Cells(i, 3)) Sheet1.Cells(n, 7).Value = WorksheetFunction.Max(R) Sheet1.Cells(n, 8).Value = WorksheetFunction.Min(R) Sheet1.Cells(n, 9).Value = Sheet1.Cells(i - 1, 3).Value Sheet1.Range(Sheet1.Cells(6, 3), Sheet1.Cells(i, 3)).Clear i = 6 Sheet1.Cells(i, 3).Value = Sheet1.Range("C3").Value i = i + 1 n = n + 1 ' 5分後の時刻を算出 timenow = DateAdd("n", 5, Now()) End If If STOP_B = False Then Exit Sub End If Loop End Sub ウェイトはSleep(10)だと精度が甘いので、Sleep(100)にしました。 他の変更箇所はコメントにて。 これで合ってるかどうかは分かりませんが・・・。

uno577
質問者

お礼

Wizard_Zeroさま  早速のご回答ありがとうございます!  1秒、5分おきに記録できるようになりました^^    しかし、Eの列に日付と時間が記録されるようになっているのですが  1時間ほど起動させておくと止まってしまうようです・・・  大変申し訳ありませんが  起動させている間は永遠に記録できるようにすることは  可能なのでしょうか??  

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • DreamyCat
  • ベストアンサー率56% (295/524)
回答No.3

コードの中身はよく見ていないのですが 気になった点を。 While t < 300 Call Sleep(10) DoEvents t = t + 1 Wend  上の例だとおよそ4.8秒になると思います。 下記の例ではおよそ3秒になると思います。  (約16ミリ秒の倍数でしか取得できないため。) While t < 30 Call Sleep(90) '80-95くらい DoEvents t = t + 1 Wend 詳細は省きますが、簡単に言うと高精度で取得するには もうちょっと込み入ったことを追加しなければなりません。

uno577
質問者

お礼

Dream cat さま     返答が遅くなり申し訳ありません。  確かに若干秒数にずれがありました。   もっと勉強して改善していきたいと思います。  ありがとうございました。

すると、全ての回答が全文表示されます。
  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.2

同じコンピューター上で、ほかの処理を同時に行わなければ問題はないと思うけど、 sleepとdoeventsよりontimeを使ったほうが、良いような気もする。

uno577
質問者

お礼

ShowMeHowさま    返答が遅くなり申し訳ありません。。  色々調べているとontimeがいいようですね。  ありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A