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

2019 12/06
【VBA】SubとFunctionの使い分け方

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

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

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

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

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

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

目次

Functionの特徴

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

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

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

以下のソースコードは、ボールを投げた時の軌道と速度を計算する関数です。
x,y,vx,vyそれぞれをFunctionで計算します。

Functionの特徴①:戻り値を返す

まず1つ目の特徴として、「戻り値を返す」があります。

Function 関数名(引数) as 戻り値の型

とFunctionを定義します。

例だと

などです。
これは、関数名calcX、引数にv0,ang,tの3つが必要で、戻り値がDouble型だよ、と宣言しているのです。

そして、関数の中で戻り値を計算してあげます。

例だと、

の部分で、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の特徴①:戻り値を返さない

Sub関数は戻り値を返せません。

C言語とかでいうmain関数のような扱いです。

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

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

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

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

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

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

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

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

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

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

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

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

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

となります。

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

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

んじゃ、また~

関連記事

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

コメント

コメントする

目次