VBAのマクロを時計単位で起動させる方法

このQ&Aのポイント
  • VBAを使用して時計単位でマクロを起動する方法を教えてください。
  • マクロが常時計算を続けてしまいエラーが発生してしまう問題があります。
  • 31行に到達した場合、1行目を削除してマクロが正常に動作するようにしたいです。
回答を見る
  • ベストアンサー

VBAの答えを求めています

素人です。誰か教えてください。 下記マクロのend ifより下の部分で時計単位で30分と00分に起動させるように したいのですが起動させるとマクロが常時計算を続けてしまいパンクしてしまします。 sub Macro1()  range("E65536").end(xlup).offset(1).resize(1, 4).value = range("A1:D1").value  if range("E65536").end(xlup).row > 30 then ’31行に到達してから1行目を削除する   range("E1:H1").delete shift:=xlshiftup  end if  application.ontime application.floor(now, timeserial(0, 30, 0)) + timeserial(0, 30, 0), end sub どうしたら解消できるでしょうか!?

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

恐らく「あなたの実際のマクロ」で、あなたがご自分で手を入れた部分が間違っているのが原因と推測されます。(あなたのブックにその他に何を仕込んでいるか不明なので、そちらが原因の可能性も十分あります) ちなみにあなたの修正では30分ごとに切り下げた時刻+1分後を繰り返し予約してる(毎回1分または31分を予約している)だけで、「1分おきに起動」できていません。 それと、「1分ごとに記録が繰り上がっていく」(=常に最新の30分のデータを並べておく)のが「ヤリタイ事」であるなら、マクロを「30分ごと」にする意味は全くありません。 その場合、マクロは Application.OnTime Application.Floor(Now, TimeSerial(0, 1, 0)) + TimeSerial(0, 1, 0), "Macro1" と、素直に1分毎に起動するよう仕込むだけです。 30分ごとにこだわる必要があるのは、30分ごとに記録を一回全部クリアして、また最初から30分、31分、32分…(0分、1分、2分…)の記録を付け直す運用を狙う場合だけです。 その場合、D5セルの数式のみ変更する必要があります。 #補足 ブックの修正: A5セルには =INDIRECT("F2") B5セルには =MAX(INDIRECT("F2:F30")) C5セルには =MIN(INDIRECT("F2:F30")) D5セルには =INDIRECT("F30") とそれぞれ記入する 今のあなたのマクロでA5からD5に細工している部分はすべて消去する

perrault
質問者

補足

いったん全てを削除して一から打ち直したら前述のような事態はなくなりました。 仰ったとおり自分に誤りがあったようです。お騒がせしました。 まずは色々手を貸して頂いて有難うございます。 私の説明が拙てうまく伝えれませんでした。 私のやりたいことは2つあります。macro1,macro2として最初に頂いたのはmacro2 です。macro1はそれを改良して作ろうとしてつまづいています。 それが今回の質問のマクロです。 作りたいのは直近の30分足の4本値です。 例えば今が9時32分だとすると9時1分から9時半までの値、 具体的には9時1分の値(始値)と9時半丁度の値(終値)、その間の最高値(高値)と最安値(安値) の4つです。本来の意味から外れるので出来るだけ細かく1分単位で取得したいのです。 次に必要なのは9時半から10時なので、最新30分の数字を更新し続けるのでは用途を満たしません。 9時30分過ぎたら9時31分の値から取得を始めるのでそれまでのデータを全て削除 しようとしています。(もっといい方法があるのかもしれませんが) このmacro1で得た数字が9時31分になって更新される前にmacro2で取得し蓄積して 時系列を作るのが最終目的です。 頂いたものでこれから作ります、うまく伝えることが出来た上で お力添え頂けるものがあれがどうかよろしくお願いします。

その他の回答 (3)

  • chie65535
  • ベストアンサー率43% (8520/19368)
回答No.4

>マクロが常時計算を続けてしまいパンクしてしまします。 どこかに「ブレークポイント」を設定し、途中で止めて、止まった位置から「ステップ実行」してみましょう。 どこかで必ず「Macro1の実行中、Macro1から抜ける前に、Macro1が呼ばれる」って状況が発生する筈です。 これが続くと「戻り先をどんどん記憶し続ける」ので、スタックオーバーフローでパンクします。 一番怪しいのが、WorksheetのChengeのプロシージャです。 このプロシージャの中でセルの値を書き換えたりすると、プロシージャから抜ける前に自分自身が呼ばれて、が延々と繰り返されて、スタックオーバーフローでパンクします。

perrault
質問者

お礼

まさしくそれが原因だったと思います。 一旦全て削除して新しく打ち直したらうまく起動しました! 有難うございます助かりました!

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

パンクするとはどういう意味ですか。そのマクロは「常時計算し続けたり」などしていません。 そのマクロで何に困っているのでしょうか。 そのマクロが動き続けている間あなたのエクセルが何をしているのは別に聞きませんけど、そのマクロはA1:D1の(例えばリアルタイム株価の)値を30分ごと単純にE:H列に記録し続けるだけです。 あなた的には今「困っている」ナイショな状況を、そもそも一体「どうしたい・どうなって欲しい」のですか。 例: エクセルを単純に終了しておけば、自動起動マクロが予約されていてももう無かったことになります 例: 例えばA2セルに「STOP」とあったら、次の自動起動マクロを予約しない 例: 例えば「今現在」の時刻が15時以降は、もう自動起動マクロを予約しない sub macro1()  range("E65536").end(xlup).offset(1).resize(1, 4).value = range("A1:D1").value  if range("E65536").end(xlup).row > 30 then range("E1:H1").delete shift:=xlshiftup  if int(now) < timeserial(15, 0, 0) then application.ontime application.floor(now, timeserial(0,30,0)) + timeserial(0, 30, 0), "Macro1" end sub #そろそろ「教わったマクロをコピー貼り付けて」情報提供のつもりじゃなく、「あなたがあなたのエクセルで実際に動かしているマクロ」をあなたのエクセルからコピーして、「いま実際にはこうしています」とご相談で事実を情報提供するようにしてください。

perrault
質問者

補足

特に内緒ではありませんでした、ややこしくなると思ったことが誤解を生んでしまって申し訳ないです。 作っているのはまずこれです。 Sub Macro1() Range("E65536").End(xlUp).Offset(1).Resize(1, 4).Value = Range("A2:D2").Value Range("A5").Value = Range("F2").Value '始値 Range("D5").Value = Range("F30").Value '終値 Range("B5").Formula = "=MAX(F2:F30)" Range("C5").Formula = "=MIN(F2:F30)" If Range("E65536").End(xlUp).Row > 31 Then '30行に到達してから1行目を削除する Range("E1:H30").Delete shift:=xlShiftUp End If Application.OnTime Application.Floor(Now, TimeSerial(0, 30, 0)) + TimeSerial(0, 1, 0), "Macro1" End Sub A2:D2で抽出してますが必要なのはB2のみ(それ以外は内緒ではなく、全く使ってない、先に起動を目指しているのでまだ削除してないだけのものです) A2:D2はメタトレーダーからDDEで引っ張ってきたデータです。 Symbol Bid    High     Low A B    C         D 下段左からABCDです。CDのhigh lowはmT4では日足の高安なので使わないのが作っている間に判明しました。 ここでの目的は30分足の4本値をエクセルで出すこと。A5:D5に配置します。 EからH列に並べて(上記から実際に使うのはFのみ) それを並べて頂いたマクロで30分の4本値を時系列で並べるのが最終目的です。 頂いたものを1分足30本時系列で並べるため時間調整を加えただけです。 Application.OnTime Application.Floor(Now, TimeSerial(0, 30, 0)) + TimeSerial(0, 1, 0), "Macro1" の前のバージョンではうまく起動していたのですが時間の誤差が拡大して時計による実行が必要と感じました。 しかし上記のマクロをいれるてMacro1を実行すると1秒間に何回も計算を行い始めエクセルがフリーズしてしまいます。 以上が今の現状と抱えている問題点の全てです。 どうかお力添えいただければ幸いです。

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.1

関連するQ&A

  • 時計による一定時間ごとに起動させるには

    素人です。誰か教えてください。 sub Macro1()  range("E65536").end(xlup).offset(1).resize(1, 4).value = range("A1:D1").value  if range("E65536").end(xlup).row > 30 then ’31行に到達してから1行目を削除する   range("E1:H1").delete shift:=xlshiftup  end if  application.ontime now + timeserial(0, 30, 0), "Macro1" end sub というマクロなのですが これを時計により00分と30分(例えば10時、10時半、11時、11時半、、、) というふうに起動させるにはどうしたらいいでしょうか?

  • 2つのマクロをうまく動かすにはどうしたら?

    以下の2つのマクロを同時に動かそうとしています マクロ2はマクロ1で出した数字から始めの値段と終わりの値段と高安4つをエクセル関数で抽出して 出した4つの数字を24個蓄積することをめざしてます。 それぞれは1つで起動させるとうまく動くのですが 同時に動かすとマクロ1は4つずつ記録を始めたりと思い通りに動きません。 これを解決するにはどうしたらいいでしょうか? Sub Macro1() Range("E65536").End(xlUp).Offset(1).Resize(1, 4).Value = Range("A2:D2").Value If Range("E65536").End(xlUp).Row > 30 Then '31行に到達してから1行目を削除する Range("E1:H30").Delete shift:=xlShiftUp End If Application.OnTime Application.Floor(Now, TimeSerial(0, 1, 0)) + TimeSerial(0, 1, 0), "Macro1" End Sub Sub Macro2() Range("I65536").End(xlUp).Offset(1).Resize(1, 4).Value = Range("A5:D5").Value If Range("I65536").End(xlUp).Row > 24 Then '25行に到達してから1行目を削除する Range("I1:L1").Delete shift:=xlShiftUp End If Application.OnTime Application.Floor(Now, TimeSerial(0, 30, 0)) + TimeSerial(0, 30, 0), "Macro2" End Sub 追加としてマクロ1は30分もしくは00分(9時00分、9時30分、10時11時も同様)に記録を始めて 9時1分や31分には一旦削除最初から記録を蓄積するということを目指してます。 つまり10時10分からマクロを動かすと10時31分になると一旦削除して最初から始めるとうものです。 こちらも可能ならお願いします!

  • 誰か助けてください!マクロが無効にされます、、

    先日エクセル2013で sub Macro1()  range("E65536").end(xlup).offset(1).resize(1, 4).value = range("A1:D1").value  if range("E65536").end(xlup).row > 30 then ’31行に到達してから1行目を削除する   range("E1:H1").delete shift:=xlshiftup  end if  application.ontime now + timeserial(1, 0, 0), "Macro1" end sub というマクロを作ってもらいました。 しかしいざ動かそうとすると最初のマクロが起動したあと必ず「このブックでマクロが使用できないか、またはすべてのマクロが無効になっている可能性があります。」とでます。 コンテンツを有効化してもマクロのセキュリティをすべてのマクロを有効にしてもだめです。 デジタル署名しようにもアマゾンでネットでエクセルのみ購入したためかselfcert.exeがありません。 全く原因と解決方法が分かりません!誰か助けてください!

  • VBA マクロの2つのカウントダウンタイマーの件

    VBAでマクロ作成中ですが、標準モジュール間の変数のやり取りがよくわかりません。 教えていただけないでしょうか? Sub 指定時刻にマクロを実行する1()    mywait = 1    指定時刻 = Now + TimeSerial(0,0,mywait)    IF MacroStop = False Then      Application.OnTime 指定時刻,”指定時刻にマクロを実行する1”    Call やりたいこと1    Else MacroStop = False End End If End Sub Sub やりたいこと1    C1= C1+1    ZAN1 =TB1-C1   ・・・ End Sub Sub マクロ停止1()     MacroStop = True     Range(”A1”).ClearContents     ... End Sub と Sub 指定時刻にマクロを実行する2()    mywait = 1    指定時刻 = Now + TimeSerial(0,0,mywait)    IF MacroStop = False Then      Application.OnTime 指定時刻,”指定時刻にマクロを実行する2”    Call やりたいこと2    Else MacroStop = False End End If End Sub Sub やりたいこと2    C2= C2+1    ZAN2 =TB2-C2  ・・・ End Sub Sub マクロ停止2()     MacroStop = True     Range(”A2”).ClearContents     ... End Sub という標準モジュールを2つ作成し、一方のマクロ(C1側)を止めると、もう一方のマクロ(C2側)の変数(TB2)がIntegerからEmptyに変わってしまい、ZAN2がマイナスカウントしてしまいます。 TB1はInteger型のままClearContentsされ0になり、C1側のマクロは正常に止まっています。C2側は、継続して正常にカウントダウンさせたいのですが。。。 マクロの初心者です どなたかよろしくお願いします。 

  • VBAで処理フラグの立て方

    こういった条件でやりたいのですがうまくいきません・・・ 処理フラグの立て方は間違っていないと思うのですが・・・ ちょっとセルとかは変えてあります。 もしE3の値が4で割り切れたら8行目を削除し次の処理は行わない もしE3の値が4で割り切れなかったらE4の値が4で割り切れるか処理をする。 割り切れたら18行目を削除 E3とE4の値両方が4で割り切れなかったら8行目を削除し1行あがるので17行目を削除したいです Sub rdlt() If Range("I1").Value = 0 Then Range("I1").Value = 1 '処理は一度きり If Range("E3").Value Mod 4 = 0 Then Rows("8:8").delete '4で割れたとき8行目を削除 Range("J1").Value = 1 '4で割れたときは次の処理用にフラグ End If If Range("J1").Value = 0 Then 'E3が4で割れなかったときは処理する If Range("E4").Value Mod 4 <> 0 Then Rows("18:18").delete Range("J1").Value = 1 End If End If End If End Sub

  • マクロで分岐をさせる方法

    下記の記録マクロでWith→End With 間にIFで分岐を試みたのですが エラーになります。どうすれば出来るのか伝授をお願いします。 マクロは初心者です。 Dim hensuh(2) As Integer Dim dekiru As Long Dim kinek As Long Dim uineu As Long Dim myTime As Date Dim flg As Boolean Sub OnTimeSamp1() Application.OnTime EarliestTime:=TimeValue("09:00:00"), Procedure:="Ontime_Set" '記録開始 Application.OnTime EarliestTime:=TimeValue("11:00:00"), Procedure:="Ontime_Reset" '記録終了 End Sub Sub Ontime_Set() 'トグルになっている If flg = False Then flg = True myTime = Now + TimeSerial(0, 0, 1) ElseIf flg = True Then flg = False Else Exit Sub End If If Range("A1").Value = "" Then Range("A1").Value = Format(Now, "hh:mm:ss") '時間記録(スタート) End If Application.OnTime EarliestTime:=myTime, _ Procedure:="my_Procedure", Schedule:=flg If flg = False Then myTime = 0 End If End Sub Sub my_Procedure() Worksheets("kirokuyou").Activate 'ワークシートをアクティブにする。(記録中別のワークシートを開けた場合そこに記録されてしまうのを防ぐ) With Range("A65536").End(xlUp).Offset(1) .Value = Format(Now, "yyyy:mm:dd:hh:mm:ss") '時間記録 .Offset(, 1).Value = Range("S3").Value 'S3 の値 .Offset(, 2).Value = Range("T3").Value 'T3 の値 .Offset(, 3).Value = Range("U3").Value 'U3 の値 .Offset(, 4).Value = Range("V3").Value 'V3 の値 dekiru = Range("V3").Value Range("V6").Value = dekiru kinek = Range("T22").Value Range("T18").Value = kinek uineu = Range("U22").Value Range("U18").Value = uineu 'IF S17 >= 120 Then 'hensuh(0) = Range("S17").Value ←変数に代入後、分岐させたいのですがエラーになる 'Elseif S17 >= 110 Then 'hensuh(1) = Range("S17").Value ←変数に代入後、分岐させたいのですがエラーになる 'Elseif S17 >= 100 Then 'hensuh(2) = Range("S17").Value ←変数に代入後、分岐させたいのですがエラーになる 'End If flg = False myTime = 0 End With Call Ontime_Set End Sub Sub Ontime_Reset() 'タイマーリセット On Error Resume Next Application.OnTime EarliestTime:=myTime, _ Procedure:="my_Procedure", Schedule:=False If Err.Number > 0 Then MsgBox "OnTime設定はされていません。", 64 Err.Clear flg = False Else MsgBox myTime & "の設定は解除されました。", 64 flg = False myTime = Empty End If End Sub

  • エクセルVBAについて

    http://okwave.jp/qa/q7236213.html 上記質問の発展形なのですが 同様のことを E列に日付 F列に売上 G列に結果 でやりたいのですが この時A列~C列のマクロも残したままでしたいのですが 下記のように同様のプロシージャーを下段に書けばできると思ったのですが うまくいきません。 Private Sub worksheet_change(ByVal Target As Excel.Range) If Target.Address <> "$A$1" Then Exit Sub If Target = "" Then Exit Sub Range("C10:C65536").ClearContents With Range(Cells(9 + Range("A1").Value, "C"), Cells(Range("A65536").End(xlUp).Row, "C")) .FormulaR1C1 = "=MAX(RC2:R[" & -Range("A1").Value + 1 & "]C2,FALSE)" .Value = .Value End With End Sub Private Sub worksheet_change(ByVal Target As Excel.Range) If Target.Address <> "$E$1" Then Exit Sub If Target = "" Then Exit Sub Range("G10:G65536").ClearContents With Range(Cells(9 + Range("E1").Value, "G"), Cells(Range("E65536").End(xlUp).Row, "G")) .FormulaR1C1 = "=MAX(RC6:R[" & -Range("A1").Value + 1 & "]C6,FALSE)" .Value = .Value End With End Sub どなたかお知恵を拝借できませんでしょうか?

  • エクセルVBEについて

    VBE初心者です。以下のプログラムを実行すると「testが見つかりません」とエラーが出てしまいます。application.ontimeの使い方がよく分かりません。どこが違うんでしょうか?よろしくお願いします。 Sub test() Range("D10").Value = Second(Time) If Range("D10").Value >= 55 Then Exit Sub End If Application.OnTime Now + TimeValue("00:00:01"), "test" End Sub

  • エクセル VBA マクロについて

    VBA初心者です。 Sub 記入() Range("H8", "J14").Copy Range("C" & Rows.Count).End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValuesAndNumberFormats Application.CutCopyMode = False Range("H15", "J21").Copy Range("C" & Rows.Count).End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValuesAndNumberFormats Application.CutCopyMode = False Range("H22", "J28").Copy Range("C" & Rows.Count).End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValuesAndNumberFormats Application.CutCopyMode = False Range("K13").Select End Sub こういうマクロを作り上手く作動しましたのでB列に日付を記入したいと思い Sub 日付() Range("("B" & Rows.Count).End(xlUp).Offset(1)","("C" & Rows.Count).End(xlUp).Offset(0, -1)").Value = Date End Sub このようなマクロを組みましたがエラーがでます。どなたか直して頂けませんか?よろしくお願いします。

  • エクセルシートの順繰り表示マクロについて

    エクセルにて随時更新されるデータを全画面表示し、3枚のシートを5秒置きに順繰り表示させるようマクロを組みました。始めは順調なのですが、数時間たつとフリーズしてしまいます。そもそもエンドレスのマクロプログラム実行に無理があるのでしょうか。 または下記のプログラムに問題があるのでしょうか。ご教授お願いします。 Sub Macro1() Sheets("Sheet2").Select Application.OnTime Now + TimeValue("00:00:05"), "Macro2" End Sub Sub Macro2() Sheets("Sheet3").Select Application.OnTime Now + TimeValue("00:00:05"), "Macro3" End Sub Sub Macro3() Sheets("Sheet1").Select Application.OnTime Now + TimeValue("00:00:05"), "Macro1" End Sub

専門家に質問してみよう