かぶのすけ
VBS経由でマクロ実行時のデータ取得ができない件
いつも困ったらこちらを拝見して勉強させていただいています。今回初めて質問させていただきます。
エクセル2016.windows11にて岡三RSSCFDを利用して、240分足の始値、高値、安値、終値、取引数量、建玉数量を取得、別シートへ転記するマクロを書きました。
既存の足データを一度全てClear contensし、
その後DoEventsとDo loopにてRSS側から再度データを取得させる仕組みにしました。
A
全て手動で
1.ネットトレーダー株365を起動→2.エクセルを起動+同マクロを含むファイルを開く→3.マクロ実行
とすると問題なく転記することができました。
こちらを自動化するためにVBSを書いて
B.
1,手動でネットトレーダー株365を起動→
2.VBSにてエクセルを起動+同マクロを含むファイルを開く3.同VBSにてマクロ実行
とするとうまく転記できません。
動きを見てると既存のデータを消した後に再度データが埋まらずにそのままマクロが走ってしまい、最新データを取得できない様です。
AとBの違いはVBSで実行するかしないかだけなのに、なぜこの様になるのか分からず1ヶ月近く試行錯誤していましたが、自力ではお手上げです。具体的にはVBA上で、wait.sleep.CalculateなどとDoEventsの組み合わせを追記してみたり、
VBS上でSleep 3000を散りばめたりしてみましたが、なんとも解決しません。
どうしたらVBSからでもうまくデータを取得させられるのでしょうか?
2024年03月02日
かぶのすけ
excel_macro_exec.xlsx (486B)
と思いましたが、vbsファイルをxlsxファイルにエクスプローラー上で変えたらUPできましたので添付いたしました。
よろしくお願いいたします。
2024年03月20日
大野 了
かぶのすけさん、こんばんは
ファイルありがとうございます
xlsm、vbs共に正常にダウンロードできました。
大変申し訳ございません。
本日、少し忙しいので、木曜日か金曜日に確認したいと思います!!
しばらくお待ちいただけますと幸いです!!
2024年03月20日
大野 了
かぶのすけさん、こんにちは!!
原因が分かりました。
というか、元々知っていたんですが、完全に忘れてしまっていました(ごめんなさい
かぶのすけさんが、VBSで使用されているCreateObjectは『COM形式』と言いまして、
この形式で起動したExcelでは"岡三365CFD"が正常に動作しません。
これを回避するためには、shellというものを使ってExcelを起動しないといけないのですが、
この形式で動かすと岡三CFDは正常に動作sるのですが、外部からマクロを実行することが非常に面倒です。
※現在VBSで、objExcel.Application.Run"時間記入" とされている部分です
これを回避するためには、WorkbookのOpenイベントでマクロが自動で実行されるようにするのが
一番手っ取り早いのですが、これだとVBSからではなく手で起動した際にもマクロが動いてしまいます。
このため、もしExcelを起動しっぱなしでよければ、onTimeをお勧めします!!
もし、何かしらのご都合でExcelの起動しっぱなし自体が厳しい場合は、また、ご連絡いただけますと幸いです。
なんか考えてみます!!
※一応、現状で動くソースコードを記載しておきます
VBS
==========================================
Option Explicit
Dim objShell
Set objShell = CreateObject("WScript.Shell")
objShell.Run "excel F:\SynologyDrive\myfile\個人\自動起動.xlsm"
set objShell = nothing
==========================================
Excel (ThisWookbook に追加してください)
==========================================
Private Sub Workbook_Open()
Call Run("時間記入")
End Sub
==========================================
2024年03月21日
大野 了
ご参考になれば幸いです!!
2024年03月21日
かぶのすけ
大野様
解決方法を示していただきありがとうございます!自分だけでは到底たどり着けない答えです。『COM形式』とShellといったものを初めて聞きました。Shellで起動して、マクロ自体はオープンイベントで実行させるのですね。承知いたしました!!
実は、エクセルの起動しっぱなしは、パソコンが100%自分の物ではなく家族と共有なので、(とはいっても90%以上は私が使っているのですが)家族が使うときにエクセルが開きっぱなしだと、少々不都合が生じます。
また、エクセル開きっぱなしを想定していなかったので、その後の自動売買計画(マクロのつくり)を練り直す必要があります。
ですので、ご教示いただいた「現状で動く方法」とは別に、「外部からマクロを実行すること」も検討したいのが本音です。
非常に面倒とのことでしたが、どれぐらい面倒なのかが身に染みてないのでこのようなことを申し上げてしまっているのですが、
方法があるのでしたら、ぜひともご検討、ご教示いただきたいです!!!
教えていただいているのに申し訳ありません。ご検討いただけますでしょうか?
2024年03月22日
大野 了
test.xlsx (1.2KB)
かぶのすけさん、こんにちは!!
なるほどー
共用のPCだと開きっぱなしは厳しいですねー
いろいろと考えてみたのですが、WSH(VBS)縛りだと制限が多く・・・
いろいろと面倒だったので、キー操作をエミュレーションするやり方でやってみましたー
添付しましたサンプルは『自動起動.xlsm』のマクロは使用せず、すべてVBSだけでやっていますので、
サンプルのVBSで良ければ『自動起動.xlsm』のマクロは削除してしまっても問題ありません。
もし
『できるだけマクロでやりたいぜ!!』
ということでしたら、
『チャートシート選択(27行目)』から 『RSS時系列データ取得待機(50行目)』のRSSのデータ取得の部分と
『保存と終了(70、71行目)』だけをVBSで行うと、RSSのデータ取得は動きますので、
後は、もともとかぶのすけさんが作られていた、
CreateObject(COM形式)でもう一度Excelを起動してRunでマクロを動かせば良いと思います!!
ご参考になれば幸いです!!
また、もしわかり辛い点がありましたら、再度ご連絡いただけますと幸いでーす!!
※自分も拡張子をxlsxに変えていますので、vbsに変更していただけますと幸いです!!
2024年03月23日
かぶのすけ
大野様
ご教示ありがとうございます。
先日はバタバタしてしまい、確認作業ができなかったのですが、確認出来次第結果をご報告させていただきます!よろしくお願いします!
2024年03月27日
かぶのすけ
大野様
1OnTime
2VBS(Shell)×AUTOOPEN、
3VBS(Shell)×エミュレート(+マクロ)
確認検証させていただきました。
3は複数銘柄にわたってループ処理をしていくときにコードを冗長にするか、マクロとVBSの切り替えを頻繁にすることになり、私には管理が難しそうでしたので、
2で考えていきたいと思います。AUTOOPENを発動させずに開く方法を見つけましたので、それも使いながら、自分のシステムをまた作っていきたいと思います。
1もすごく良かったので、最終手段はそれにしようかと笑
教えていただいて本当にありがとうございました!!
2024年04月05日
大野 了
かぶのすけさん、こんにちは!!
1のonTimeが一番安定はするのですが
やっぱりExcelをあげっぱなしにしないといけないので、
何か別の方法で解決できるのであれば、それもよさそうですねー
なにはともあれ、少しでもお役に立てたようでよかったです。
また、何かありましたらご質問いただけますと幸いです!!
2024年04月05日