sigebo
板情報の更新データを順次記録する。
板情報と気配値をある1行に並べています。この行を値の更新されるごとに、もしくは一定時間ごとに、最新表示行の次の行に記録することをやりたいです。
記録時間は高々1分間ほどで、可能な限りの更新頻度で記録し、記録終了後csvファイルに書きます。この操作を手動または自動で1日に数回行います。
方法1
VBAを一定時間ごとに呼び出して、記録していく方法
方法2
EXCELのみで処理する
ことが考えられますが、方法1はなんとか見通しがつきますが、excelのみで可能でしょうか。
2023年05月24日
大野 了
sibeboさん、こんにちは!!
そうですねー
あるセルの値を、他のセルに行を移動させながらコピーする場合は、VBAでないと厳しいと思います。
特に板情報の場合、同じセルが更新され続けるため、
1分前のデータが取れないためVBAでないと厳しいかと思います!!
2023年05月24日
sigebo
ご返事ありがとうございます。やはりEXcelのみでは、難しいのですね。
その後、VBAによる方法を考えていましたが、一定時間ごとにVBA関数を呼ぶのではなく、
VBAを OnTimeStart()で一定間隔で呼べばセルに時刻更新をできることがわかりました。
しかし
Sub OnTimeStart()
Call TimerProc
mOnTime = Time() + TimeSerial(0, 0, 1)
Call Application.OnTime(mOnTime, "OnTimeStart")
End Sub
のように(ネットで探した)するのでは、TimeSerialが最小1秒しか設定できないので、ちょっと不足です。
RSSの限界の100msの倍の200msくらいにしたいところです。
TimeSerial値を秒以下にする方法があれば良いのですが、できるでしょうか。
実際には先物寄り付き直前数秒間の振る舞いを調べたいのです。(先物がなくなることは承知していまして、それ故今の間にということです)
2023年05月24日
大野 了
sigeboさん、こんにちは
残念ながらOnTimeメソッドは、最短で1秒間隔でしか動作させることができません。
ミリ秒単位の処理を行わせたい場合は、
Calculateイベント等でRSSの更新が行われるタイミングで処理を行うか、
1分間永久ループさせ、その中でFBOARD関数を呼び出してデータを取得する感じになるかとー
2023年05月24日
sigebo
大野様 ご返事ありがとうございます。
ご案内のように、Calculate() イベントハンドラーなら、RSSの更新の度に起動されるので、よさそうに思えます。
それで、下記のコードで試しました。
取得情報はb7:w7にならべてあり(計19個)、それを最後の位置をA6から読み、その次の行に取得情報を転記します。そして最後の位置を更新します。
呼ばれる度に、現在時刻をa1に表示しておきます。
ところが次の問題があります。
1.VBAのプロシージャのやり方が多分まずい(VBAは慣れていません)のでしょうが、VBAのデバッグでコンパイルを実行したのち、とりあえずF9で再計算をしましたが、ハンドラーは起動されないようです。
2.RSSの更新ですが、気配値情報の取得はFQUOTE関数を並べていますが、各FQUOTE関数が実行される度なのか、一連の実行が完了したときなのかが、わかりません。前者ならちょっと多すぎて問題かと思います。
かなり込み入った質問ですが、アドバイスいただければ幸いです。
Option Explicit
Public mOnTime As Date
Private Sub Worksheet_Calculate()
Dim serial As Long
Dim lastpos, ct As Integer
Range("A1") = Format(Time, "yy/mm/dd hh:mm:ss")
Range("A1").NumberFormatLocal = "yymmdd hhmmss"
lastpos = Cells("a6")
ct = lastpos + 1
Range("b8").Offset(ct, 0).Select = Range("b7:w7").Select
Cells("a6") = ct
End Sub
2023年05月25日
大野 了
sigeboさん、こんにちは!!
>1.VBAのプロシージャのやり方が多分まずい(VBAは慣れていません)のでしょうが、VBAのデバッグでコンパイルを実行したのち、とり>あえずF9で再計算をしましたが、ハンドラーは起動されないようです。
F9を押した際に計算のもととなるセルが変わっていないためイベントが起こってないと思われます。
また、頂いたソースをworksheetにコピーしたら、再計算時にイベントが起こりましたので、
ソースは問題ないと思います。
>2.RSSの更新ですが、気配値情報の取得はFQUOTE関数を並べていますが、各FQUOTE関数が実行される度なのか、一連の実行が完了した>ときなのかが、わかりません。前者ならちょっと多すぎて問題かと思います。
再計算のイベントは、セルの更新単位でイベントが発生しますが、
再計算処理中には岡三RSSが更新できないため、重なって動作することはないと思われます。
ですが、RSSの式が山のようにあって、すべてのRSSの更新が終わる前にVBA実行が終わり、
その後、残りのRSSの更新がかかる場合、
更新される度に複数回VBAが動く可能性はあると思われます。
この部分は完全に調査をやったことがないため、
正確ではない情報の可能性もありますが、
VBAとExcelの動作の仕様からすると、上記のような動作になると思われます!!
2023年05月25日
sigebo
次のように操作しました。
1.シートにRSS関数を書く
2.VBAプロジェクトのThisWorkbookを開く。
3.自動的に挿入される行も考慮して、下記のコードを書く
4.エラーが無いことを確認(文法エラーがあるとメッセージが出る)
5.シートを開く
6.RSSを起動する
とすると、fquoteのセルは更新されますが、イベントプロシージャが書く、セルa1は更新されない(取得セルのコピーも)ので、
どうも、イベントプロシージャは実行されていないように見えます。
何が原因かご教示願えないでしょうか。
Option Explicit
Public mOnTime As Date
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
Dim serial As Long
Dim lastpos, ct As Integer
Range("A1") = Format(Time, "yy/mm/dd hh:mm:ss")
Range("A1").NumberFormatLocal = "yymmdd hhmmss"
lastpos = Cells("a6")
ct = lastpos + 1
Range("b8").Offset(ct, 0).Select = Range("b7:w7").Select
Cells("a6") = ct
End Sub
2023年05月25日
大野 了
sigeboさん、こんにちは!!
記述いただいたソースですが、やはりイベントプロシージャ自体は問題なく実行されるようです。
イベントプロシージャは正常に実行はされるのですが、
ソース中に記述を変更しないと動作しない部分があり、最後までは動作しないようです。
>lastpos = Cells("a6")
>Cells("a6") = ct
Cellsは文字列にてセル指定をすることはできないため、CellsではなくRangeを使用する
例) lastpos = Range("a6")
>Range("b8").Offset(ct, 0).Select = Range("b7:w7").Select
この部分はB7:W7を B8以降のセルにコピーされたいということでしょうか?
それであれば、そもそもSelectで代入することはできないため
Range("b7:w7").Copy Range("b8").Offset(ct, 0)
とする必要があります!!
2023年05月26日