【重要】本記事のご利用にあたって(免責事項)
本記事は、Excel VBAを用いたプログラミング検証および外部アドイン連携に関する個人的な技術備忘録です。特定の金融商品の売買推奨や投資助言を行うものではありません。
株式等の金融取引には資産の損失を伴う重大なリスクが存在します。安易なコピペ実行による誤発注を防ぐため、サンプルのExcelファイルや完全なモジュールコードの配布は行っておりません。
掲載内容を参考にされる場合は、仕組みをご自身で十分に理解された上で、すべて自己責任において検証・ご利用ください。プログラムの実行によって生じたいかなる損害・損失についても、当サイトおよび管理人は一切の責任を負いかねます。
Excel VBAを長年使い込んできた中で、これまでの経験でも一二を争う「超高難度のトラブル」に遭遇しました。
ロジックは絶対に合っているはずなのに、なぜか意図通りに動かない。しかも恐ろしいことに、エラーメッセージすら出ずに処理がスルーされてしまう「静かなエラー」でした。
今回は、仕事や介護の合間を縫って長年温めてきた「楽天RSS×VBA自動発注システム」の開発で直面した手強い罠と、書籍やネットにも載っていなかった解決策をAIとの対話で突き止めたリアルな体験談をお話しします。
1. 昔から知っていたのに…「仕事と介護」の合間に温めていた夢
私はかなり前から株式投資の経験があり、これまでも楽天証券の「マーケットスピード(1・2)」やスマホアプリの「iSPEED」を使って手動での売買を行ってきました。
実は、楽天証券に口座を開設した当初から「楽天RSSを使えばExcelで自動売買や戦略的な取引ができる」ということは知っていました。
しかし、日々の仕事や家族の介護に追われる中で、じっくりとVBAやRSS関数を腰を据えて勉強する時間がなかなか取れず、気づけば何年も時間が経過してしまいました。
今振り返ると「もっと早くに取り組んでおけばよかった…」という思いもありますが、多忙な日々の中でずっと温め続けてきた大切なチャレンジでもありました。
2. 手動から「Excel」へ!セル参照からモジュール完結への挑戦
画面を見ながら手動で注文を入力するよりも、Excelを使ってより戦略的に、細やかな条件を設定して売買を行える点に大きなメリットを感じていました。
開発の初期段階では、エクセルのシート上に配置したセルを参照する形(セル参照)で処理を組んでいました。しかし、より「処理の高速化」や「実行の効率化」を追求していく中で、「シートを介さず、VBAのモジュール内だけで処理を完結させたい」という思いが強くなっていったのです。
しかし、モジュール完結を目指してコードを組み替えた途端、原因不明の深いトラブルにぶつかりました。
3. 一番手強い…エラーすら出ない「静かなエラー」との過酷な闘い
関数の動作確認には様々なアプローチがありますが、今回は大切な資金がかかっているだけに、現物取引かつ少額での「実弾テスト」を何度も重ねながら慎重に検証を進めました。
そこで立ちはだかったのが、「エラーコードすら返ってこない静かなエラー」でした。
プログラムが途中で止まってエラー行を教えてくれるわけでもなく、ただ静かに処理がスルーされ、意図しない挙動をしてしまうため、どこに原因があるのか全く手がかりがつかめません。
ネット検索はもちろん、手元の専門書や公式サイトのドキュメントを隅から隅まで探しましたが、求めている解決情報はどこにも見当たりませんでした。「なぜ動かないんだ…」と何時間もパソコンの前で格闘し、途方に暮れる時間が続きました。
4. 書籍にもない答え——救ってくれたのは「AI」と「丸括弧 (( ))」の魔法
あきらめずにAIとの対話を重ね、コードの挙動やデータの引き渡し部分について細かく相談を続けていた時、AIから思わぬ解決策が提示されました。
「引数を渡す際、各引数を丸括弧 ( ) で囲むと、強制的に『値渡し(ByVal)』になります」
配列の要素などを渡す場合、見た目としては ((引数)) や (p(1)) のように二重括弧のような形になります。
「えっ、変数を括弧でくくる…!?」
半信半疑で、該当する引数の部分を書き換えて実行してみたときの実際のコード画面がこちらです。
【実際のVBEコード画面】
(※画像:Application.Run("RssStockOrder_v", (p(1)), (p(2)), ...) のキャプチャ)

【あえて画像のみで掲載している理由】
お金に関わる実弾取引のコードであるため、安易なコピペによって前後の変数定義が噛み合わず誤発注を起こしてしまうリスクを防ぐ目的で、あえてテキストコードではなく画像キャプチャでの掲載としています。前後の配列やロジックをご自身で理解・構築できる方のみ、設計のヒントとしてご活用ください。
この書き方に変更して実行してみたところ——
エラーを吐くこともなく静まり返っていた処理がパッと通り、見事に狙い通りの自動発注ロジックが動き始めました!
どんな検索エンジンや専門書を探しても出てこなかった答えを導き出してくれたAIには、本当に感謝しかありません。
5. なぜ「括弧囲み」で動くのか?(VBAの隠れた仕様)
VBAでは通常、プロシージャ呼出時の引数は「参照渡し(ByRef)」がデフォルトになるケースが多いです。
しかし、引数を (arg) や (p(1)) のように丸括弧で囲むと、VBAコンパイラはそれを単なる変数ではなく「式(Expression)」として評価しようとします。
その結果、式の評価結果という「新たな値(一時的なコピー)」が別メモリに生成されるため、プロシージャ側の定義に関わらず実質的な強制値渡し(ByVal)として処理されるというVBA特有の仕様が存在します。
楽天RSSのような外部COMアドイン関数とのデータ受け渡しにおいて、メモリのアドレス(参照)ではなく「実データ(値そのもの)」を要求されていたため、この「式評価による値渡し」が不可欠な場面だったというわけです。
6. 慎重な「少額実弾テスト」を経て…目指すは億り人!
長年VBAを使ってきましたが、このような挙動に遭遇したのは初めてで、過去最高難度の手強さでした。だからこそ、試行錯誤の末に実弾環境で思い通りに動いた瞬間の嬉しさは言葉になりません。
今回の突破により、自動発注システムの最もコア(要)となる部分が完成しました。
なお、株式投資や自動売買は大切な資産に関わることですので、損失等のリスクや責任を考慮し、作成したモジュール全体のコードやExcelファイルの配布は控えさせていただきます。
また、Excelでシステム化・自動化したからといって、必ずしも勝率アップや利益につながるとは限らない点をご理解ください。株で利益を得るのは非常に難しく、資金管理やリスク管理が何より大切です。
しかし、長年温めてきた夢が動き出し、ここが本当のスタートラインです。ここからさらに改良を重ね、納得のいくシステムへと育て上げていきます。目指すは「億り人」!諦めずに粘り強く壁を乗り越えたこの経験を糧に、一歩ずつ進んでいきたいと思います。
(※本記事は個人のプログラミング体験および検証に基づく技術情報です。手続きや外部連携の詳細は公式のドキュメント等をご確認いただき、投資への活用・リスク管理はご自身の責任と判断において行ってください。)


