『Excel VBA 表計算とプログラミング学習サイト』では、アフィリエイトプログラムを利用して商品を紹介しています。

【VBA】Functionプロシージャ(ユーザー定義関数)

VBA にはサブルーチンやワークシートで呼びだすことのできる Function プロシージャ(ユーザー定義関数) を作成できます。Function プロシージャはサブルーチンで呼び出すこともできるし、ワークシートで Excel 関数のように振る舞います。要するに自作の Excel 関数のようなものです。

【VBA】Function プロシージャ

VBA における 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 関数をワークシートで使ってみましょう。どこか適当なセルに

=CUBE(2,3,5)

と入力してみてください。
 
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

Cube_Volume() を実行するとイミディエイトウィンドウに「30」が表示されます。このマクロでは、変数 x, y, z に予め値を入れておいてから、その変数名で CUBE 関数を呼びだしています。変数のデータ型さえ合っていれば、このようにしてかまいません。もちろん、数値を直接入れて値を得ることもできます。
 
ワークシート関数 (Excel関数) では引数の一部を省略できる場合があります。たとえば RANK.EQ関数は

=RANK.EQ(数値,範囲,[順序])

という形で入力すると、指定した「範囲」の中で「数値」が何番目にあるかを返してくれますが、[] で囲われた 3 番目の引数は省略できることになっています。もしここに何も指定しなければ、指定した数値が「大きいほうから何番目か」を返します。0 以外の数値を指定すると「小さいほうから何番目か」を返すようになっています。このように定義することで、一つの関数で色々な処理ができるようにしてあるのです。
 
Function プロシージャにおいても、Optional ステートメントで省略可能な引数を設定できます。一般的に省略可能な引数は

Optional 変数名 As 変数のデータ型 = 省略された場合の値

という形で指定します。それでは実際に引数が省略可能な簡単なマクロを作ってみましょう。第1引数で指定した値を整数倍して返す MULTIPLE関数です。

Function MULTIPLE(x As Double, Optional n As Integer = 2) As Double
  MULTIPLE = n * x
End Function

1つめの引数に指定した値に2つめの引数を掛けた値を返します。たとえば適当なセルに

=MULTIPLE(10,5)

と入力すると、「10」を 5 倍して「50」を返します。2 番目の引数を省略して、たとえば

=MULTIPLE(10)

と入力すると、「10」を 2 倍して「20」を返します。このマクロでは引数の部分が

x As Double, Optional n As Integer = 2

となっています。x は倍精度浮動小数点型で指定する省略できない引数です。n は省略可能な整数型引数で「もし何も指定されなければ 2 を入れておきますよ」と決めてあります。
 
VBA をあまり使わない人も、Function プロシージャの作り方だけでも覚えておくと、関数の種類を増やすことができるし、さらに他の関数と組合わせることで、機能を次々と拡張していくことができます。皆さんも、お仕事に役立つようなオリジナル関数をたくさんつくってください。

コメント