イーサン
更新ボタンの処理が完了したことを検知する方法はありますでしょうか?
こんにちは。
以下の通り、VBAで岡三RSSの「更新ボタン」を押して、RANKING_M()等の手動関数を実行しているのですが、RANKING_M()関数
で、セルへの書き込みが完了したことを検知する方法は
ありますでしょうか。
Application.CommandBars("岡三RSS2").Controls.Item("更新").Execute
上記の関数はどうやら非同期のようで、RANKING_Mでの
セルの書き込みが完了しないうちに呼び出し元に戻ってきて
しまいます。
すみませんがよろしくおねがいいたします。
2019年04月09日
Ryo Ohno
イーサンさん、こんにちは!!
イーサンさんのおっしゃられます通り、
VBA主体でみた場合、一部の関数は非同期になっていますので、
更新処理後、全量が書き込まれる前に次の処理が動きます。
VBAを使われているとのことですので、
手動更新を行う前に、RANKING_Mが出ロするセルを削除し、
手動更新更新後、
最終セルまで表示されたたら表示完了と判断させる方法がよく使われますっ!!
2019年04月10日
イーサン
Ryo Ohnoさん、こんにちは。
回答をありがとうございます。
おかげさまで少しづつわかってきましたが、まだわからないのが
「最終セルまで表示されたたら表示完了と判断」
を具体的にどうのようにコーディングすればよいのか
わかりません。
最終セルの値が空欄でなくなるまでSleepを繰り返すと
Excelがフリーズしてしまいますし。
ご教示いただければ幸いです。
よろしくおねがいいたします。
2019年04月10日
Ryo Ohno
イーサンさん、こんにちは!!
返信が遅くなってしまい大変申し訳ありません。
イーサンさんがおっしゃれれます通り、
VBAでSleepを使うとそこで処理が止まってしまい
岡三RSSがセルに更新をかけることができません。
どのようなVBAを書かれているかわかりませんが、
もし単一VBAで、onTimeなどでマクロを繰り返す形ではないのでしたら、
DoEvnetsという関数を利用するのが一番です(というか、これしか方法がないw)
DoEvnetsというのは、一度OS側に処理を戻す関数で、
これを使用すると、OS側に処理が戻るので岡三RSSがExcel側に書き込むことができるようになります。
以下にサンプルを記述しまっす!!
A1にRANKING_Mの関数を書いておきTop10件取るようにしてあります。
(A2~A11に結果が吐き出される)
更新ボタンを押した後に、Do Until で無限ループするのですが、
その中でDoEventsを読んで、岡三RSSがセルにデータかけるようにしてあげます。
その後、RANKING_Mの関数がデータを取ってこれているか確認し
取ってこれているなら、Do Until の無限ループを抜けます。
そして後続処理のメッセージボックスが表示されるという動きです。
Private Sub CommandButton1_Click()
'A1に =RANKING_M("出来高","銘柄名","10",A2) といつ関数を入れてる
'RANKING_Mが書き出す予定のセルのクリア
Range("A2:A11").ClearContents
Application.CommandBars("岡三RSS2").Controls.Item("更新").Execute
Do Until False
'OSがイベントを処理できるようにする
DoEvents
If Range("A11") <> "" Then Exit Do
Loop
Call MsgBox("取得完了")
End Sub
ご参考になれば幸いです。
2019年04月13日
イーサン
Ryo Ohnoさん
こんにちは!
素晴らしい回答をいただきありがとうございました。
ためしてみたところ、ちゃんと取得できました。
これで所望の処理が実現できそうです。
どうもありがとうございました!
2019年04月15日
Ryo Ohno
イーサンさん、お役に立てたようでよかったです!!
また、何かありましたらご連絡頂けますと幸いです!!
2019年04月16日