ブログ

VBAマクロでfunctionとsubの違いとは?

更新日:


 

FunctionとSubの違いとは?

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

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

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

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

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

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

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

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

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

使い方も変わります。

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

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

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

 

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

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

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

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

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

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

迷うこともあると思います。

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

出てきたりもします。

またFunctionプロシージャでは値を戻さなくてもエラーにならないので、後からSubやFunctionの定義を

書き換える手間を考えれば、最初からFunctionプロシージャとしておいた方が分りやすくて良い時もあるのです。

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

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

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

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

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

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

FunctionとSubのプロシージャはどちらも一部の処理を切り出したりして、汎用的に使えるようにするために

あるのですが、その点に関しては全く同じなので値を戻すことが無ければどちらを使っても構いません。

Subプロシージャだけでも作ることが出来ないことはないので、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関数にもなるのです。

 


ブログを書いている講師紹介(初心者の気持ちが日本で唯一わかるパソコンが苦手だった講師)

森分 然(もりわけ しかり)ミスターしかっち

パソコンが大の苦手だったところから、パソコンを覚えてきた経験を元にパソコン教室を開講。自身の経験から「専門用語を使わない」「例え話」「初心者の気持ちが唯一わかる講師」で人気。全国対応の遠隔レッスンで多くの問い合わせが殺到。初心者向けに少しでも役に立ちたいと、馴染み易いように始めた動画「ミスターしかっち式動画」が大人気。小学生が見てもわかるような動画を無料で掲載中。「ミスターしかっち」で検索!


-ブログ
-

Copyright© パソコン教室キュリオステーション , 2019 All Rights Reserved Powered by AFFINGER5.