RSSユーザー
VBAの動作を確実に止める方法について
当方岡三RSSの初心者です。以前、定期的にQUOTE_Mを実行する手段について、
Application.CommandBars("岡三RSS2").Controls.Item("更新").Execute
を使って実行する方法を教えていただいた者です。
これは非常にうまく動作しておりまして、大変満足しておりますが、非常に困っている事があります。それはデバグする時の現象です。
マクロのある場所にブロックポイントを設け、そこでマクロを止め、F8ボタンを押してワンステップ毎に動作を確認してゆくとき、再度設定した時刻が来ると、プログラムが動作を開始してしまいます。あわてて、マクロのリセットボタンを押しても動作がなかなか止まりません。仕方がないので、コントロール+Pause/Breakボタンを押すのですが、なかなか動作が止まりません。確率的に言いますと、大体90%ぐらいは、そのうちなんとか停止しますが、10%ぐらいは、excelの右上の×印を押して、強制終了しなくてはいけません。この現象が著しくデバグ効率を下げています。何かスッキリしたVBAを停止する操作があれば、その方法を教えていただければありがたいです。
2021年08月09日
大野 了
RSSユーザさん、こんにちは!!
こちらはデバック中に、デバック前に指定したonTimeの関数が動いてしまい、
デバックが中断してしまうという事でしょうか?
ブレークポイントなどでVBAを止め、中断状態(デバック状態)になっているときに
onTimeでスケジューリングしたVBAの関数が動いてしまった場合、
通常は
『中断モードでコードを実行することはできません。』
とメッセージが出て、onTimeで指定した関数は動作しないと思われます。
多分、自分がRSSユーザさんのご質問の内容と状況を理解できていないと思うのですが、
もう少し状況を詳しく教えて頂けますと幸いです!!
2021年08月09日
RSSユーザー
大野様
<こちらはデバック中に、デバック前に指定したonTimeの関数が動いてしまい、
<デバックが中断してしまうという事でしょうか?
その通りです。
<『中断モードでコードを実行することはできません。』
<とメッセージが出て、onTimeで指定した関数は動作しないと思われます。
これまでの1ヶ月程度での経験で言いますと、数100回トライして、マクロがすんなり停止する確率は0%です。以下Ctrl+Pause/Breakボタンを押したときのマクロの反応は以下の3通りです。
ケース1:(大野様に指摘頂いたケース)
「中断モードでコードを実行出来ません」とメッセージが出ます。下にあるOKボタンを押します。そうすると、再度同じメッセージが出ます。再びOKボタンを押す動作を6回程度繰返すと完全に停止します。
ケース2:メッセージボックスが出ます。「コードの実行が中断されました。」と書いてあり、下に4個のボタンが並んでいます。左から「継続」、「終了」、「デバグ」「ヘルプ」となっており、「デバグ」と「ヘルプ」は薄くなっており、アベーラブルではありません。この場合、終了を押しても、終了しません。そのうちPCがうんうんとうなり始め、しばらくして同じメッセージが出るので、終了を押すと終了します。この場合完全に停止します。
ケース3:メッセージボックスはケース2と同じです。右から2番目の「デバグ」ボタンがアベーラブルになっています。「デバグ」を押すと、適当なマクロのステップが黄色になっています。マクロの画面の中央あたりにあるリセットボタンを押すと一旦停止します。が、設定時刻がきますと再度動作を開始します。終了時間を待てませんので、excelがいじくれる状態になったときを見計らって、excelの右上の×ボタンを押してexcellを強制終了させます。
以上3通りの反応です。最悪はケース3です。非常に時間を消費してしまいます。
なんとなくですが、マクロの仕事が重い場合(時間がかかる場合)にケース3となるような気がしております。以上、完全にスッキリさわやかにVBAを停止させる方法があれば教えていただければありがたいです。
2021年08月11日
大野 了
RSSユーザさん、こんにちは!!
なるほどー
いろいろな状況があるのですねー
ひとつずつ回答させて頂きます!!
まず、VBAの動きの前提として
Ctrl+BreakはVBAの『中断』をするショートカットで『停止』をさせるショートカットではないため、
『中断』しても、その後そのまま動かせば、VBAはそのまま動き続けてしまいます。
『VBA』を停止させたい場合は、Ctrl+Breakでは『中断』させた後、
リセットボタン(ツールバーにある四角いボタン)を押して初めてVBAの『停止』となります!!
また、面倒な事に一度onTimeでスケジューリングしてしまうとVBAを『停止』してもスケジュールは消えないため、
onTimeでスケジューリングしたものが残っている場合、VBAを停止してもまた動いてしまいます!!
多分、この複合要因が重なって、
VBAを止めても止めても動いてしまい、VBAがうまく止まっていないように見えていると思われます!!
>ケース1:(大野様に指摘頂いたケース)
>「中断モードでコードを実行出来ません」とメッセージが出ます。下にあるOKボタンを押します。そうすると、再度同じメッセージが出ます。再びOKボタン>を押す動作を6回程度繰返すと完全に停止します。
こちらですが、onTimeのスケジューリングを複数行われているためだと思われます。
もし複数スケジューリングされている場合ですと、スケジューリングされている分がすべて動作するので、
スケジューリングされている回数分、メッセージが繰り返し表示されます!!
『Quote関数の使い方について』のご質問の方と同じ方(別の方でしたら、申し訳ありません)でしたら、
for loop でonTimeを複数スケジューリングされるという流れでされるとのことでしたので、
多分、ここで複数設定されたスケジューリングがすべて動いているのだと思います!!
for loopでのonTimeの複数スケジューリングのロジックを変更して、一つずつスケジューリングする形にすると
このメッセージ自体で無くなると思います!!
2021年08月11日
大野 了
>ケース2、ケース3:
こちらですが、メッセージは似ていますが、上記のスケジューリング問題とは別現象となっています。
『コードの実行が中断されました。』はVBAでエラー処理が入っていない状態で、エラーが発生し
後のロジックが実行できないような場合に表示されるメッセージとなります。
大きくは2点の可能性が考えられます!!
1.ソースコードにエラーがある
2.ブレークポイントがおかしくなっている
>1.ソースコードにエラーがある場合
以下の事を確認して頂けますでしょうかー?
1.『VBAエディタ』-『デバッグ(メニュー)』-『VBAProjectのコンパイル』でコンパイルをする
コンパイルを掛けるとソースコードの構文エラーなどを全体的にチェックしてくれます!!
2.『VBAエディタ』-『ツール(メニュー)』-『参照設定』で参照不可の項目がないか確認する
参照設定で、参照不可のライブラリがあると、VBAが不特定の場所でエラーになるので、
参照不可の項目がある場合はチェックを外してください!!
3.『デバッグ』が押せる場合は、押して止まった行の状態を見てみる
多分、変数の中身がNull(空っぽ)になっていたり、数値を処理するところに文字が入ってしまっていたりすると思うので、
黄色の行で止まった原因を調べて対処してください!!
>2.ブレークポイントがおかしくなっている
以前、自分も経験したのですが、一度張ったブレークポイントが残ってしまって、
消しても消しても何もないところでVBAが止まってしまうことがありました。
なにをやっても最終的に解決せず、ファイルごと作値直して解決させました・・・
もし、作られているExcelファイルが複雑でない場合、まっさらなExcelに作り直されると直る可能性があります!!
以上、長文になってしましたが、これで解決できると幸いです!!
2021年08月11日
RSSユーザー
大野様
大変詳細に回答いただきまして、大変ありがとうございました。今後参考にさせていただきます。ところで、その中で、ショックを受けた部分があります。それは、以下の部分です。
<また、面倒な事に一度onTimeでスケジューリングしてしまうとVBAを『停止』してもスケジュールは消えないため、onTimeでスケジューリングしたものが残っている場合、VBAを停止してもまた動いてしまいます!!
当方、数分おきに100回程度QUOTE_Mを動かしておりまして、これを別々に動かすのは不可能と思われます。従いまして、ある条件が成立したので、途中(例えば12:40分頃)に、このスケジュールを抜けて、別の重い処理をさせる事を考えておりましたが、
これは不可能である。ということを意味しているのでしょうか?
この辺を教えていただければありがたいです。
ところで、
<『Quote関数の使い方について』のご質問の方と同じ方(別の方でしたら、申し訳ありません)
これは、同じ私でした!
2021年08月12日
大野 了
RSSユーザーさん、こんにちは!!
>従いまして、ある条件が成立したので、途中(例えば12:40分頃)に、このスケジュールを抜けて、別の重い処理をさせる事を考えておりましたが、
>これは不可能である。ということを意味しているのでしょうか?
こちらの『スケジュールを抜けて』とおっしゃられている状況としましては・・・
1.12:40、13:00、13:30の3つをonTimeでスケジューリング
2.12:40の関数が動く
3.この関数の動き方次第では、13:00、13:30のスケジューリングを動かしたくない場合がある
という感じの動きの事で間違いありませんでしょうか?
VBAを停止してもスケジュールが自動で消えることはありませんが、
手動でスケジュールを削除することは可能です。
上記の場合であれば、12:40の関数を抜ける際に、
13:00、13:30のスケジュールを指定して削除する感じになります。
やり方としては、
スケジュールを設定するときと同じ要領でonTimeを呼び出して頂き、
onTimeの第四引数をFalseで指定することにより、スケジューリングがクリアされます!!
2021年08月12日
RSSユーザー
大野様
<やり方としては、
<スケジュールを設定するときと同じ要領でonTimeを呼び出して頂き、
<onTimeの第四引数をFalseで指定することにより、スケジューリングがクリアされます!!
実は、これをお聞きしたくて、長―い長い質問をしておりました!
現在私が使っているのは、Call Application.OnTime(Cells(1, i), "UpdateRSSData")
です。(大分前に大野様に教わったコードです!)これに引数を追加して
Call Application.OnTime(Cells(1, i), "UpdateRSSData", ??? ,False)
とすれば良いのかなあ、、と思っていますが、3番目に何を入れるべきかがわかりません。教えていただければありがたいです。
2021年08月12日
大野 了
RSSユーザさん、こんにちは!!
そうですね・・・
Call Application.OnTime(Cells(1, i), "UpdateRSSData", ,False)
で大丈夫と思います!!
もしうまく行かないのであれば・・・
Call Application.OnTime(EarliestTime:= Cells(1, i), Procedure:="UpdateRSSData", Schedule:=False)
と記述されるのがよいと思われます!
2021年08月12日
RSSユーザー
大野様
いろいろありがとうございました。これで応用が広がりそうです。
2021年08月15日