電子書籍の厳選無料作品が豊富!

こんにちわ。
いつも諸先輩方に教えて頂きありがとうございます。
感謝しております。

早速ですが以下のような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

=====================================================

A 回答 (3件)

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)にしました。
他の変更箇所はコメントにて。
これで合ってるかどうかは分かりませんが・・・。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/08/20 00:04

コードの中身はよく見ていないのですが


気になった点を。
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

詳細は省きますが、簡単に言うと高精度で取得するには
もうちょっと込み入ったことを追加しなければなりません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/09/02 13:30

同じコンピューター上で、ほかの処理を同時に行わなければ問題はないと思うけど、


sleepとdoeventsよりontimeを使ったほうが、良いような気もする。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/09/02 13:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!