[Excel で VBA] Function プロシージャ

前回から 「まとまった機能をもったプログラムの構成要素」として プロシージャを学んでいる。
プロシージャは他のプログラミング言語では「関数」と呼ばれることもある。
今回はプロシージャの「関数」としての側面を学んでみよう。

前回、プロシージャには「Sub プロシージャ」と「Function プロシージャ」があることに触れたが、
プロシージャを関数として用いるには Function プロシージャを用いる。

数学的関数の取扱い

今回はプロシージャの「関数」としての側面、すなわち Function プロシージャについて学ぶ。

Function プロシージャについて学ぶ前に、VBA における数学的関数の取扱いについて学ぼう。

以下のプログラムを実行してみよう。 これは、cos(π/6) とsin(π/6) の値を表示するプログラムである。

Sub prog()
	Dim x As Double, y As Double
	Dim theta As Double

	theta = 3.1415 / 6 ' 単位はラジアン。 θ=30 度に対応

	x = Cos(theta)
	y = Sin(theta)

	MsgBox "x=" & x & ", y=" & y
End Sub

上記のコピー可能なプログラムを Excel 上の VBA に貼り付けよう。



実行結果は以下のようになる。



cos(π/6)=√3/2~0.866, sin(π/6)=1/2 = 0.5 であることに注意。
0.5 が 0.499... と表示されるのは、プログラム中で π= 3.1415 という「精度の悪い近似」を用いているからであり、
π の桁数を増やすとより 0.5 に近付くので気にしなくとも良い。

ここで、

x = Cos(theta)

という行に注目すると、Cos という関数は、theta という値を受取り、返す値 Cos(theta) を持っていることがわかる。

関数が受け取る値は前回学んだように「引数 (ひきすう)」と呼ばれ、 関数が返す値は「戻り値」と呼ばれる。

Cos に関する上の説明を「引数」「戻り値」という用語を用いて書き直すと以下のようになる。 このように、戻り値を持つ関数を、 VBA で自作のプロシージャとして実現するには本ページで学ぶ Function プロシージャを用いる。

なお、 VBA で使える数学的関数で代表的なものをまとめると以下のようになる。

意味 記法 注意
cos x Cos(x) x はラジアンである。
sin x Sin(x) x はラジアンである。
tan x Tan(x) x はラジアンである。
arctan x Atn(x) tan x の逆関数 (アークタンジェント)。ラジアンの角度 (-π/2~π/2) が返る。
x y x ^ y x の y 乗。「 ^ 」は関数ではなく演算子であるが、これまで取り上げなかったのでここで紹介する。
ex Exp(x) exponential の頭文字。
log e x Log(x) -
√x Sqr(x) Square Root の略
|x| Abs(x) 絶対値。Absolute Value の略。

なお、Excel ではπとして関数 PI() が使えるが、
VBA ではπ自体を求める関数がないので、「4*Atn(1)」でπを代用することが多い。

なお、Atn は tan の逆関数 (arctan) である。tan(π/4) = 1 を逆関数を用いて表すと、π/4 = arctan(1) となるので、
π = 4 arctan(1) となる、というわけである。(なお、π/4 は 45 度であることに注意)


数学的関数を Function プロシージャで実装する

ここまででわかったように、Function プロシージャは戻り値を持つことが特徴である。

簡単な例として、y=x2 を計算する関数、すなわち を記述してみよう。(sq という名前はは自乗 = square の意味でつけた)
記述例は以下のようになる。

Sub prog()
	Dim x As Double, y As Double
	x = 2
	y = sq(x)
	MsgBox "y=" & y
End Sub

Function sq(x As Double) As Double
	sq = x * x  
End Function

このプログラムを実行してみよう。

このプログラムを VBA で実行するには、まず先程のプログラムを下記のように「Option Explicit」を残して削除し、



下記のように新しいプログラムを貼り付ければよい。
貼り付け後の状態が下図である。プロシージャの間にある横線は自動的に引かれる。



実行すると、2 の 2 乗 (=4) が表示される。



一般的に書くと、Function プロシージャの記述法は以下のようになる。
比較のために Sub プロシージャの記法も挙げ、相違点をで示す。

定義 利用法
Function プロシージャ
Function 名前 (引数リスト) As 型名前 = 処理内容
	…
End Function
y = 関数名(引数リスト)
Sub プロシージャ
Sub 名前 (引数リスト)
	…
	処理内容
	…
End Sub
関数名 引数リスト 

定義においてのポイントは、 また、利用法でのポイントは である。


数学的関数を Function プロシージャで実装する (2)

先程の2乗を計算する関数ならわざわざ Function プロシージャを使わなくとも y = x * x や y = x ^ 2 と書けば良いじゃないかと思うかも知れない。
しかし、Function プロシージャを用いると、今まで学んだ If 文や For 文を用いて、より複雑な関数を作成できるようになるというメリットがある。
そのような例を見てみよう。

例えば、 関数は以下のようになる。

Sub prog()
    Dim x As Double, y As Double
    x = 2
    y = func(x)
    MsgBox "y=" & y
End Sub

Function func(x As Double) As Double
    If x > 0 Then
        func = x * x
    Else
        func = 0
    End If
End Function

このプログラムを実行してみよう。

このプログラムを VBA で実行するには、まず先程のプログラムを下記のように「Option Explicit」を残して削除し、



下記のように新しいプログラムを貼り付ければよい。
貼り付け後の状態が下図である。プロシージャの間にある横線は自動的に引かれる。



実行すると、2 の 2 乗 (=4) が表示される。



なお、この関数のグラフは以下の様になるので、x<0 の値に対しては 0 が表示されるはずなので試してみると良い。





←引数のある Sub プロシージャ引数の内容を変更するプロシージャ→

Excel で学ぶ Visual Basic for Applications (VBA)に戻る