質問掲示板
岡三RSS
集いの広場

アップロードされたファイルおよび投稿内容についての注意事項 別窓

複数の単語で検索する方法 別窓

【国内株式、先物・オプション】岡三RSS質問箱

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初心者

更新のサンプル.xlsx (28.8KB)

大野様へ
ついに刀折れ、矢が尽きました! 6月25日以来、1ヶ月強、どのように頑張っても、解決出来ませんでした。
以下、簡単なファイルを添付しましたので、見ていただければ幸いです。
ファイルがマクロ付きでは添付出来ませんので、xlsxとして添付しました。
マクロを以下に記述しましたので、このマクロをファイルに追加して、xlsmとして保存し直していただければ幸いです。

Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
Sub メイン()
Range(Cells(4, 1), Cells(40, 7)) = ClearContents
Cells(1, 2) = 9983
Call 更新
Call 待ち3種(4)
Call 正規化
End Sub
Sub 更新()
Application.CommandBars("岡三RSS2").Controls.Item("更新").Execute
End Sub
Sub 正規化()
For J = 1 To 10
Cells(J + 3, 7) = Cells(J + 3, 2) / Cells(J + 3, 3)
Next J
End Sub
Sub 待ち3種(J)
If J = 1 Then K = 0: For J = 1 To 30000000: K = K + 1: Next J: Exit Sub
If J = 2 Then Application.Wait [Now()] + 5000 / 86400000: Exit Sub
If J = 3 Then Sleep 5000: Exit Sub
If J = 4 Then DoEvents
End Sub

以上が最も簡単に、この問題(更新後にどのような「待ち」をしても、サーバーからのダウンロードが行われない)を顕在化するように作成したマクロです。
結局、ステップインモード(F8キーをおして、ストップを更新直後に設置して、このステップが黄色になった
ときに、3~5秒待って、データがダウンロードされたのを確認してからF5を押す)という手段以外に、
エラー(オーバーフロー)無しでこのタスクを終了させることが出来ませんでした。
そこで、大野様にお願いです。具体的に、どのようにすれば、この問題を解決(デバグモード以外に、
このプログラムをエラー無しで終了出来る)出来るでしょうか?
よろしくご教授お願い申し上げます。
(尚、蛇足ですが、Sub 待ち3種(J)は、時間待ちする方法の3種および、Doeventsを入れておきましたが、
どれも効果がありませんでした)

2022年08月02日

ログインしてコメントを投稿する

大野 了

RSS初心者さん、こんにちは

最も良いのは、onTimeメソッドを使用するのが一番安定しますが、
もしロジックを大きく変えたくないのであれば、以下のように対応されるとオーバーフローは出なくなります!!

Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
Sub メイン()
Range(Cells(4, 1), Cells(40, 7)) = ClearContents
Cells(1, 2) = 9983
Call 更新
Call 待ち3種(3)
Call 正規化
End Sub
Sub 更新()
Application.CommandBars("岡三RSS2").Controls.Item("更新").Execute
End Sub
Sub 正規化()
For J = 1 To 10
Cells(J + 3, 7) = Cells(J + 3, 2) / Cells(J + 3, 3)
Next J
End Sub
Sub 待ち3種(J)
If J = 1 Then K = 0: For J = 1 To 30000000: K = K + 1: Next J: Exit Sub
If J = 2 Then Application.Wait [Now()] + 5000 / 86400000: Exit Sub
If J = 3 Then Sleep 5000: DoEvents: Exit Sub
If J = 4 Then DoEvents
End Sub

2022年08月02日

ログインしてコメントを投稿する

RSS初心者

大野様へ
動きました! 感激しております!
しかし、なぜ動くかが理解出来ないのが残念です!
 以下、大野様から教えて頂いた事から、私が理解した内容を申し上げます。

1)VBAが動作しているときは、ダウンロード出来ない。従って、ダウンロードさせるには、一旦、VBAを止める必要がある。
2)For Next文や、DoLooP,Wait等は、VBAの動作なので、VBAを止めた事にはならない。
3)OnTime メソッドは、VBAを止める事が出来る。なぜならば、予約時間が来て、設定された処理が終了すれば、次の予約時間が来るまで、VBAが止まっているから。

以上は理解できましたが、今回、大野様からの指示は、たった1カ所の追加でした。
すなわち、Sub 待ち3種(J) の中の3行目のDoEventsの挿入でした。
再度、この部分を抜き出しますと、
If J = 3 Then Sleep 5000: DoEvents: Exit Sub
ここで、Sleep 5000 まではVBA だと思いますが、、違うでしょうか?
(参考までに、この値が750あたりがエラーになるかならないかの境でした)
なぜ、Sleep と DoEventsのコンビネーションが、この問題を解決するのか
が理解できません。この辺りを解説いただければ幸いです。

2022年08月03日

ログインしてコメントを投稿する

大野 了

RSS初心者さん、こんにちは

うまく行ったようでよかったです!!


>なぜ、Sleep と DoEventsのコンビネーションが、この問題を解決するのか
>が理解できません。この辺りを解説いただければ幸いです。

まず、1~3に記載されている内容は、RSS初心者さんのおっしゃられている内容で間違いありません!!
onTimeを使用すると、RSS初心者さんのおっしゃられている通りVBAが一度止まるので、
その時に岡三RSSがデータをセルに書き出すことができます。

この時onTimeを使用せずともDoEventsを使用することでVBAを動作させつつ、岡三RSSがセルにデータを書き込む
タイミングを作成することができます。

Call 待ち3種
で岡三RSSがサーバーからデータを取得する間を待っているようですが、

>If J = 1 Then K = 0: For J = 1 To 30000000: K = K + 1: Next J: Exit Sub
>If J = 2 Then Application.Wait [Now()] + 5000 / 86400000: Exit Sub
>If J = 3 Then Sleep 5000: Exit Sub
こちらいずれも、30000000回ループしたり、5秒まったりしていますが、
DoEventsがないため、岡三RSSがセルを更新をすることができません。


>If J = 4 Then DoEvents
こちらはDoEventsの記載はありますが、上の3つと違ってそもそもWait処理が入っていないため
更新ボタンを押した直後にDoEventsが動いてしまっているため
岡三RSSがサーバーからデータを取得しきる前に、
DoEventsが動いてしまい、DoEventsが実質空回りしている状態でした。

このため、Wait処理が入っている中で、処理が一番簡単だった
J = 3 にDoEventsを追加することで今回は対応を行ったという感じです。
J=1、J=2 にDoEventsを入れても同様に動作すると思います!!

以上のような感じですが、説明になっておりますでしょうかー?

2022年08月03日

ログインしてコメントを投稿する

RSS初心者

大野様へ
おっしゃるとおり、すべてのケースの直後にDoEventsを挿入して実験したところ
問題なく動作することを確認しました!
1年以上、動作したりしなかったりで、すっきりしなかった懸案が、これでスッキリしました!
なんだか、初心者から、すこし上達したような気が致しております!
ありがとうございました!

2022年08月04日

ログインしてコメントを投稿する

大野 了

RSS初心者さん、こんにちは!!

ここら辺は普通のVBAのプログラミングと違い、
なんとも難しいところですからね・・・

なにはともあれよかったです!!

2022年08月04日

ログインしてコメントを投稿する
12

すべての投稿を表示する

to_top
to_top

アップロードされたファイルにはウイルスチェックを行っておりますが、未知のウイルス等に感染されている場合がありますので、アップロードされたファイルのご利用はご注意ください。
また、取引パスワード等の重要な情報を投稿内容に含めないようご注意ください。
なお、アップロードされたファイルの利用や投稿内容によって、投稿者自身や他の利用者が被った損害に対して当社は一切責任を負いません。

また、セキュリティの関係上、一部コマンド等を含む内容を送信するとエラー画面が表示され、投稿ができない場合がございます。何卒ご了承ください。

岡三RSS集いの広場では、複数の単語による検索が可能です。

例)関数 and サンプル
→AND検索となり、「関数」および「サンプル」を含む検索結果が表示されます。

例)関数 or サンプル
→OR検索となり、「関数」または「サンプル」を含む検索結果が表示されます。

例)関数 not サンプル
→NOT検索となり、「関数」を含むが「サンプル」は含まない検索結果が表示されます。

※and、or、notの前後は半角スペースで区切ってください。
※単語の間を半角スペースで区切るだけだと、OR検索となります。