やろまい

国立院卒の理系君。仕事でマクロ(VBA)の開発請負をやってます。金融と投資の事も。引用はご自由に。

VBAでソースコードをきれいにする方法

今回はVBAソースコードを簡易的にきれいにするテクニックを紹介します。

こんな課題に直面している人にオススメです。

  • 自分のコードが読みづらい
  • 後からプログラムを変更するのが大変で困っている
  • 今までより複雑なプログラムを作ることになった
  • 昔自分が書いたコードが今は理解できない

 

シンプルな解決策

プログラムの書き方は千差万別なので、シンプルな解決策を1つだけ紹介します。

それは、メインのプロシージャとサブのプロシージャを分けることです。

図解すると次のようになります。

 

f:id:hamahiro881477:20201216065852p:plain

 

  • メインプロシージャの役割⇒外から呼ばれること、サブプロシージャを呼び出すこと
  • サブプロシージャの役割⇒処理を行うこと

このように、自分では処理をしないメインプロシージャを作ってあげます。

各サブプロシージャを呼び出すだけなので、実行するときの窓口(インターフェース)としての役割を果たします。

 

メインプロシージャを作るメリット

①プログラムを見なくても処理が分かる

やってみると分かるのですが、メインプロシージャを用意するとサブプロシージャでどんな処理をしたいかがはっきりします。

 

≪サンプルプログラム≫

f:id:hamahiro881477:20201216065342p:plain

メインプロシージャにはサブプロシージャの呼び出しとその説明(コメント)が並ぶことになります。

 

人間の脳は、プログラムを理解するのに向いていません。

そのため、説明だけ書かれているプログラムを見る方が理解が進みます。

 

サブプロシージャを読む場合も、説明とプログラムが一致しているかを確認するだけで済みます。

 

②変更箇所を特定しやすい

プログラムに変更を加える場合も、メインプロシージャの説明を見れば、どのサププロシージャを変える必要があるか一発で分かります。

 

分割していないとプログラム全体を確認する必要がありますが、ぱっと見で変更箇所が特定できます。

 

簡単に変更できるのは、疎結合という概念とも関係しています。

気になる方はググってみてください。

 

参考文献

ここで紹介したやり方は「オブジェクト指向のこころ」のFacadeパターンを VBA向けにアレンジしたものです。

 

オブジェクト指向言語を知らない人には難易度が高いですが、 きれいなプログラム構造を作るためには、こうした本を読むことが重要です。

 

 

補足:どこで処理を分けると良いか

プログラムをどのように分けると良いか迷うかもしれないので、分割の目安を紹介します。

 

プログラムの一般的な構造は次の図のようになります。

f:id:hamahiro881477:20201216070425p:plain

  • 事前準備:ブック上のデータの初期化など
  • インプット:ブックなどからデータを取得
  • 計算:インプットデータを用いて目的の計算を実行
  • アウトプット:ブックなどにデータを転記
  • 終了処理:オブジェクトの開放など

VBAの場合だと大抵、

シート上からデータを取得⇒計算⇒シート上へアウトプット

の流れが多いと思います。

その場合、サブプロシージャを3つ作成すれば見やすいプログラムとなるでしょう。

 

※サブプロシージャ間でデータの受け渡しが必要になるので、配列を引数・返り値としてバトンリレーしていく必要があります。

配列を引数として使用する時の注意点の記事を参考でリンク貼っておきます。