とみ
岡三RSSフリーズについて
初めて投稿いたします。よろしくお願いいたします。
昨年の春までは、Worksheet_Calculateを使ったデータ取得VBAが問題なく動作していましたが、今年になった再度動作させると途中でとまってしまいます。
色々と調べてみますと、岡三RSS集いの広場に以下の記事がありました。
■岡三RSSがフリーズした事がある方に質問です https://bbs.okasan-online.co.jp/ont/rss/board/?topic_id=258&page=1#comment_1380
確かに、岡三RSSがフリーズしているようで、Shell関数を使ってRSSを停止して再起動すると無事に動くことは確認できました。しかし停止間隔が早くなり数分間隔でフリーズを繰り返す状況になります。そのような状況でApplication.OnTimeでRSSの停止起動のトリガをかけると、起動停止が繰り返されてしまいタイミングが狂うと岡三RSSがたくさん起動されることになりました。そこでApplication.OnTimeの解除をおこなうFalseも使いまして、比較的安定に動作させることができますが、それでも一日に数回はエクセルがフリーズする状況が発生しています。これは、おそらく岡三RSSの起動停止のタイミングに関係しているかと疑っていますが、実証できていません。このようにRSSの起動停止を繰り返すこと自体がやはり不自然だと思います。
そもそも昨年の春には岡三RSSは正常に動いていたのですが、1年後にフリーズが頻発する事態は異常です。この現象はネットではいくつか見られますので私だけの問題でもVBAの問題でもないように思います。何か本質的な問題があるように思います。別の記事では、昨年8月のwindows10アップデートが影響しているとの記載もありました。ただ、これに対してどうすればフリーズを解消できるかはわかりませんでした。
そこで質問ですが、
(1)岡三RSSがフリーズする原因について、調査してこの原因を排除する対策を取りたいと思うのですが、何かよいヒントや方法をお教えいただけないでしょうか?
(2)岡三RSSの起動停止でなく、起動したままで、例えばメモリリセットなどの初期化ができる方法はないでしょうか?つまり、複数起動等の問題がないリセット方法があれば対症療法でも比較的安定に動かすことができると思います。
以上よろしくご教授頂きたくお願い致します。
2021年03月17日
大野 了
とみさん、こんにちは!!
なるほどー岡三RSSのフリーズですか・・・
確かにとみさんがリンクを張られてる記事の様に、フリーズされる方がたまにおられるようです。
自分は、出張に行ってる時など、
1週間ぐらい岡三RSSとシストレのExcelファイルは上げっぱなしなのですが、
これといって止まったことはありません。
しかし、とみさんが止まられるとのことですので、
もしかすると岡三RSS自体は問題なくその他の環境が影響してるのかもしれません。
以下のことを教えて頂けますと幸いです。
・Windowsのバージョン
・Excelのバージョン
また、まっさらなExcelファイルに
=QUOTE("6701","東証","現在値")
の様に現在値だけを取得する関数を一つだけ書いた場合、
岡三RSSはフリーズしますでしょうかー?
もしフリーズされないのであれば、
環境も問題なく、Application.OnTimeで呼び出しているメソッドやWorksheet_Calculateの中に
停止に関するヒントがあるかもしれません!!
2021年03月17日
とみ
大野様
早速のご回答ありがとうございます。バージョンにつきましては以下です。
windows10
office Professinal Plus 2016
昨年のExcel VBAでは全く問題がなく、今年にそのまま動かしたらフリーズする事象に会いまして困惑しています。
今回は大野様の記事からRSSを停止と起動をさせるコードを作って、その中でApplication.OnTimeを使いました。この際にもあまりにもフリーズが頻繁に発生するので、Application.OnTimeが多く発生しており、これが原因でエクセルがフリーズすることが多いようです。これらもすべては、岡三RSSがフリーズすることが原因だと思っています。昨年以降にWindowsも岡三RSSも何回かアップデートを繰り返していますので、これが原因のように感じています。
ご指摘のようにまっさらなExcelファイルに=QUOTE("6701","東証","現在値")単独での動作の確認は試してみたいと思います。ただ、Worksheet_Calculateはデータ取得には必須でこれが使えないと岡三RSSの意味がないのでこの活用も含めて検討してみます。結果は改めてご報告させていただきます。
2021年03月18日
大野 了
とみさん、こんにちは!!
バージョンありがとうございます!!
Professinal PlusならMonthly Updateで何か新機能が入ったことが原因とは
考えつらいですね・・・
Application.OnTimeも複数の場所に書いてしまったりして、
使い方を間違うとExcelが不安定になってしまうので・・・
なにはともあれ、QUOTEだけのファイルがきちんと動くのか
それでもフリーズするのかでまた考えたいと思います。
動いてくれると、問題点がVBAに絞れるので良いのですがー
2021年03月18日
とみ
大野さま
ありがとうございます。
フリーズするVBAのプログラムは、10銘柄7項目をQUOTEで検出ワークシートを作り、銘柄毎に10個ワークシートから対応する項目のセルを読みだして、Worksheet_Calculateで各セルが値が書き換えられると刻々と各銘柄の7つの項目を行を増やして記入するプログラムです。Application.OnTimeは15時過ぎににファイルの自動保存を行うためだけに使用しておりましたが、フリーズするようになってRSSを再起動するためにApplication.OnTimeを使いますと、たまにエクセルがフリーズするようです。
昨日は、このプログラムの10銘柄7項目をQUOTEで検出ワークシートのみを残して他のワークシートは削除して、マクロが全く動作しないようにしました。つまり、Application.OnTimeやWorksheet_Calculateは削除されています。その結果は、終値だけが表示されており、RSSはフリーズしていないようです。
来週は、本来のプログラムで10銘柄のワークシートのWorksheet_Calculateのみを動作させようと思いますが、データは書き込まずに時刻のみを表示させるように単純化して動かしてみようと思います。最後にほぼ15時を10銘柄すべてが表示されていればフリーズは発生しないとの結論になると思います。その場合は、VBAの問題だと思います。来週に結果を報告させていただきます。それほど複雑なプログラムではないので信じられないのですが、この点ははっきりとしないと駄目ですね。
なお、以前の大野さんの記事
https://bbs.okasan-online.co.jp/ont/rss/board/?page=1&topic_id=258
で「2019/8月の月例アップデート(WindowsUpdate)でVBAなどが止まってしまう不具合が出ているのでそれが原因になっているかもしれません。」と書かれていますが、現在はこの問題はないでしょうか?
また、別の記事
https://diy-tradesystem.com/okasan-rss/rssfreezetaisaku
では、岡三RSSのメモリ使用量が900MBを超えると危険との記載がありましたが、フリーズが発生するプログラムを動作中にでタスクマネージャー確認すると最大でも60MB程度でした。フリーズしてもこの値が増加していないので、これも問題ないかと思っています。
2021年03月20日
大野 了
とみさん、こんにちは!!
なるほどー!!
今、お尋ねした感じでぱっと思い付いた内容ですと・・・
・Application.OnTimeを複数使っていてバッティングしている
・Worksheet_Calculate内で再計算が掛かるような項目を更新してしまい
Worksheet_Calculateイベントが動き続けている
ぐらいでしょうかー
まず、Application.OnTimeですが、
複数個所にApplication.OnTimeを仕掛けた場合、同じ関数がOnTimeで呼ばれると
バッティングしてExcelが止まってしまう時があります!!
また、Worksheet_Calculateの再計算が掛かり続ける件では、
Worksheet_Calculate内でセルをする時に、
セルの再計算が掛かってしまうようなセルを更新してしまうと、
Calculateが次のCalculateのイベントを呼んで
さらにそのCalculateが次のCalculateのイベントを・・・
と永久ループしてしまいフリーズすることがあります!!
※通常は重くなるだけで止まらないと思うのですが、VBAでやってること次第では止まるかもです・・・
2021年03月20日
とみ
大野様
おはようございます。
ありがとうございます。Worksheet_Calculateの再計算が掛かり続ける可能性については慎重に検討してみます。
今日は、単純化したWorksheet_Calculateを使ったエクセルを動かそうと思っています。銘柄情報と名付けたワークシートに10銘柄7項目をQUOTEの関数を記載して、各銘柄ごとのワークシートに各銘柄情報をコピーします。このワークシートは10銘柄分あります。この10個ワークシートにWorksheet_Calculateを組みこんでありますが、ここで単純化してNow()の値を銘柄情報と名付けたワークシートに記載するような処理のみをするようにしました。このため、Worksheet_Calculateでは自分のワークシートを再計算することはないと思います。これで検討してみたいと思います。本日の結果を楽しみにしております。自分ではそうではないと思っていたのですが、確かに自分のワークシートを何かのタイミングで再計算させるコードが紛れているかどうかは調べてみる必要があると思いますね。非常にありがたいアドバイスありがとうございます。
なお、Application.OnTimeにつきましては、言われるように頻繁にエラーが起こるとバッティングしてExcelが止まることは確認しています。ただ、問題のフリーズするオリジナルのプログラムは15:00過ぎたときにデータを保存するために設定するのみ動作中にはバッテングすることはないので本来はこれが原因でフリーズしたのではないと思います。
ただ、データを保存する方法として、Worksheet_CalculatではなくApplication.OnTimeをつかって定期的に5秒間隔で取り込む方法もあるので、どちらが安定かを検討してみたいとも思っています。
2021年03月22日
RSSユーザー
大野様
たびたびすみません。よく考えれると、Worksheet_Calculateがフリーズの原因とのお話に以下の疑問がでました。
(1)これが原因でフリーズする場合は、岡三RSSを停止して再起動すると復帰する現象が説明できません。そして、エクセルがフリーズしているわけでもないようです。岡三RSSが単独でフリーズしている原因がエクセルにある理由が理解できませんでした。
(2)プログラムでは、
Private Sub Worksheet_Calculate()
Application.ScreenUpdating = False
Application.EnableEvents = False
Call Data_Getting(6)
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
など、 Application.EnableEvents、Application.ScreenUpdating によって、再計算してもCalculateが呼び出されなく永久ループすることはないように思いますが、間違いでしょうか?
以上、単純な疑問で申し訳ありませんがよろしくお願いいたします。
2021年03月22日
とみ
大野様
本日の実験は終了しました。単純化したWorksheet_Calculateでの実験でもフリーズすることはなく、ほぼ数秒間隔で安定に動作しているようです。
しかし、現実にはWorksheet_Calculateを使った元のコードではフリーズしますので、このコードの相違点を追っかけるしかないようですね。確かにフリーズするプログラムは自動売買を行うことを目標にしていますので、複雑な計算もしているのでご指摘のようにWorksheet_Calculateが悪さをしているのかも知れませんね。
2021年03月22日
大野 了
とみさん、こんにちは
返信遅くなりました。
安定して動きましたかー
という事は、岡三RSSの環境等は大丈夫そうで、VBAの何かが原因であることが
大きそうですね・・・
という事は直せるという事なので、一歩前進ですね!!
とみさんのおっしゃられます通り、
今回単純化した部分と、元のソースとの差分に何かしら原因があると思われます。
また、ご質問の件ですが・・・
>(1)これが原因でフリーズする場合は、岡三RSSを停止して再起動すると復帰する現象が説明できません。そして、エクセルがフリーズしているわけでもないようです。岡三RSSが単独でフリーズしている原因がエクセルにある理由が理解できませんでした。
なるほど!!
Excelを再起動せず上げっぱなしで、岡三RSSだけの再起動するだけで直るんですねー
以前あったのですが、岡三RSSの問い合わせ関数をたたき続けた時があって
その時は岡三RSSが止まってしまいました。
再計算などの中で岡三RSSの関数を使用している部分はありますでしょかー?
(2)プログラムでは、
など、 Application.EnableEvents、Application.ScreenUpdating によって、再計算してもCalculateが呼び出されなく永久ループすることはないように思いますが、間違いでしょうか?
こちらもイベントを止められてるんですねー
でしたら、とみさんのおっしゃられます通り、Calculateが繰り返し呼ばれることは無いと思います!!
また、余談になってしまいますが
Application.ScreenUpdatingやApplication.EnableEventsを使用される場合は
エラー処理を行ってあげたが良いと思われます!!
今の状態ですとエラーが起きた場合、PGが画面描画を止めたまま止まってしまいます。
※もしここ以外でエラー処理を行っていたら申し訳ありません。
以下のようにエラーハンドラーを設定すると
エラーが起きても必ず画面再描画とイベントの停止処理を元に戻して
PGが終了します!!
Private Sub Worksheet_Calculate()
On Error GoTo ErrorHandler
Application.ScreenUpdating = False
Application.EnableEvents = False
Call Data_Getting(6)
ErrorHandler:
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
2021年03月22日
とみ
大野様
有効なアドバイスありがとうございます。大変参考になります。
今、原因を検討中ですが、Worksheet_Calculateで呼び出すサブルーチンCall Data_Gettingの中に再計算するコードを調べています。
①Now()関数で時刻をワークシートに表示する。
②株のデータを行を増やしてコピーして時々刻々とデータを記録する。
の二つはあります。これらはApplication.EnableEvents = Falseであれば無限ループになる必要がありますが、そうならならないと思っていました。しかし昨日の実験で上記の①と②を単純化のためになくして、時刻のみを別のWorksheet_Calculateがないワークシートに記載するようにしましたが、この場合はフリーズしないようです。そのため①と②が何らかの原因なのかもしれません。
先の質問にご回答いただいたものに追加の質問をさせてください。
Excelを再起動せず上げっぱなしで、岡三RSSだけの再起動するだけで直ります。「岡三RSSの問い合わせ関数をたたき続けた時」との意味がよくわからないのですが、問い合わせ関数とは、QUOTEなど、セルに張り付けて自動で表示する関数とは異なるものでしょうか? それを「たたき続けた時」との意味も分かりません。Worksheet_Calculateで呼び出すことも「たたき続けた時」ということになるでしょうか?
実は上記の①②などもApplication.EnableEvents = Falseによって、サブルーティン中はWorksheet_Calculateを呼び出すことはないと思うのですが、終了後にApplication.EnableEvents =Trueとなった途端に一気に呼ぼ出されるとまずいと不安になりました。エクセルはこの辺のタイミングがずれていることが多いような気がしています。この辺の感触をお教えいただけると幸いです。よろしくお願いいたします。
2021年03月23日
とみ
大野様
お世話になっております。
本日は、Worksheet_Calculateにご指摘頂いたエラーハンドラー部分を付け加えて、ここで呼び出されるSUB Data_Gettingについて検討しております。先日はここの部分はWorksheet_Calculateを呼び出されないワークシートに時刻を表示する単純化を施したものを動かすと1日中フリーズすることがなかったものです。この時も10銘柄7項目をQUATEで表示するワークシートを用意して、銘柄に対応する10のワークシートそれぞれの項目をコピーすることで再計算してWorksheet_Calculateが呼び出されるようにしています。そこで、今回は同様でSUB Data_Gettingでは、再計算したデータを同一の銘柄ワークシートに時々刻々と改行してデータをコピーするようにしました。この場合はやはりフリーズします。
フリーズの検出は、SUB Data_Gettingにbeepを入れて音がしないときにフリーズしたと判断しました。
試しに動作中に岡三RSSを停止させてWorksheet_Calculateを呼び出さないようにしてみましたが、beep音が数回鳴りました。
どうもVBAでは動作をかなり保持しているようです。つまりサブルーティンを動作しているときでもWorksheet_Calculateが動作している可能性があるように感じています(確認できませんが)。
以前と今年の違いはインターネット環境が5Gとなり高速化していることでがこれの影響もあるかと思います。動作を遅らすために、
SUB Data_GettingにSleep 2000を入れて2秒程度遅らせましたが効果ありませんでした。この時のbeep音は2秒よりも早いです。
どうもこの辺にヒントがないかと思います。つまり、QUOTE関数の変化に対応して、マルチタスク的に短時間に複数のWorksheet_Calculateが呼び出されている可能性はあります。先のご回答の「たたき続けた時」ということと関係があるかもしれません。
なお、今回の実験でも岡三RSSの再起動で復帰しますが、一度もエクセルを再起動しないで起動します。
よろしくお願いたします。
2021年03月24日
大野 了
とみさん
だいぶ、返答が遅くなってしまい大変申し訳ありません。
ご質問の件ですが、
>「岡三RSSの問い合わせ関数をたたき続けた時」との意味がよくわからないのですが、
>問い合わせ関数とは、QUOTEなど、セルに張り付けて自動で表示する関数とは異なるものでしょうか?
QUOTEなどはVBAから直接読んでデータを取得することが可能ですので、
もし大量の再実行処理が走ってその中で、QUOTEなどを使っているのであれば、
岡三RSSに負荷がかかるのではないかと考えました!!
>それを「たたき続けた時」との意味も分かりません。Worksheet_Calculateで呼び出すことも「たたき続けた時」ということになるでしょうか?
変な書き方して申し訳ありません。
「たたき続けた時」はQUOTE関数を実行し続けた場合という意味となります!!
関数を実行する際に『QUOTEをたたく』という言い方をする時があるので、
そのまま使ってしまいました・・・
>実は上記の①②などもApplication.EnableEvents = Falseによって、サブルーティン中はWorksheet_Calculateを呼び出すことはないと思うのですが、
>終了後にApplication.EnableEvents =Trueとなった途端に一気に呼ぼ出されるとまずいと不安になりました。
はい、Application.EnableEvents = Falseを掛けているのであれば、Calculateが繰り返し呼び出され続けることは無いと思います。
2件まとめての返答になってしまい、返答漏れがあったら申し訳ありません
こちらのフリーズするファイルですが・・・
データのスクリーニングだけのファイルで
システムトレードのノウハウなどが無いファイルで、
もし、こちらの掲示板にアップロードして頂くか、
メッセンジャーで直接ファイルを送って頂けるのでしたら、自分が見てみましょうか?
2021年03月24日
とみ
大野様
ありがとうございます。特に返答遅れは気にしていません。むしろヒントをたくさんいただけるので感謝しております。
Application.EnableEvents = Falseを掛けていますが、Calculateはかなりの頻度で呼び出されています。この辺が不安だったのですが、Calculateが繰り返し呼び出され続けることがないとのお話なので安心しました。
Calculateが呼び出されるシートに=MAX、=COUNTなどが記載されているのでこれも反応する可能性はあります。しかし、『QUOTEをたたく』いてはいないのでエクセルの問題のようにも思っています。
もう少し検討したいと思いますが、ファイルを見やすくして分かりやすい状況で検証したうえで問題が解決しないときはファイルを送らせていただきます。その節はよろしくお願いいたします。
2021年03月25日
大野 了
とみさん
なるほど!!
岡三RSSの関数はVBAの中で使われていないという事ですね。
とするとExcel側の何かが問題になっている可能性大ですね。
なにはともあれ、早く解決させたいですね。
2021年03月25日
とみ
大野様
途中で時間を調べていますが、doeventsを使っていました。このコマンドはおまじないみたいな感じで使っていましたが、Application.EnableEvents = Falseを掛けても一時的にこれを開放するかもしれません。doeventsの扱いも問題ですよね?
昨日はこれを外してみましたが、最初は安定に動作していたのですが、時々フリーズしています。On timeの解除がうまくいっていない可能性がありますのでこれを外して来週に検討してみます。
まだ見苦しいコードを整理できていませんが、これでうまくいかないようでしたらよろしくお願いいたします。
2021年03月27日