VBA にはサブルーチンやワークシートで呼びだすことのできる Function プロシージャ(ユーザー定義関数) を作成することができます。Function プロシージャはサブルーチンで呼び出すこともできるし、ワークシートで Excel 関数のように振る舞います。要するに自作の Excel 関数のようなものです。
「こんな関数いいな♪ できたらいいな♪」
と思いついたら、自作してしまえばいいのです。すごいですね~。わんだふるですね~。ふぁんたすてぃっくですね~。そんなわけで、Function プロシージャ(ユーザー定義関数)の作り方を説明しますよ~。
Function プロシージャ(ユーザー定義関数)
Function プロシージャ(ユーザー定義関数)とは、何かの値を返すマクロです。値といっても、必ずしも数字のことだけでなく、文字列なども含むのですけど、要するに入力した値を足し算したり、入力した文字列を並べ替えたりして、その結果を返すということです。
一方で、セルを選択したり、シートをコピーしたりするような Function プロシージャはつくれません。そういうのは普通のサブルーチンでつくってください。
何はともあれ簡単な関数を作ってみましょう。立方体の「縦」「横」「高さ」の値を入力して体積を求める Function プロシージャです。
'[VBA] 立方体の体積を求めるFunctionプロシージャ
Function CUBE(a As Double, b As Double, c As Double) As Double
CUBE = a * b * c
End Function
Function プロシージャを作成するときは、Sub ではなく、Function というステートメントでコードを書き始めます。結びは End Function です。上の例では CUBE が関数名です。( ) の中にはユーザーさんが入力する引数の変数名とデータ型を書いておきます(データ型を省略すると Variant 型になります)。上の例では a, b, c が変数名で、すべて Double 型にしてあります。そして ( ) の後ろには、戻り値のデータ型を宣言しておきます(こちらもデータ型を省略すると Variant 型になります)。上の例では戻り値も Double 型です。
それでは、CUBE 関数をワークシートで使ってみましょう。どこか適当なセルに
と入力してみてください。
図のように、体積の値「30」が返ってくるはずです。
今度は Function プロシージャをサブルーチンで呼びだしてみましょう。
'[VBA] 辺の長さが2,3,5の立方体の体積を求めるサブルーチン
Sub Cube_Volume()
Dim x As Double, y As Double, z As Double
x = 2
y = 3
z = 5
Debug.Print CUBE(x, y, z)
End Sub
実行するとイミディエイトウィンドウに「30」が表示されます。このマクロでは、変数 x, y, z に予め値を入れておいてから、その変数名で CUBE 関数を呼びだしています。変数のデータ型さえ合っていれば、このようにしてかまいません。もちろん、数値を直接入れて値を得ることもできます。
Optionalで省略可能な引数を設定します
ワークシート関数 (Excel関数) では引数の一部を省略できる場合があります。
たとえば RANK.EQ関数は
という形で入力すると、指定した「範囲」の中で「数値」が何番目にあるかを返してくれますけど、[] で囲われた 3 番目の引数は省略できることになっています。もしここに何も指定しなければ、指定した数値が「大きいほうから何番目か」を返します。0 以外の数値を指定すると「小さいほうから何番目か」を返すようになっています。このように定義することで、一つの関数で色々な処理ができるようにしてあるのです。
Function プロシージャにおいても、Optional ステートメントで省略可能な引数を設定できます。一般的に省略可能な引数は
という形で指定します。
それでは実際に引数が省略可能な簡単なマクロを作ってみましょう。第 1 引数で指定した値を整数倍して返す MULTIPLE関数です。
Function MULTIPLE(x As Double, Optional n As Integer = 2) As Double
MULTIPLE = n * x
End Function
1つめの引数に指定した値に2つめの引数を掛けた値を返しますよ。
たとえば適当なセルに
と入力すると 10 を 5 倍して 50 を返します。2 番目の引数を省略して、たとえば
と入力すると 10 を 2 倍して 20 を返します。このマクロでは引数の部分が
となっています。x は倍精度浮動小数点型で指定する省略できない引数です。n は省略可能な整数型引数で「もし何も指定されなければ 2 を入れておきますよ」と決めてあります。
VBA をあまり使わない人も、Function プロシージャの作り方だけでも覚えておくと、関数の種類を増やすことができるし、さらに他の関数と組合わせることで、機能を次々と拡張していくことができます。皆さんも、お仕事に役立つようなオリジナル関数をたくさんつくってくださいな。