- ベストアンサー
VBAのマクロを時計単位で起動させる方法
- VBAを使用して時計単位でマクロを起動する方法を教えてください。
- マクロが常時計算を続けてしまいエラーが発生してしまう問題があります。
- 31行に到達した場合、1行目を削除してマクロが正常に動作するようにしたいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
恐らく「あなたの実際のマクロ」で、あなたがご自分で手を入れた部分が間違っているのが原因と推測されます。(あなたのブックにその他に何を仕込んでいるか不明なので、そちらが原因の可能性も十分あります) ちなみにあなたの修正では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に細工している部分はすべて消去する
その他の回答 (3)
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>マクロが常時計算を続けてしまいパンクしてしまします。 どこかに「ブレークポイント」を設定し、途中で止めて、止まった位置から「ステップ実行」してみましょう。 どこかで必ず「Macro1の実行中、Macro1から抜ける前に、Macro1が呼ばれる」って状況が発生する筈です。 これが続くと「戻り先をどんどん記憶し続ける」ので、スタックオーバーフローでパンクします。 一番怪しいのが、WorksheetのChengeのプロシージャです。 このプロシージャの中でセルの値を書き換えたりすると、プロシージャから抜ける前に自分自身が呼ばれて、が延々と繰り返されて、スタックオーバーフローでパンクします。
お礼
まさしくそれが原因だったと思います。 一旦全て削除して新しく打ち直したらうまく起動しました! 有難うございます助かりました!
- keithin
- ベストアンサー率66% (5278/7941)
パンクするとはどういう意味ですか。そのマクロは「常時計算し続けたり」などしていません。 そのマクロで何に困っているのでしょうか。 そのマクロが動き続けている間あなたのエクセルが何をしているのは別に聞きませんけど、そのマクロは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 #そろそろ「教わったマクロをコピー貼り付けて」情報提供のつもりじゃなく、「あなたがあなたのエクセルで実際に動かしているマクロ」をあなたのエクセルからコピーして、「いま実際にはこうしています」とご相談で事実を情報提供するようにしてください。
補足
特に内緒ではありませんでした、ややこしくなると思ったことが誤解を生んでしまって申し訳ないです。 作っているのはまずこれです。 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
- ベストアンサー率66% (1719/2589)
補足
いったん全てを削除して一から打ち直したら前述のような事態はなくなりました。 仰ったとおり自分に誤りがあったようです。お騒がせしました。 まずは色々手を貸して頂いて有難うございます。 私の説明が拙てうまく伝えれませんでした。 私のやりたいことは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で取得し蓄積して 時系列を作るのが最終目的です。 頂いたものでこれから作ります、うまく伝えることが出来た上で お力添え頂けるものがあれがどうかよろしくお願いします。