yosi707
板表示ををリアルに動かす方法
初めまして、こんにちは。yosi707と申します。
以下は225ミニの売3本買3本の板表示をするためのプロシージャです。
Sub fboard_sanple()
Range("D1") = "= FBOARD(""N225mini"", 202209, ""売気配数量3"")"
Range("D2") = "= FBOARD(""N225mini"", 202209, ""売気配数量4"")"
Range("D3") = "= FBOARD(""N225mini"", 202209, ""売気配数量5"")"
Range("E1") = "= FBOARD(""N225mini"", 202209, ""気配値3"")"
Range("E2") = "= FBOARD(""N225mini"", 202209, ""気配値4"")"
Range("E3") = "= FBOARD(""N225mini"", 202209, ""気配値5"")"
Range("E4") = "= FBOARD(""N225mini"", 202209, ""気配値6"")"
Range("E5") = "= FBOARD(""N225mini"", 202209, ""気配値7"")"
Range("E6") = "= FBOARD(""N225mini"", 202209, ""気配値8"")"
Range("F4") = "= FBOARD(""N225mini"", 202209, ""買気配数量6"")"
Range("F5") = "= FBOARD(""N225mini"", 202209, ""買気配数量7"")"
Range("F6") = "= FBOARD(""N225mini"", 202209, ""買気配数量8"")"
End Sub
これを一度走らせればあとはリアルに動いてくれるのですが、同じモジュールのその下に売買プログラムを書いて動かすと
残念ながら止まってしまいます。そのままリアルに動かしてそのデータを参照し、エクセル上だけで仮想売買をしてみたいのですが、
何かうまい方法があったらご教授ください。
2022年08月24日
大野 了
yosi707さん、こんにちは!!
止まってしまうとのことですが、
こちらはVBA実行中にFBOARDの更新が止まってしまうということであってますでしょうかー?
もしそうであれば、VBAがDo Loop などで永久ループされていませんでしょうか?
残念ながらVBA実行中はExcelがVBAの動作を優先させるため、
VBAが実行されていると岡三RSSのデータ更新がかからない状態となってします。
もし、do loop などでマーケットが空いている時間ずーとループしている形ですと
一つのVBAが動き続けており、岡三RSSがデータをセルに更新するタイミングがなく
止まったように見えてしまいます。
VBAと岡三RSSをの動作を並行して動作させたい場合の対処方法として、以下の二つの方法があります。
・onTimeメソッドを使用してメインのPGを繰り返い動作させる方法(こっちがベスト!!)
・DoEventsをDo Loopの中に書いてあげる方式
〇onTime
onTimeメソッドは、指定したマクロを指定した時間に実行させる関数となります。
この機能を利用して、メインで処理しているプロシージャを繰り返し呼び出すことにより
Do Loop と同様な動作を確保しつつ、岡三RSSがデータを更新できるようになります。
以前いただいた質問のリンクで大変申し訳ございませんが、こちらを見て頂けますと幸いです。
https://bbs.okasan-online.co.jp/ont/rss/board/?page=1&topic_id=258#comment_1385
デメリットとしては現在のVBAの内容次第では大きく変更が必要な場合があります。
〇DoEventsの場合
DoEventsはVBA実行中でもExcelなどにほかのイベント処理(岡三RSSの更新など)を強制的に行わせる関数となります。
以下のように Do Loopの中にDoEventsと書くだけで
VBA実行中でも岡三RSSが動作できるようになります。
VBAを修正せずに済むので簡単ですが、
デメリットとしては、Excelのそのほかのボタンも動かすことができてしまうため、
VBAが止まってしまうような動作を間違ってやってしまって
VBAが止まってしまうことがあります。
Do xxxxxx
DoEvents
処理
Loop
onTimeはわかり辛い点も多いと思いますので、もし説明不足な場合はまたご連絡頂けますと幸いです!!
2022年08月25日
yosi707
大野さんありがとうございます。マイクロソフトは推奨していないというGoTo文を使って回しています。
昔N88BASICなんてのをやっていたので、その名残です(苦笑
そうでしたか、これからじっくりやってみます。Sleepを使って隙間をあけたら動くかなあと思ったのですが、ダメでした。
まだまだ勉強不足です。また報告します。
ありがとうございました。
2022年08月25日
大野 了
yosi707さん、こんにちは!!
N88BASICですかー
めっちゃ懐かしいです!
子どものころ使ってました!!
あのころとは、いろいろと状況が異なりますが、
正常に動作するようになることを祈っております!!
2022年08月27日
yosi707
N88をこどものときですか。すごい(^^;
ontime,sleep,waitなどをループの中に入れて試してみましたが、だめですね。止まってしまいます。
vbaを止めると動き出します。fcandleもその都度呼び出していますので、その関係ですかね?
うーむ、実売で試すしかないでしょうか。なにか名案があったら、お願いします。
2022年09月01日
yosi707
すみません、doeventsもだめでした。
2022年09月01日
大野 了
yosi707さん、こんにちは!!
N88は、本を買ってめっちゃ触ってました!!
>ontime,sleep,waitなどをループの中に入れて試してみましたが、だめですね。止まってしまいます。
ontimeですが、こちらはループの中に入れるのではなく、ループ自体をなくす作りに変更する必要があります。
GoTo分を使用されているとの事ですので・・・
Sub Trade()
StartProc:
If Now > 15:00
GoTo EndProc
End If
メインの処理
GoTo StartProc
EndProc:
End Sub
こんな感じの処理かと思われます。
これですと、VBAが終わらないため岡三RSSが動かせないため・・・
これを・・・
Sub Trade()
メインの処理
If Now <= 15:00
NextTime = Now + TimeValue("00:00:01")
Call Application.OnTime(NextTime, "Trade")
End If
End Sub
のように作り替え、メインのロジックからループを除外し、
15時までは自分自身をもう一度呼び出す形にすることで
一旦、VBAが終了しますので岡三RSSが更新できるようになります。
とはいえ、一つ気になるのは
DoEventsはループしていても岡三RSSが更新できるようになるので、
こちらは動いてもよさそうな気がするのですが・・・
もしかすると別要因もあるかもしれません。
2022年09月01日
yosi707
前文はその通りです。CDateを使って、午後の時間帯は空回りさせています。さすがですね。
後文は自分で自分を呼び出すですか。そういう発想をしたことがありませんし、当然やったこともありません。
一見形を変えたループにも見えてしまうのですが、ループではないわけですね。まだアタマがついていってません。
doeventsですが、ストップボタンを作ってまして、それを受け入れるのに使用しています。使わなくともいいのですが。
ネット上の例文にあったものですから、そのまま引用してます。1種類でしか使えないのですか。
だとすれば、まだまだ理解が足りないですね。もっと勉強します。
2022年09月01日
大野 了
はい、yosi707さんのおっしゃれます通り、繰り返しますのでループ処理となります。
do loopやGoToで回し続けてるのと違いは、
処理ごとに、いったんサブプロシージャを終わらせることができるので
RSSがシートを更新するタイミングを作り出すことができます。
(次のサブプロシージャが呼ばれる間にRSSが更新できる)
何かありましたら、またご連絡頂けますと幸いです!!
2022年09月03日
yosi707
まだまだエクセルVBAについて、理解が足りないですね。
勉強します。ありがとうございました。
2022年09月05日