Excel VBA – 必見!関数の引数をコンパクトにする極意
はじめに
今回はVBA上級者けの記事になります。
ある程度VBAを使いこなせるようになってくると、
関数を自由自在に作って、
処理を共通化したり、分割したりと
色々な事ができてくると思います。
そして、共通化するための引数もドンドン増えていってしまい
以下のような状態になってしまうことがありませんか?
Sub 合計計算(a As Long, b As Long, c As Long, output As Long)
そして、機能追加するために引数がまた増える。
しまいには、引数であふれて何の処理か分からなくなってしまう。
こんな経験、誰もがあると思います。
同じ関数の引数を、以下のように、
コンパクトにする極意をお伝えしたいと思います。
Sub 合計計算(vo As valuObject)
引数をコンパクトにする具体的な方法
サンプルプログラム配下の通り。
セットした変数の合計値を求める簡単な処理です。
(a+b+cを計算する)
Type valuObject output As Long a As Long b As Long c As Long End Type 'メイン Sub main() 'valuObjectを使える形にする Dim vo As valuObject '値のセット vo.a = 1 vo.b = 2 vo.c = 3 '合計の計算(a+b+c) Call 合計計算(vo) '計算結果の表示 MsgBox vo.output End Sub '計算 Sub 合計計算(vo As valuObject) '計算 vo.output = vo.a + vo.b + vo.c End Sub
実行後
1 Typeブロック
Type valuObject output As Long a As Long b As Long c As Long End Type
このブロックは、
色々な変数を格納できる箱の雛形を、
「valuObject」という名前で作るイメージです。
ここで宣言した「valuObject」のみを関数に受け渡して
関数に処理をしてもらいます。
そうすることで、関数の引数を1つだけにすることができます。
2 メイン処理
'メイン Sub main() 'valuObjectを使える形にする Dim vo As valuObject '値のセット vo.a = 1 vo.b = 2 vo.c = 3 '合計の計算(a+b+c) Call 合計計算(vo) '計算結果の表示 MsgBox vo.output End Sub
まず、Typeブロックで作った箱の雛形「valuObject」を
雛形から、プログラムで使える状態に宣言します。
ここでは、変数「vo」という名前で「valuObject」を使えるようにしました。
その後、変数「vo」が持っている変数a~cに値をセットします。
例えば「変数a」に値をセットしたい場合は、
「vo.a」のようにします。
そして、関数「合計計算」を呼ぶために、引数「vo」を設定して呼び出しています。
3 関数「合計計算」
'計算 Sub 合計計算(vo As valuObject) '計算 vo.output = vo.a + vo.b + vo.c End Sub
変数「vo」が持っている変数a~cを足し上げ
結果を変数「vo」が持っている変数「output」に設定しています。
ここで設定した、変数「output」がそのまま残っているので、
呼び出し元処理である「main」のメッセージボックスに
以下の通り、計算結果が表示されるのです。
もし、変数「d」を計算に追加したい場合、
上記のTypeブロックで変数「d」を追加すれば良い仕組みなので、
関数の引数に変数を追加する必要が全くないのです。
さいごに
このテクニックは、上級者向けのテクニックになりますが
使いこなすことができれば、
改修に強く、読みやすいプログラムを作成することができます。
ただ、使いこなすためには様々な前提知識が実は必要になります。
例えばオブジェクト指向の基本知識などです。
これらの知識については、またの機会に触れたいと思います。
─────────────── ★
中小企業診断士 かとう
専門は、IT活用による業務改善です。
★───────────────