エクセルVBAでクラスモジュールを使う  【第1回】標準化がしやすくなる(プロシージャの例---"外枠+格子線を引く")

クラスモジュールを使うと標準モジュールやフォームモジュールにベタ打ちするよりも見やすくなった

標準モジュールやフォームモジュールだけでもいろいろできるので、クラスモジュールの存在は知りつつも使ったことはありませんでしたが、試してみたところ便利そうだったので使うことにしました。

クラスを使わずにコーディングすると、
1.コーディングがベタで長くなり、処理の流れを追うのが大変
2.データのコピー・削除・ソートといった作業のたびに同じことを
  何回もコーディングすることになり、さらに長くなる
3.同じ作業でも、その時の気分で書き方が変わってしまい、
  統一感がなくなる

クラスモジュールを使うと、
1.処理フローが箇条書きのような感じでわかりやすい(下の図1参照)
2.クラスに汎用的にプロシージャを作ることで引数変更で使い回し可
3.修正が必要な時、そのプロシージャの修正だけで済むことが多い

クラスを使う時にインスタンス化という手順が必要ということですが、
”Dim クラス名 as New クラス名"を、モジュール内に記せば使え、プロシージャの中でも外でも大丈夫ですので、私は外に書くことにしました。

図1)フォーム上のボタン(CommandButton1)をクリックすることで起動するものですが、
インスタンス化をSubプロシージャの外に記述しています(2,3行目)。こうすることで
   プロシージャ内にその都度、記述しなくても「クラス名.プロシージャ名」で実行できます。

図1の1~6の作業は、クラスからプロシージャを呼び出して実行しており、処理の流れを追いやすくなっています。詳しく見たい時は、それぞれのプロシージャの中身を見る。クラスを汎用と専用に分けていますが、汎用は引数を入れ替えて使い回しができるもの、専用は特定の処理に特化したものにしています。


図2)ボタン"MANEX TRADER Excel連携開始"が図1の
プロシージャを実行するCommandButton1です。
図3)この"RefSheet"を元に、"MainSheet"(図4)をアップデートしています


図4)MainSheetです。B列の証券コードを検索キーにして、マネックストレーダーと
    連携したManexTraderRealtime.xlsmのsheet1をコピーした図3のRefSheetから株価を
    とってくるVLOOKUPの式をF列~J列に、D列に=F列-H列の式を、E列に=F列-G列の
式を汎用クラス内のプロシージャでそれぞれ組み立てています。    
図5)MainSheetの、セルD2に"Col_A_iqual_B_minus_C”というSubプロシージャで、
      セルF2に"GenVlookup"というSubプロシージャで、引数を元に、それぞれの    
式を組み立てています。                     

MANEX TRADERのExcel連動機能で作成されたエクセルブックManexTraderRealtime.xlsmと同じエクセルから開いたエクセルブックのシートにコピーすると、そのブックも連動しますので、この処理では以下の3つのシートは、東証が開いている9時~15時までリアルタイムで価格が表示されます(但し、11:30~12:30の休憩時間には止まっています)
・ManexTraderRealtime.xlsmのsheet1
・バックテスト1.xlsmのRefSheet --- 上記のsheet1をコピーしたもの
・バックテスト1.xlsmのMainSheet --- RefSheetからVlookupでデータを
                 持ってきているもの


クラスに汎用的なプロシージャを作っておくことで、別のプログラムを作る時もブック内にクラスをコピーしておき、プロシージャの引数を入れ替えて 実行することで工数削減にもつながります。

以上、【第1回】は、私が今トライ中の、「どうすれば、コーディングが見やすくなり、また作業工数を削減できるか」について、ザックリ説明させて頂きました。

ややこしい処理も、簡単な処理に分解して、それらを組み合わせて実行するようにすることで、後で見て「これ、何をやってたんだっけ?」と悩むことを減らせるようにしたいと考えています。私の場合、主に株トレードで役立てるためにVBAを使っていますので、データは株関係が多くなりますが、汎用的なプロシージャは、株以外でも使えます。

参考までに、私が作成した”引数で指定したセルを含む範囲に実線(細)の外枠と格子線を引く” 汎用クラス内のプロシージャを以下の図6に記します。RefSheet、MainSheetのアップデート時にも使っています。
実行する時は、Call 汎用.FrameGrids("A1", "実線") です。
CurrentRegionを使っていますので、A1は、A1でなくても、線を引きたい範囲のセルであればどこでもOKです。

図6)外枠と格子線を引く汎用クラスのプロシージャ


図7)クラスモジュールを専用と汎用に分けています。

【第2回】以降は、私が作成した汎用クラス内のプロシージャの中身について具体的に説明してゆきたいと思います。バグがあれば都度、修正していきたいと思います。


この記事が気に入ったらサポートをしてみませんか?