RSS初心者
QUOTE_Mの更新直後のWaitが効かない。
どなたか、以下につきまして困っております。対策を教えていただけるとありがたいです。
現状:4本値をQUOTE_Mにてダウンロードし、その4本値を使って、ろうそく足チャートを描こうとしております。まず、日足の4本値をダウンロードして、その4本値を元に、日足のチャートを描画します。そのあと、1分足の4本値ダウンロードし、1分足のチャートを描画します。
以上をマクロで実行します。ところが、日足のチャートは描画されず、(画面が真っ白)、1分足のチャートだけが描画されます。
仕方がないので、デバグモードで1ステップ毎に実行しますと、大体きれいに、両方のチャートが出力されます。
この原因は、マクロで実行しますと、最初の日足の場合、4本値のダウンロードが終了する前に、描画タスクが動いてしまう為と思われます。しかし、その後に実行される、1分足の場合は、描画タスクの実行時間が大きいため(数秒程度)、4本値が完全にダウンロードされ、きれいに1分足のチャートが出力される。ということのようです
(勝手に自分でそう思っている!この解釈が間違っているかも知れません)。
上記現象の対策として、以下2つの方法を試しました。
方法1:QUOTE_Mを実行した直後にwait関数を使用。
Application.Wait [Now()] + 5000 / 86400000 を実行。
結果は、ダメでした。(いくら遅延時間を大きくしても駄目)
方法2:QUOTE_Mを実行した直後にSleep(5000)を使用。
「Declare PtrSafe Sub Sleep Lib "kernel32"
(ByVal dwMilliseconds As Long)」をタスクの頭で宣言しておきます。
結果は、いくらsleep時間を大きくしても駄目。
ということで、現在、手動で、QUOTE_M実行直後の描画タスクにストップをかけておき、
そのタスクが黄色になったのを確認してから、
3秒ほど待ってからタスクの再開(F5を押す)をしております。
(まったく面倒くさいです!)
どなたか、以上の対策案をお持ちの方おられましたら教えて
いただければありがたいです。
2022年06月23日
大野 了
RSS初心者さん、こんにちは!!
VBAの中身がわからないため、何とも言えませんが、
チャートを動作させるためのVBAはどのようなイベントで実行されていますでしょうか?
F5の実行で動くのとステップ実行で正常に動作するという事であれば、
VBAが実行し続けているため岡三RSSがデータを更新できていないのかもしれません。
もし、Do Loopなどで指定時間の永久ループをさせているのであれば、
そのDo Loopの内側に DoEvents を記述してあげれば、
チャートの描画が動くようになるため正常に動作すると思われます!!
これでうまく行くと良いのですが・・・
2022年06月23日
RSS初心者
大野様へ
早速の回答ありがとうございます。以下、現在の私のマクロを以下に記述しました。
(頭に番号を付加しました)
1) Sub 学習データ作成実行()
2) Dim ws50, ws51, ws52 As Worksheet
3) Set ws50 = Worksheets("学習データ")
途中省略
4) Call 銘柄コード転送学習(銘柄コード, 銘柄名) ‘4本値取得する銘柄コードを送る。
5) Application.CommandBars("岡三RSS2").Controls.Item("更新").Execute
6) ‘Call Sleep(5000)
7) ‘Application.Wait [Now()] + 3000 / 86400000
8) Call 描画管理学習
9) End Sub
以上、何の変哲も無い、簡単なものです。8)の「描画管理学習」にて、蝋燭足を描かせます。
5)により、QUOTE_Mが動作して、4本値がサーバーからダウンロードされます。
8)にストップを仕掛けておき、ここが黄色くなったとき、3秒程度待ってから
F5を押しますと、ちゃんとチャートが描かれます。
ストップを掛けなかった場合、6)や、7)を入れても、全く意味がありません。
最初のチャートが出力されません。(日足と1分足を描かせている場合)
なんとなく、以下の感じがします。
6)や、7)は、VBAの動作を止めるのと同時に、サーバーからデータをダウンロードする機能まで、ストップしてしまう。という気がしています。
ですので、以下のような命令があれば、OKかな?という気がします。
すなわち、「VBAの動作は停止するが、サーバーからデータをダウンロードする機能は失われない」
あるいは、「4本値データのサーバーからのダウンロードが終了した瞬間、トリガーが発生し、蝋燭足チャートを描くタスクが起動する機能」と言った方が正確かもしれません。
以上の現象につきましては、この半年ほど手こずっておりまして、最初のチャートが出ないのは、ほぼ諦めておりました。今回、遂に意を決して、質問させていただきました。
以上、この現象につきまして、ご理解いただけましたでしょうか?
2022年06月24日
大野 了
RSS初心者さん、こんにちは!!
本件ですが、
5)のApplication.CommandBars("岡三RSS2").Controls.Item("更新").Executeでデータ取得した後に
8) Call 描画管理学習の間に
RSSがデータをシートに描画するタイミングがないために、発生していると思われます。
RSSは"VBA実行中"はデータのシートへの書き込みが行えないため、
5)のApplication.CommandBars("岡三RSS2").Controls.Item("更新").Execute
でデータ取得をさせていても、
実際は 9) End Sub まで行かないと、データがシートに出力できません。
このため
8) Call 描画管理学習
をさせた時は、RSSの内部にデータはあるもののシート上には何もないという状況になっていると思われます。
解決策ですが、最も簡単なのは
5)のApplication.CommandBars("岡三RSS2").Controls.Item("更新").Execute
の後にDoEventsを入れて頂くと大丈夫と思いますが、
こちらはタイミングの問題があるので、上手く行けば・・・
という感じです。
もっとも安定した対応としては、
8) Call 描画管理学習
をSub 学習データ作成実行()の中から出して頂き再計算イベントなどの他のイベントから呼び出してあげるのがよいと思います!!
2022年06月24日
RSS初心者
大野様
早速試してみましたが、うまくいきませんでした。以下、経過を説明します。
試し1)Call 描画管理学習oEventsを挿入しました。最初うまく行きましたが、その後、駄目になりました(不思議です!)
試し2) サブタスクを分離しました。以下そのコードを記述します。
Sub 学習データ作成実行()
Call 学習データ作成実行2
Call 描画管理学習
End Sub
とやって、これまでのタスクの名前を「Sub 学習データ作成実行2」と変更しました。
(これで、Sub 描画管理学習 を外に追い出した事になると思います)
これも駄目でした。
結局、上記、試し1)、試し2)とも駄目でした。
そこで、Call 描画管理学習のステップに、ストップを入れ、黄色くなったところで、1秒程度待ち、F5を押すと、2枚の絵が綺麗に描画されました。(1秒より早く押すと、1枚しか出力されなかったりします)
何か、他にうまい手はないでしょうか?
2022年06月24日
RSS初心者
大野様
なんとか成功させました(しかし、あきれた方法です!)
どうやったかといいますと、タスクを分離し(前回説明の「試し2」)、且つ、Call 描画管理学習 を2回実行し、かつまた、オリジナルのタスクにおいて、Call 描画管理学習 を復活させました。結果、描画が3回実行されます。この結果、ほぼ100%の確率で、2枚の蝋燭足を描画させることが出来ました! 時間的に言いますと、描画の処理時間が早いので、あまり遅くなった感じがしません。まあしょうがありません。取りあえずは、これで凌いでおこうと思います。ありがとうございました。
2022年06月24日
大野 了
RSS初心者さん、こんばんは!!
うまく行きましたかーよかったです。
試し1)の方ですが、
こちらはDoEventsの処理はタイミングが関係しているため、動かない時もあると思われます。
また、
試し2)ですが、こちらは
学習データ作成実行()の中を分けても、学習データ作成実行()自体が終わっていないため、
岡三RSSの更新はかからない形となります。
なにはともあれ、上手く行ったようでよかったです!!
2022年06月24日
RSS初心者
大野様へ
<試し2)ですが、こちらは学習データ作成実行()の中を分けても、学習データ作成実行()自体が終わっ<ていないため、
<岡三RSSの更新はかからない形となります。
ここが私が完全に理解出来ていない為に、この問題を綺麗に解決出来ないものと思われます。
6月24日の2個目の、大野様のコメントの一部を、以下コピーしますと、
<RSSは"VBA実行中"はデータのシートへの書き込みが行えないため、
<5)のApplication.CommandBars("岡三RSS2").Controls.Item("更新").Execute
<でデータ取得をさせていても、
<実際は 9) End Sub まで行かないと、データがシートに出力できません。
という事でしたので、ともかく、「更新」したら、End Sub で一旦抜けて、その上位のタスクで「Call 描画」とすれば、解決出来るだろうと思いましたので、
試し2)のように、上位のタスクを作り、「更新」部分と、「描画」部分を分けました。
(しかし、これでも駄目でした)
このあたりをもうすこし説明いただけますと、有りがたいです。
2022年06月25日
大野 了
RSS初心者さん、こんにちは!!
申し訳ございません、自分の説明の仕方が悪く誤解を与えてしまいました。
RSSはVBAが実行されている間は情報をExcelのシートに更新することができないため、
VBAをいったん終了させてあげる必要があります。
『End Subまで行かないと』と記載しましたのは『VBAを終わらせて』という意味となります
※紛らわしく申し訳ありません。
サブプロシージャを分けても、親のプロシージャが終わっていない場合、
VBAは実行中のままとなりますので、岡三RSSはシートを更新できない状態が続きます!!
2022年06月25日
RSS初心者
大野様へ
<RSSはVBAが実行されている間は情報をExcelのシートに更新することができないため、
<VBAをいったん終了させてあげる必要があります。
そういうことだったのですか!愕然としております!
そうなりますと、何故、試し2)で、Call 描画を3回繰り返すと、4本値がシートに
ダウンロードされるようになるかが、わからなくなりますが、、、
仕方が無いので、DoEventsをぐぐりました。そうしますと
一旦、VBAからOSに処理を移す。のだそうですが、、、、
OSに戻ったときに、何かキーボードを操作するのであれば、それは、デバグモードで
「更新」の後の処理にストップを掛けておいて、黄色くなったらF5を押す。
というのと、大して変わらない。ということになってしまいます。
具体的に、どうすれば、美しく、「更新」直後に、1枚のチャートもロスすることなく
描く事が出来るのでしょうか?
もはや、大野様におすがりするしか、道はありません!
2022年06月25日
大野 了
RSS初心者さん、こんにちは
VBAの中身がわからないためなんとも言えないのですが、描画プロシージャの中などにDoEventsが残っているのではないでしょうか?
サブプロシージャを何度も読み込んでいることで、DoEventsが何度も動いて
RSSのシートへの描画とタイミングがあったのだと思います。
繰返しの説明になってしまい、大変申し訳ないのでですが・・・
もっとも安定した対応としては、
Call 描画管理学習
をSub 学習データ作成実行()の中から出して頂き再計算イベントなどの他のイベントから呼び出してあげるのがよいと思います!!
2022年06月25日