Excel VBAで自動売買ロボットを作成する際に必要となってくるVBAコーディングやVBE操作の為にはプロジェクト、モジュール、そしてプロシージャについてのアウトラインを把握しておく必要があります。
VBAの基礎についてはわかりやすく説明されているHPがいくつもありますので詳細についてはそちらに委ねるとして、本稿ではロボットファイルを作成する際に最低限必要と思われる知識についてさらっとまとめておきます。
プロジェクト、モジュール、プロシージャの関係を簡単に表すとプロジェクトを最上位としたピラミッド構造になっています。
最下層のプロシージャから順に説明していきます。
プロシージャーとは?
プロシージャとはマクロの最小実行単位である機能を実現するためのVBAの命令文(ステートメント)や関数等の集合体のことです。
他言語を知っている方はルーチンの方がしっくりくるかもしれませんね。
プロシージャには下記の3種があります。
・Subプロシージャ
・Functionプロシージャ
・Propertyプロシージャ
3番目のPropertyプロシージャに関しては、運営者、使用したこともなく、かつ調べる元気もないので申し訳ありませんが説明は割愛させていただきます。m( )m
Subプロシージャとは?
3種の中で一番ポピュラーなプロシージャです。
Subプロシージャの書式
Private/Public/Friend Static Sub プロシージャ名(引数1 As データ型、引数2 As データ型、・・・)
処理内容
End Sub
Privateを指定すると、本プロシージャを呼び出せるプロシージャは本プロシージャと同じモジュールに存在するプロシージャに限定されます。
Publicを指定すると、同一プロジェクト内のどのモジュールからでも呼び出し可能です。
Freindを指定すると、同一プロジェクト内のどのモジュールからでも呼び出し可能となりますが、Freindをつけられるのはクラスモジュール内だけです。
Staticを指定すると、プロシージャで使用した変数の内容は保持され、次に呼ばれた時に、保持された値が変数の初期値となります。
通常はこれらのワードは省略され、PublicでStaticではないプロシージャとして定義されることがほとんどです。
Subプロシージャの呼び出し方
プロシージャを呼び出す際にはCallステートメントを使用します。
書式は
Call プロシージャ名
Callは省略可能ですが、Callはあった方がプロシージャと視認しやすいので省略しない方がベターかと思います。
Functionプロシージャとは?
Subプロシージャと同様の使い方ができますが、Subプロシージャとの大きな違いは呼び出し側のプロシージャに値(戻り値)を返すことができるという点です。(※)
その特性を生かしてオリジナルの関数を作成することも可能で、作成した関数はワークシート関数としても使用可能となります。
※Subプロシージャには戻り値はありませんが、引数を参照渡し(Byref)指定にして呼ぶ側と呼ばれる側で変数を共有し呼ばれる側の処理結果を変数にセットするようにすればSubプロシージャでも呼ばれる側の処理結果を得ることは可能です。
Functionプロシージャの書式
Private/Public/Friend Static Function プロシージャ名(引数1 As データ型、引数2 As データ型、・・・) As 戻り値のデータ型
処理内容
プロシージャ名= 戻り値
End Function
Private/Public/Friend StaticについてはSubプロシージャの項を参照願います。
Functionプロシージャの呼び出し方
戻り値なしの場合と有りの場合とで呼び出し方は異なります。
●戻り値なしの場合は
Subプロシージャと同様で
Call プロシージャ名
です。
●戻り値有りの場合は
呼び出し側で
戻り値を代入するオブジェクトを設定し、そのオブジェクトにプロシージャ名()を代入します。
コーディング例です。↓
プロシージャの引数について
全てのプロシージャには引数を引き渡せます。
ここではSubプロシージャという前提で説明していきます。
引数がある場合の書式は
Sub プロシージャ名(Optional ByRef/ByVal ParamArray 引数1 As データ型= 規定値、・・・)
処理内容
End Sub
Optionalを指定すると、引数が省略可となり、呼び出し側で該当の引数の記述を省略できます。
規定値を記述しておけば省略された場合その数値が使用されます。
引数は値でも変数でも引き渡し可能です。
変数を引き渡す方法には2種類あります。
参照渡しは変数そのものを引き渡す方法でByRefを指定します。
値渡しは変数に格納されている値のみを引き渡す方法でByValを指定します。
ByRef/ByValの指定がない場合は参照渡しです。
Subプロシージャには戻り値はありませんが、参照渡しを使えば、呼ばれたプロシージャ内での処理結果を呼び出し側のプロシージャが得ることも可能です。
変数が変更されては困る場合は値渡しで引き渡します。
最後の引数にはParamArrayを指定でき、任意の数の引数を配列で受け取れます。
モジュールとは?
モジュールは一言で言えばプロシージャを記述し保管しておく場所です。
モジュールには下記のような種類があります。
・シートモジュール
・ブックモジュール
・フォームモジュール
・標準モジュール
・クラスモジュール
VBEのプロジェクトエクスプローラーを見てみましょう。↓
(注)上の図ではBook2下に全種類モジュールが表示されていますが、新規のブックの場合、最初に表示されるのはSheetとThisWorkBookだけです。その他のモジュールは挿入タグで選択して表示しています。
Microsoft Excel Objects下に
sheetとThisWorkBookがぶら下がっているかと思いますが、sheetがシートモジュールでThisWorkBookがブックモジュールです。
この2つのモジュールは主にイベントプロシージャ記述用に設定されているモジュールです。
イベントプロシージャとは、例えばブックを開くとか閉じるとかのイベントをトリガーとして実行されるプロシージャのことです。
イベントプロシージャはロボットファイルにも使用すること(例えば、ファイルの立ち上げをロボ起動のトリガーとしたい場合等)がありますので詳細については後日別稿でまとめてみたいと思います。
フォームモジュールはユーザーフォームに設置したボタンが押下された時に起動するプログラム等を記述する場所です。
標準モジュールがコーディングの際に一番使用すモジュールです。
冒頭の関係図を見るとプロシージャの上位に位置しているのでモジュールがプロシージャをコントロールしているようなイメージを受けてしまいますが、コーディングフェーズでモジュールを意識することはほとんどありません。(モジュールの宣言セクションで変数をPrivateで設定した場合は該当モジュール内のプロシージャでのみその変数は有効ですので、その辺で多少は意識しますが。)
モジュールのことを一番意識しなければならないのは設計段階です。
どのようにモジュールを分割すれば全体的な構造をイメージし易いか、そして作成したプロシージャはどのモジュールに格納すれば開発しやすいのか等を十分に検討しておく必要があります。
標準モジュールをどう管理するかで開発効率に大きな差異が出てきてしまいます。
1プロジェクトで管理するプロシージャが少ない場合であれば1つの標準モジュールに全てのプロシージャを格納してしまっても問題はないかと思いますが、多くのプロシージャをコントロールしなければならない場合は、1つの標準モジュールに全てのプロシージャを格納することは避けておいた方がベターです。
プロシージャ構造をイメージしにくいですし、修正対象プロシージャを探し出す際にも余計な時間がかかってしまいます。
モジュール分割はこうあるべしというような決まったものはありませんが、プロシージャ構造図を参考に機能やプロシージャ間の関連性に着目してモジュールを設定する方法が自然な流れかと思います。
ロボットファイルという前提で1例を示しておきます。
仮に作成しようとしているロボットファイルのプロシージャ構造図が上の図のような状態であったとすれば、
コントロール(赤)
開始処理(ピンク)
メイン処理(ブルー)
終了処理(グリーン)
A証券注文発注(橙)
B証券注文発注(薄いグリーン)
C証券注文発注(茶)
共通ルーチン(黄)
のような単位でモジュールを設定すれば処理の流れや機能をイメージし易いのではないかと思います。
※共通ルーチンとは時間待ちや年月関連のルーチンでどのプロシージャからも呼ばれる可能性のあるプロシージャです。
最後のクラスモジュールについては今まで使用したこともなく全く不案内ですのでここでの説明は省略させていただきます。たぶん相当高度なことをしようとしない限り必要ないのではと勝手に思っています。
プロジェクトとは?
プロジェクトは各種モジュールを統括管理するものです。
VBA構成の最上位に位置する概念でイコール1ファイル(ワークブック)と捉えておいて問題はないと思います。
これから作成しようとしている1ロボットファイルが1プロジェクトに該当します。
まとめ
以上がプロジェクト、モジュール、プロシージャについてのアウトラインです。
ロボファイルを作成する場合は、SubプロシージャとFunctionプロシージャの基本的な使い方とモジュールはプロシージャ構造図を意識して設定するということ、この2点さえ押さえておけば十分です。