• ベストアンサー

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

  • VBAでの説明がわかりません

    以下のコードは、都道府県ごとに1枚のデータシートを作成する処理なんですが、コードが1行づつどんな作業を意味しているのかがわかりません。1行ごとにどのような処理をしているのかの説明をよろしくお願いします。長文で申し訳ありません。 Sub まとめ() Dim i As Integer 'カウンタ変数iの宣言 Dim n As Integer  Dim MyS1 As Worksheet 'ワークシート型オブジェクトMyS1を宣言 Dim MyC As Worksheet Worksheets.Add before:=Worksheets("全国") ActiveSheet.Name = "data" Set MyS1= Worksheets("data") With Worksheets("全国") MyS1. Range(MyS1.Cells(1,1),MyS1.Cells(11,12))=.Range(Cells(1,1),.Cells(11,12)).Value End With i=12 For Each MyC In Worksheets If MyC.Name<> "data" Then n = 12 MyS1.Cells(i,1)=MyC.Name i=i+1 Do While MyC.Cells(n,2).Value<>"" MyS1.Range(MyS1.Cells(i,1),MyS1.Cells(i,12))=MyC.Range(MyC.Cells(n,1),Mc.Cells(n,12)).Value i=i+1 n=n+1 Loop End If Next Myc End Sub

  • EXCEL VBAの配列でわかりません。

    こんなコードがあるのですが、最後の他のシート(作業中シート)に書き込もうとするとエラーになってしまいます。”Sheets("作業中").”を抜くと同じシートに結果は返ってくるのですが…。コードの内容は、ある範囲のある列から空白ではないセルを探し出してその行のデータを配列で汲み取り、他のシートに一括で洗い出すというものです。 Sub 作業中() Dim myRow As Long Dim Data As Variant Dim WC() As Variant Dim WCE() As Variant myRow = Range("H1").CurrentRegion.Rows.Count Data = Range("H1:M" & myRow).Value For i = 1 To myRow If Data(i, 5) <> "" Then a = a + 1 Else b = b + 1 End If Next ReDim WC(a) ReDim WCE(b) c = 0 d = 0 For i = 1 To myRow If Data(i, 5) <> "" Then WC(c) = Range("H" & i & ":K" & i).Value c = c + 1 Else WCE(d) = Range(Cells(i, 8), Cells(i, 11)).Value d = d + 1 End If Next For i = 0 To a Range(Cells(i + 1, 15), Cells(i + 1, 18)).Value = WC(i) Next For i = 0 To b Range(Cells(i + 1, 19), Cells(i + 1, 22)).Value = WCE(i) Next e = Range(Cells(1, 15), Cells(a, 18)).Value Sheets("作業中").Range(Cells(1, 1), Cells(a, 4)).Value = e End Sub ちなみに同じシートから↓のコードを実行するとうまくいきます。 なぜ~??わからな~い??おしえてくださーい!! Sub test() Dim a As Variant a = Range("H1:K4") Sheets("作業中").Range("N1:Q4") = a End Sub

  • VBA 別シートからコピー貼付け(複数列)

    別シートからコピー貼付け(複数列)をしたいのですが,同一シートからのコピー貼付けはネットから以下のマクロでできました。 しかし,別シートsheet1からsheet2ヘコピーで修正しましたが,「アプリケーション定義またはオブジェクト定義のエラーです。」となります。どなたかご教授よろしくお願いします。 修正したマクロ Sub sampel() Dim i As Long For i = 2 To Range("E65536").End(xlUp).Row Step 2 Sheets("sheet2").Range(Cells(i + 1, 2), Cells(i + 1, 85)).Value = _ Sheets("sheet1").Range(Cells(i, 5), Cells(i, 88)).Value Next i End Sub 参考としたマクロ http://www.excel.studio-kazu.jp/kw/20041208152106.html Sub sampel() Dim i As Long For i = 2 To Range("E65536").End(xlUp).Row Step 2 Range(Cells(i + 1, 2), Cells(i + 1, 85)).Value = _ Range(Cells(i, 5), Cells(i, 88)).Value Next i End Sub

  • 全くの初心者ですVBA

    どこが悪いかわかりません。 教えてください。 Sub テスト() Dim kekka As String Dim i As Integer tokuten = Worksheets("Sheet1").Cells(i, 1).Value For i = 1 To Worksheets("Sheet1").Range("A1").End(xlDown).Row.Count If tokuten >= 80 Then kekka = "合格" Else kekka = "不合格" kekka = Cells(i, 2) End If Next i End Sub シート1の A列に数値で得点が入っています。

  • 【Excel VBA】データ貼り付けの開始位置について

    Excel2003を使用しています。 先日、こちらでアドバイスをいただきながら、下記のようなマクロを作りました。内容はあるセルの値と同じ名前のシートへデータをコピーするというものです。 Sheet1に貼り付け元のデータが表形式であり、必要なデータのみ該当のシートへコピーします。マクロ実行後は、別の新しいデータをSheet1へコピペして、またマクロを実行するのですが、その際、データの貼り付け開始位置を前回マクロを実行して貼り付けられたデータから2行空けたいのですが、可能でしょうか? ________________________________________________________________________________________________________________________________ Sub test3() Dim n As Long Dim i As Long Dim j As Long  Worksheets("Sheet1").Activate   For n = 4 To Cells(Rows.Count, 2).End(xlUp).Row    If Cells(n, 3).Value <> "" Then     With Worksheets(CStr(Cells(n, 3).Value))       i = .Cells(Rows.Count, 3).End(xlUp).Row + 1       Cells(n, 2).Copy .Cells(i, 2)       Cells(n, 7).Resize(, 2).Copy .Cells(i, 4)       Cells(n, 11).Copy .Cells(i, 3)     End With    End If    If Cells(n, 13).Value <> "" Then     With Worksheets(CStr(Cells(n, 13).Value))       j = .Cells(Rows.Count, 3).End(xlUp).Row + 1       Cells(n, 12).Copy .Cells(j, 2)       Cells(n, 17).Copy .Cells(j, 4)       Cells(n, 18).Copy .Cells(j, 6)       Cells(n, 11).Copy .Cells(j, 3)     End With    End If   Next n End Sub

  • Excel VBAデータ登録のスピードアップしたい

    下記のようなコードがあります。 ■input データ閲覧・登録・編集シート ■data データを格納するシート inputシートとdataシートでdataの受け渡しを行っているのですが、データレコードを切り替えるだけで20秒ちょっとかかるため、作業効率が悪いです。 この時間を1~2秒ぐらいまで減らすには、どのように修正すれば、いいでしょうか?どうかアドバイスをお願いいたします。 Private Sub datatouroku() ’データを登録する Dim touroku As Integer Dim fRange As Range Set fRange = Sheets("data").Columns(1).Find(What:=Range("BC1").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) touroku = fRange.Row '検索されたNoの行位置を求める Sheets("data").Cells(touroku, 1).Value = Range("BC1:BE1").Value Sheets("data").Cells(touroku, 2).Value = Range("AX1").Value Sheets("data").Cells(touroku, 3).Value = Range("I4").Value   '・・・上記のデータが全部で256件あります。 End Sub ------------------------------------------ Private Sub hyouji() 'データを表示させる Dim fRange As Range Dim kensaku As Long Set fRange = Sheets("data").Columns(1).Find(What:=Range("BC1").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows)    If (fRange Is Nothing) Then '見つからなかった?    MsgBox "入力された顧客コードが存在しません。", vbExclamation    Exit Sub    End If    kensaku = fRange.Row '検索された顧客DCの行位置を求める     Range("BC1:BE1").Value = Sheets("data").Cells(kensaku, 1).Value     Range("AX1").Value = Sheets("data").Cells(kensaku, 2).Value    Range("I4").Value = Sheets("data").Cells(kensaku, 3).Value     '・・・上記のデータが全部で256件あります。 Set trg = Sheets("data").Cells(kensaku, 1) End Sub

  • エクセルVBAでTransposeの不思議

    MS Officeのエクセル2000です。 下記Sub test01はRange("A1:I1")に文字列を入力し、一旦配列に取り込んでからワークシートに貼り付けるものです。 試験用のコードですので意味はありません。 このコードで255文字まではまったく問題はありません。 ところが、256文字以上の場合、横に貼り付けは問題ないのですが、 Transposeで縦に変換すると型が一致しません。(Error 13)となります。 どうしてでしょうか? 試行錯誤の結果、Sub test02のように一旦横に貼ったデータをコピーしてTransposeして貼り付けるのは大丈夫のようですので不思議でしょがありません。 またこの方法は列数256より要素が多い配列には使えないので解決策にはなりません。 ご教示くださいませ。 Sub test01() Dim myAr As Variant Dim i As Integer, n As Integer n = 256 '文字数 With ActiveSheet .UsedRange.ClearContents For i = 1 To 9 .Cells(1, i).Value = Application.Rept(Left(.Cells(1, i).Address(0, 0), 1), n) Next myAr = .Range("A1:I1").Value .Range("A3").Resize(, UBound(myAr, 2)).Value = myAr .Range("A5").Resize(UBound(myAr, 2)).Value = Application.Transpose(myAr) '256文字の場合エラー End With End Sub Sub test02() Dim myAr As Variant Dim i As Integer, n As Integer n = 256 '文字数 With ActiveSheet .UsedRange.ClearContents For i = 1 To 9 .Cells(1, i).Value = Application.Rept(Left(.Cells(1, i).Address(0, 0), 1), n) Next myAr = .Range("A1:I1").Value .Range("A3").Resize(, UBound(myAr, 2)).Value = myAr .Range("A3").Resize(, UBound(myAr, 2)).Copy .Range("A5").PasteSpecial Paste:=xlValues, Transpose:=True '256文字の場合もOK Application.CutCopyMode = False End With End Sub

  • エクセル2019 VBAについて

    エクセル2019でVBAを使いコピーペーストの勉強中です、次の箇所(Dim i As integr)で、ユーザー定義型は定義されていませんと指摘されて止まってしまします、Sheet("データ")には3行のデータは入っています、VBA初心者のため、この後が、なかなか前に進めません、どうかよろしくおねがいします。 ********************************** Sub 練習() Dim s1 As Worksheet: Set s1 = Worksheets("請求書") Dim s2 As Worksheet: Set s2 = Worksheets("データ") Dim r1 As Integer: r1 = 18 Dim r2 As Integer: r2 = 2 { Dim i As integr } For i = 0 To 2 s1.Range(s1.Cells(r1 + i, 1), s1.Cells(r1 + i, 3)).Value = s2.Range(s2.Cells(r2 + i, 2), s2.Cells(r2 + i, 4)).Value s1.Cells(r1 + i, 4).Value = s1.sells(r1 + i, 2).Value * s1.Cells(r1 + i, 3).Value Next End Sub ***************************************

  • エクセル VBA もっときれいな書き方?

    Sub test() Dim i As Integer, n As Integer n = 1 For i = 2 To 150 If Cells(i, 1) <> Cells(i - 1, 1) Then Cells(i - 1, 5) = i - n Cells(i - 1, 6) = Application.WorksheetFunction.Sum(Range("B" & n & ":" & "B" & i - 1)) n = i End If Next i End Sub 上記のマクロですが Application.WorksheetFunction.Sum(Range("B" & n & ":" & "B" & i - 1)) この部分、もっとスマートに書く方法を教えてください。 Range("B" & n & ":" & "B" & i - 1)って、ちゃんと動きますが、書き方が何か変なような気がするんです。 よくわかってもいないのにすみません。

  • Excel VBAについて

    早速ですがExcelVBAについて質問です。 年齢がN列にあるとき、M列に年代を入れたいと思います。(例:19才なら10代、30才なら30代) 以下のように作成しましたが、すべてに20と入ったり正常に動作しないときがあります。 Excelは2003で作成していますが、いずれ2007でも使いたいです。 もっと正確に実行できるコードを教えてください。 ワークシート関数での解決は望んでいません。データ数も多く他の作業もマクロで処理するのでマクロを希望しています。よろしくお願いします。 -------------------------- Sub ByAge() Range("N1").Value = "年代別" Dim i As Long, N As Integer For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 13).Value >= 60 And Cells(i, 13).Value < 70 Then Cells(i, 14).Value = 60 ElseIf Cells(i, 13).Value >= 50 And Cells(i, 13).Value < 60 Then Cells(i, 14).Value = 50 ElseIf Cells(i, 13).Value >= 50 And Cells(i, 13).Value < 60 Then Cells(i, 14).Value = 40 ElseIf Cells(i, 13).Value >= 30 And Cells(i, 13).Value < 40 Then Cells(i, 14).Value = 30 ElseIf Cells(i, 13).Value >= 20 And Cells(i, 13).Value < 30 Then Cells(i, 14).Value = 20 End If Next i MsgBox "完了!" End Sub --------------------------

専門家に質問してみよう