エクセル・VBA

VBA|functionとsubの違いは?|パソコン教室講師が詳しく解説します

更新日:

エクセルVBAのfunctionとsubの違いを紹介している女性の画像

今回は、functionとsubの違いを詳しく解説します

FunctionとSubの違いとは?

functionとsubの違いに疑問を抱いている女性の画像

VBAマクロにおいて、FunctionとSubは何かと登場回数が多く、しかも違いが良く分からないケースもあります。

FunctionとSubは使い方がほぼ同じですから、区別しないで使用してしまっている人も珍しくないでしょう。

端的にいえば、前者は戻り値を返すことが可能で、後者は戻り値がないという違いがあります。

つまり実行結果を判定したい場合は前者を、その必要がない時は後者を使用する形です。

他に大きな違いはありませんから、仮に間違って使用しても致命的な問題は発生しないと思われます。

プログラミングをすると似たような処理を何回も書かなければならないことがあります。

その場合、同じような処理を一つの関数として定義して、呼び出せるようにします。

またあまりにもプログラムが長い場合、ある程度のまとまった部分を関数にすることもあります。

VBAマクロでは関数に相当するものをプロシージャと呼びます。それにはFunctionやsubといったものがあり、使い方も変わります。

functionプロシージャは処理後に何らかの値を呼び出し側に戻すことが出来ます。

Subプロシージャは通常それは出来ないようになっています。

ですので値が戻ってくるようにしたい場合はFunctionプロシージャで定義します。

FunctionをSubプロシージャと比較しないほうが分かりやすい時もある

FunctionをSubプロシージャ比較しないことを紹介している女性の画像

Functionは、Subプロシージャと比較しないほうが分かりやすい、という場合もあります。

例えば、プログラムに関する知識が乏しく、戻り値についてハッキリと理解できていないケースがその1つです。

難しく考え過ぎて理解が遠のく、そういった可能性もありますから、最初は無理に比較をしなくても良いでしょう。

VBAマクロに慣れてきたら比較をする、という段階的な学習を心掛け、必要に応じて比較を始めるのが賢明です。

2つのプロシージャを使用することが出来るため便利な面もありますが、どちらを使っていいのか迷うこともあると思います。

というのは作っている間に仕様の変更があって、値を戻さなくても良くなったり、その逆の値を戻す必要が出てきたりもします。

またFunctionプロシージャでは値を戻さなくてもエラーにならないので、後からSubやFunctionの定義を書き換える手間を考えれば、最初からFunctionプロシージャとしておいた方が分りやすくて良い時もあるのです。

Subプロシージャと混乱しがちな部分

Subプロシージャと混乱するを表現している女性の画像

VBAマクロのプロシージャは、複数の処理を1つにまとめたものを指します。

Subプロシージャはこの処理の単位のことで、プロシージャ名に始まりEndを付けたSubで終わります。

この間に複数の処理を記述することによって、一連の処理が1つにまとめられるわけです。

Functionの場合は、プロシージャ名に値を代入することで、それを戻り値として呼び出し元に返せます。

Subで同じことをやっても戻り値は返せませんから、ここで躓いたり混乱を生じることがあるので要注意です。

FunctionとSubのプロシージャはどちらも一部の処理を切り出したりして、汎用的に使えるようにするためにあるのですが、その点に関しては全く同じなので値を戻すことが無ければどちらを使っても構いません。

Subプロシージャだけでも作ることが出来ないことはないので、Functionプロシージャの必要性を感じない人もいると思いますし、混乱することもあるでしょう。

そのように混乱する場合、値を戻す必要がある時は必ずFunctionプロシージャを使うと決めておくと良いかもしれません。

Functionプロシージャでなくとも値が返せる方法がある

Functionプロシージャでなくとも値が返せるを表現している画像

値を返す為にはFunctionプロシージャが必要ですが、実は使わなくても返せる方法があります。

それは何処からでも参照できる変数を用意しておき、プロシージャ内で値を変更するやり方です。

何処からでもアクセス可能な柔軟性によって、値の正確性については保証が難しいですが、Functionプロシージャを使いたくない場合の代替手段にはなります。

他にも、処理中に他のプロシージャを呼び出すことによって、複数間で値のやり取りが可能です。

一般的には、Subプロシージャはその処理で出てきた結果を戻す必要の無い時に使いますが、実はSubプロシージャでも戻すことが可能なのです。

それはSubプロシージャで定義する引数のタイプをByValからByRefに変えると出来ます。

ByValは値渡しと呼ばれ、ByRefは参照渡しと呼ばれたりします。

ByRefを使うと、Subプロシージャ内でその引数の値を変えると、呼び出し側の変数の値も変わります。

つまり、呼び出し側で変わった値をそのまま引き継ぐことが出来るのです。

また外部変数として定義した変数をSubプロシージャ内で変更することでも値を返すことが出来ます。

FunctionをSUM、IF等の関数と同等として見る

関数とみることができるを表現している男性の画像

FunctionはSUMやIFといった関数的な性質を持つので、同等の存在として見ることができます。

つまり、Functionを使えばSUMなどの関数を生み出せる、といった考え方が可能なわけです。

万能ですが使い方は奥深いので、その分良く理解して上手に活用したいところです。

いわば万能ナイフのような存在ですから、使い手によって価値が引き出せたり、逆に上手く使いこなせないこともあるでしょう。

Subとの組み合わせによって可能性が広がるので、その点もFunctionならではの魅力です。

プロシージャは最初に書いた通りプログラムの一部を関数にしたものなのですが、SUMやIFといった関数としても見ることが出来ます。

特にFunctionプロシージャだとその中で処理した後に、値を返してくれるので、それらの関数とまったく同じことが出来ます。

例えばFunctionプロシージャ内でデータの合計をしてその値を戻すようにすればSUM関数になります。

また条件文を使った処理をすればIF関数にもなるのです。

本格VBA講座を紹介しているリンク画像

 

 

全国にあるパソコン教室パレハのサービス一覧

「オンライン」自宅で学べるパソコン教室

オンラインレッスン

オンラインレッスンの詳細はこちら

苦手な方専門パソコン教室

パソコン教室パレハの詳細はこちら

パソコン教室の運営をしませんか?

フランチャイズ

パソコン教室パレハFCの詳細はこちら

「在宅」で自由な働き方しませんか?

在宅ワーク

クラブ・パレハ在宅ワーク詳細はこちら

-エクセル・VBA
-, , ,

メールはこちら

LINEはこちら

お電話はこちら

Copyright© パソコン教室パレハ , 2020 All Rights Reserved.