スポンサーリンク

マクロ(Excel VBA) 「Application.Caller」 を使ってプロシージャを1つに統一する


マクロ(Excel VBA)で標準モジュールにコードを記述するに場合、プロシージャの数は少ない方が良いでしょう。

1つの標準モジュールの中にいくつものプロシージャがあるよりも、1つの方がすっきりします。

今日は、Application オブジェクトの Caller プロパティを使ってプロシージャを1つに統一することができる例を紹介します。

スポンサーリンク

1、原価率、利益率、売上総利益を計算するシート

シート設計

次のシートを実例として使います。

「売上」と「売上原価」を数値で入力してから、原価率、利益率、売上総利益のいずれかを計算することができるシートです。

それぞれ次のように計算できます↓

●原価率 = 売上原価 / 売上
●利益率 =(売上-売上原価)/ 売上
●売上総利益 = 売上 - 売上原価

マクロを使わなくても簡単に計算できる内容ですが、ここでは敢えて使いますね。

原価率、利益率、売上総利益で計算したい項目の実行ボタンを押せぼ、マクロが実行します。

「売上」と「売上原価」を数値で入力してから、「原価率計算」をクリックすれば、セル「E11」に原価率の計算結果が出力されます。

「利益率計算」をクリックすれば、セル「E11」に利益率の計算結果が出力されます。

「売上総利益計算」をクリックすれば、セル「E11」に売上総利益の計算結果が出力されます。

さて、これらの実行ボタンには1つのマクロ「Keisan」が登録されています。

3つのボタンに同じマクロが登録されているのに、出力される結果は異なることになります。

プログラミングコード

プログラミングコードは標準モジュールに以下のものを記述してあります。

2、「Application.Caller」の使い方

今回のプログラミングコードのポイントは「Application.Caller」です。

Application オブジェクトの Caller プロパティの値によって処理を分岐させているのです。

Application オブジェクトとは Excelアプリケーション全体を表し、Caller プロパティとはVBA を呼び出した方法についての情報を返します。

Select Case ステートメントを使って、「Application.Caller」を複数の条件に分けています。

実行ボタンの名前を、それぞれ

・原価率計算
・利益率計算
・売上総利益計算

としています。

図形を選択すると左上に、その図形の名前が表示されます。

ここで名前を変更することもできます。

VBA が「原価率計算」から呼び出された場合、原価率の計算を行い出力します。

「利益率計算」「売上総利益計算」も同様です。

3、「Application.Caller」を使うメリット

さて、今回「Application.Caller」を使うことによるメリットは冒頭にも書いたように、プロシージャを1つに統一できることです。

もし仮に「Application.Caller」を使わなかったら、実行ボタンそれぞれに異なるマクロを登録しなければならなくなります。

その場合1つのモジュールの中に次のように3つのプロシージャを作成することになります。

全てのプロシージャで同じ内容を記述しなければならない部分があり、無駄になります。

Select Case ステートメントを使って「Application.Caller」で条件分岐する方が、無駄に重複するコードを書かなくてもよいのですっきりします。

4、まとめ

「Application.Caller」を使えばプロシージャを1つに統一できるケースについて説明しました。

プログラミングコードの無駄を省き、できるだけ簡素にできる工夫は必要です。