システムトレード用の開発ツールです。エクセルのVBAを駆使して最高のパフォーマンスを目指します。基本は無料
マクロはVBAではプロシージャと呼びます。プロシージャは文章でいうところの段落部分にあたります。マクロとプロシージャの違いはマクロがエクセルの自動記録で作成されたのに対して、プロシージャは人間の手で作成されたものと理解するのが、分かり易いかと思います。
段落は一文一文で成り立っています。一文とはその文で意味が完結しているという意味です。例えば、「もし明日晴れたのなら」だけでは一文とはいえません。意味が完結していないからです。「もし明日晴れたのなら、洗濯しよう」が正しい一文です。VBAでも同じです。VBAでは完結した最少単位の文を「ステイトメント」と呼んでいます。VBAで正しいという意味は、その一文だけでもプログラムが正しく作動するということです。そして、いくつかのステイトメントをまとめて表したものがプロシージャということになります。もちろん場合によっては1文のみのプロシージャーもあります。どのステイトメントをどうやってまとめるかはその人次第です。しかし他人が分かるように、後で追跡しやすいように、効率のいいようにステイトメントをまとめる必要があります。
1つのステイトメントで1つのプロシージャの場合

これでも立派なプログラムです。実行するとタイトル通りの結果になります。
1つのプロシージャにステイトメントが2つある場合

プロシージャの名前は何のプログラムか分かるように日本語にするのがお勧め。かっこつけて英語っぽくすると後で探すのに大変になり、後悔する。タイトルで何のプロシージャか一目で分かるのがGood!
次は、1から20までの番号を振り罫線と枠線を引く作業を自動化するためのプロシージャです。前回の「マクロで日常業務を自動化する(1)」と同じ結果になるのを確認してください。

「マクロで日常業務を自動化する(1)」のマクロよりかなりシンプルになって、量も減ったのが分かります。量が減った最大の原因は、マクロ記録には「デフォルト値までも記録してしまう」という欠点があるので、結果的に長くなり、手打ちの方が文が短くみえるからです。デフォルト値というのは、例えばセルの書式のフォントだけを変えたいマクロを作った場合、フォント名、スタイル、色などのその他の設定項目まで詳細に記録されるということです。上記のプロシージャではステイトメント4から9の部分が大幅に減った部分です。このVBAはステイトメント9つで構成されています。その内1と2が数字に関するプロシージャで、残り7つは罫線に関するプロシージャです。
一般的にマクロ記録には4つの限界(欠点)があるといわれています。
1.デフォルト値が記録されて、結果的に読みにくく、量が多い分処理も遅れます。

マクロ記録の場合、セルの書式設定をする場合は、上のユーザーフォームを開く必要があります。マクロ記録中にこのユーザーフォームを開いて、フォントサイズをデフォルトの11から16に変える作業だけしたいとしても、その他のフォント、スタイルなどのデフォルト値まで記録され、結果長いコードになります。
2.無駄な操作も記録される。

上(手打ち)と下(マクロ記録)のプロシージャの実行結果は全く同じです。
3.汎用性のあるマクロが作成できない。
例えば罫線の範囲を20×20から200×200に簡単に変更出来ない。VBA(手打ち)なら変数を使うなどの対処で簡単にできます。
4.条件判断や繰り返しを行うマクロは作成できない。
これが出来るとVBAで何でもできるようになる。例えばVBAでインターネットエックスプローラさえ操作できる。エクセルでゲームも作れる。
次に上表のプロシージャを大きく3つに分けてみます。つまり数字を打つステイトメント(1と2)のステイトメントと罫線・枠線を引くステイトメント(3から9)のとそれらを合わせるプロシージャです。なぜそのような無駄をするかといえば、バラバラにしておいた方が後で使い回しが出来るからです。また更新作業、バグの修正作業などもやりやすくなるからです。例えば罫線・枠線のプロシージャの場合、もっと汎用性を高めて範囲を自在に変えれれば別のプロシージャと組み合わせが可能になるかもしれません。また数字を振るプロシージャも同じです。それに分けて方が見やすいという利点も見逃せません。
1から20までの番号を振るプロシージャ

罫線・枠線を描画するプロシージャ

「1から20までの番号を振るプロシージャ」と「罫線・枠線を描画するプロシージャ」を呼び出すプロシージャ

プロシージャから別プロシージャを呼び出す時は、「Call + 呼び出したいプロシージャの名前 」で簡単に呼び出せます。3つに分けた場合、最後のプロシージャを「親プロシージャ」、最初の2つを「子プロシージャ」と呼ぶ時があります。しかしイメージとししては、親子関係というよりも飲食店内の親方と弟子のような師弟関係といった方が理解しやすいかもしれまん。師弟関係のあるプロシージャはお互い協力し合って1つの作業を完成させます。一方で同じ作業を分担しあわないで完成させることもできます。この場合は親方1人の個人商店です。
例えば、「天ぷら御膳を作る」という作業があるとします。これを師弟関係で「天ぷら御膳を作る」という作業を完成させるとこうなります。
Sub 親方()
海老3本揚げる
ナス1本揚げる
かき揚げ1つあげる
白身魚を揚げる
Call 弟子A ’弟子Aを呼ぶ
Call 弟子B ’弟子Bを呼ぶ
End Sub
Sub 弟子A()
ご飯を盛りつける
小鉢を盛りつける
End Sub
Sub 弟子B()
刺身盛りを作る
刺身盛りを御膳にセットする
End Sub
これを親方一人でした場合のプロシージャは当然1人で全部の作業をこなすことになります。
Sub 親方()
海老3本揚げる
ナス1本揚げる
かき揚げ1つあげる
白身魚を揚げる
小鉢をセット
ご飯をセット
刺身盛りを作る
刺身盛りをセット
End Sub

投稿者 システムトレーダー壱式 : 2008年04月13日 23:24
このエントリーのトラックバックURL:
http://systemtrader.info/cgi/mt/mt-tb.cgi/86