VBAを使うようになって、けっこう最初の方で疑問に思うのが「Sub」と「Function」という2つの関数の違いですよね。
長年VBAを書いてきて、私なりに使い分け方が定まってきました。
というか、この使い分け方以外はないと思います。
今回は、そんなSubとFunctionの使い分け方を紹介します。
先に結論を書いておくと、
Function | Sub | |
戻り値を | 返せる | 返せない |
マクロの登録が | できない | できる |
セルの関数として | 使える | 使えない |
となります。詳しくは↓をどうぞ。
Functionの特徴
まずはFunctionの方から特徴をみてみましょう。
- 戻り値を返せる
- マクロの登録ができない
- セルの関数として使える
例で詳しくみてみましょう。
以下のソースコードは、ボールを投げた時の軌道と速度を計算する関数です。
x,y,vx,vyそれぞれをFunctionで計算します。
Option Explicit
Public Const d2r = 3.14159265359 / 180# 'deg->radian
Public Const g = 9.80665
Function calcX(ByVal v0 As Double, ByVal ang As Double, ByVal t As Double) As Double
Dim x As Double
x = v0 * Cos(ang * d2r) * t
calcX = x
End Function
Function calcY(ByVal v0 As Double, ByVal ang As Double, ByVal t As Double) As Double
Dim vy0 As Double
Dim y As Double
vy0 = v0 * Sin(ang * d2r)
y = vy0 * t - 0.5 * g * t * t
calcY = y
End Function
Function calcVX(ByVal v0 As Double, ByVal ang As Double, ByVal t As Double) As Double
calcVX = v0 * Cos(ang * d2r)
End Function
Function calcVY(ByVal v0 As Double, ByVal ang As Double, ByVal t As Double) As Double
Dim vy0 As Double
Dim vy As Double
vy0 = v0 * Sin(ang * d2r)
vy = vy0 - g * t
calcVY = vy
End Function
Functionの特徴①:戻り値を返す
まず1つ目の特徴として、「戻り値を返す」があります。
Function 関数名(引数) as 戻り値の型
とFunctionを定義します。
例だと
Function calcX(ByVal v0 As Double, ByVal ang As Double, ByVal t As Double) As Double
などです。
これは、関数名calcX、引数にv0,ang,tの3つが必要で、戻り値がDouble型だよ、と宣言しているのです。
そして、関数の中で戻り値を計算してあげます。
例だと、
calcX = x
の部分で、calcXの関数の戻り値はxですよ、としています。
こうすることで、Functionの呼び出し元にxの計算結果が渡されます。
Functionの特徴②:マクロの登録ができない
2つ目のFunctionの特徴は、「マクロの登録ができない」です。
どういうことかというと、Excelのシートにボタンを設置して、そのボタンをクリックしたらVBAの処理が実行されるようにするのが定石だと思うのですが、Functionはボタンの処理に登録できません。

↑のように、ボタンを設置して右クリックでマクロの登録をしようとすると、

Functionしかない場合はマクロが何も選択できません。
Functionは対象外なのです。
ボタンから実行したい関数がある場合はSubで書かなければいけません。
Functionの特徴③:セルの関数として使える
3つ目のFunctionの特徴は、「セルの関数として使える」です。
どういうことかというと、

この図のように、シートのセルに「=****」と数式を打ち込む際、Functionの関数名がサジェストで表示されます。
(calcX,calcY,calcVX,calcVYが表示されている)
つまり、自作のFunction関数がセルで使えるのです。

よく計算する式なんかをFunctionで登録しておくと、便利!
以上3つがFunctionの特徴です。
Subの特徴
Subの特徴をあげますと、
- 戻り値を返さない
- マクロの登録ができる
- セルから呼び出せない
となります。Functionと逆だと思えばいいです。
例として、先出のFunctionの例のボール軌道計算の関数をまとめて呼び出すSub関数をつくってみました。
Sub TestSub()
Dim t As Double
Dim x, y, vx, vy As Double
Dim v0 As Double
Dim ang As Double
Dim irow As Integer
v0 = Cells(2, 2)
ang = Cells(3, 2)
irow = 2
For t = 0 To 5 Step 0.01
x = calcX(v0, ang, t)
y = calcY(v0, ang, t)
vx = calcVX(v0, ang, t)
vy = calcVY(v0, ang, t)
Cells(irow, 5) = t
Cells(irow, 6) = x
Cells(irow, 7) = y
Cells(irow, 8) = vx
Cells(irow, 9) = vy
irow = irow + 1
Next t
End Sub
Subの特徴①:戻り値を返さない
Sub関数は戻り値を返せません。
C言語とかでいうmain関数のような扱いです。
無理やり戻り値を返そうとするとコンパイルエラーになります。

↑試しにmainというSub関数を宣言して、戻り値を返すように書いてみましたが、コンパイルエラーがでました。
Subの特徴②:マクロの登録ができる
Sub関数はボタンに登録できるマクロとして選択できます。

ボタンから呼び出すならSub関数、と覚えておきましょう。
Subの特徴③:セルから呼び出せない
Subは戻り値を返さないので当たり前なのですが、Functionのようにセルの数式として呼び出すことはできません。
Subを呼び出すならボタンを設置してマクロ登録が必要、ということです。
結論:SubとFunctionは使い分けないとね
SubとFunctionの違いをまとめると、
Function | Sub | |
戻り値を | 返せる | 返せない |
マクロの登録が | できない | できる |
セル関数として | 使える | 使えない |
となります。
これで使い分けがばっちりできますね♪
戻り値の有無やマクロの登録など、SubとFunctionはできることが違うので、きちんと使い分けましょう!
んじゃ、また~
コメント