【VBA】SubとFunctionの使い分け方

VBA-SubとFunctionの使い分け
  • URLをコピーしました!
※当ブログではアフィリエイト広告を表示しています

VBAを使うようになって、けっこう最初の方で疑問に思うのが「Sub」と「Function」という2つの関数の違いですよね。

長年VBAを書いてきて、私なりに使い分け方が定まってきました。
というか、この使い分け方以外はないと思います。

今回は、そんなSubとFunctionの使い分け方を紹介します。

先に結論を書いておくと、

FunctionSub
戻り値を返せる返せない
マクロの登録ができないできる
セルの関数として使える使えない

となります。詳しくは↓をどうぞ。

目次

Functionの特徴

まずはFunctionの方から特徴をみてみましょう。

Functionの特徴
  1. 戻り値を返せる
  2. マクロの登録ができない
  3. セルの関数として使える

例で詳しくみてみましょう。

以下のソースコードは、ボールを投げた時の軌道と速度を計算する関数です。
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しかない場合、何も選べない)

Functionしかない場合はマクロが何も選択できません。
Functionは対象外なのです。

ボタンから実行したい関数がある場合はSubで書かなければいけません。

Functionの特徴③:セルの関数として使える

3つ目のFunctionの特徴は、「セルの関数として使える」です。

どういうことかというと、

Function関数をセルから呼び出す(関数のサジェストにFunctionの関数が含まれている)
Function関数をセルから呼び出す(「=c」と入力したら出てくる関数のサジェストにFunctionの関数が含まれている)

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

つまり、自作のFunction関数がセルで使えるのです。

Function関数をセルから呼び出す
Function関数をセルで使う様子

よく計算する式なんかをFunctionで登録しておくと、便利!

以上3つがFunctionの特徴です。

Subの特徴

Subの特徴をあげますと、

Subの特徴
  1. 戻り値を返さない
  2. マクロの登録ができる
  3. セルから呼び出せない

となります。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関数のような扱いです。

無理やり戻り値を返そうとするとコンパイルエラーになります。

Subは戻り値を返せない
Subの宣言で戻り値を付けてもコンパイルエラーになる

↑試しにmainというSub関数を宣言して、戻り値を返すように書いてみましたが、コンパイルエラーがでました。

Subの特徴②:マクロの登録ができる

Sub関数はボタンに登録できるマクロとして選択できます。

Sub関数はマクロ登録できる
Sub関数はマクロ登録できる

ボタンから呼び出すならSub関数、と覚えておきましょう。

Subの特徴③:セルから呼び出せない

Subは戻り値を返さないので当たり前なのですが、Functionのようにセルの数式として呼び出すことはできません。

Subを呼び出すならボタンを設置してマクロ登録が必要、ということです。

結論:SubとFunctionは使い分けないとね

SubとFunctionの違いをまとめると、

FunctionSub
戻り値を返せる返せない
マクロの登録ができないできる
セル関数として使える使えない

となります。

これで使い分けがばっちりできますね♪

戻り値の有無やマクロの登録など、SubとFunctionはできることが違うので、きちんと使い分けましょう!

んじゃ、また~

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

関連記事

応援よろしくお願いします☆

この記事を書いた人

理系夫婦の妻のほうです。
大学、大学院(修士)で物理を専攻。
2016年に長女を出産、2021年に長男を出産。
フルタイム勤務ワーママ→休職→専業主婦。

コメント

コメントする

目次