Excelにはたくさんの関数が用意されていますが、これらの関数と同じように自分で計算式などを作って処理を行いたい場合にFunctionプロシージャを使います。引数、戻り値に配列を指定する方法など応用的な内容についてもわかりやすく解説していきます。まとめFunctionプロシージャとはFunctionプロシージャはVBAの関数のように自分で処理内容を定義して関数を作ることができます。関数とは処理のひとかたまりのことです。変数や配列などの値を使って処理を行います。指定して処理結果を取得することもできます。処理に使う変数や配列などを引数といいます。関数内では引数もしくは関数内で定義した変数、オブジェクトのみを使用することができます。返す処理結果のことを戻り値といいます。戻り値には変数やオブジェクトなど1つ指定することができます。他にも処理内容を定義できるプロシージャとして、Subプロシージャがあります。Subプロシージャは戻り値を指定できないのに対して、Functionプロシージャは戻り値を指定する点が大きな違いのひとつです。Functionの定義まずはFunctionプロシージャを定義する方法についてみていきましょう。Functionプロシージャが戻り値を返さない場合と返す場合とに分けて解説します。ここでは引数なしの場合について解説し、引数ありの場合は後ほど解説します。引数なし、戻り値なしの定義についてまずは戻り値なしの基本的な定義の記述からみていきましょう。Function記述例は以下のようになります。Functionこの例では、Functionプロシージャfunc1を定義しています。func1の戻り値はなしで、MsgBox関数を実行します。引数なし、戻り値ありの定義について戻り値がある場合の定義の記述は以下のとおりです。Function変数の定義のようにプロシージャ名と戻り値のデータ型を記述します。プロシージャ名には処理の結果得られる戻り値を代入します。記述例は以下のようになります。Functionこの例では、Functionプロシージャfunc1を定義しています。VBA!"となります。Functionを呼び出す方法Functionプロシージャを使うために、呼び出す方法について解説していきます。Functionプロシージャの呼び出し方は戻り値なしの場合と、戻り値ありの場合で異なります。戻り値なしの場合はCallステートメントを使って呼び出します。Callステートメントは他のSubプロシージャやFunctionプロシージャなどを呼び出す場合に使います。それぞれの場合についてみていきましょう。戻り値なしのFunctionプロシージャを呼び出す場合は、Callステートメントを使います。以下のように記述します。Functionプロシージャ名サンプルコードで確認しましょう。Function実行結果:このサンプルコードでは、戻り値なしでMsgBox関数を実行するFunctionプロシージャfunc1を定義しています。これをCallステートメントを使って呼び出しています。Callステートメントは省略することもできます。)」(括弧)で囲みます。)」(括弧)で囲みません。戻り値ありのFunctionプロシージャを呼び出す際には下記のように記述します。プロシージャ名まず、Functionプロシージャの戻り値を代入するオブジェクトを用意します。用意したオブジェクトに呼び出すFunctionプロシージャ名を指定して代入します。それではサンプルコードで確認しましょう。VBA!"のFunctionプロシージャfunc1を定義しています。Subプロシージャmacro1ではfunc1を呼び出すためにString型のオブジェクトstrを用意し、strにfunc1を代入しています。これをMsgBoxを使って出力表示しています。引数の指定についてこれまでは引数のない基本的な定義について解説してきました。Functionプロシージャを使って処理をする場合、引数に指定した変数を使って戻り値の処理を行う場合がほとんどです。引数が1つの場合からみていきましょう。引数が1つの場合は以下のように記述します。Function引数が1つの場合はプロシージャ名の後の「()」の中にByVal句を使って引数名とそのデータ型を指定します。ByVal句の他にByRef句を使う場合があります。ByVal句とByRef句の使い分けについては後ほど解説します。それでは実際の使い方をサンプルコードで確認しましょう。Function実行結果:このサンプルコードでは、Integer型の引数を1つ持つFunctionプロシージャfunc2を定義しています。func2ではInteger型の引数numを使って二乗の計算をしています。その結果を用いて文字列を作り、戻り値としています。ちなみにCstr関数は引数に指定した値を文字列型(String)に変換します。func2はInteger型の変数numを指定して呼び出しています。引数が2つ以上の複数の場合は以下のように記述します。Functionこのように「,」(カンマ)で区切って並べます。それではサンプルコードで確認しましょう。Function実行結果:このサンプルコードでは、Integer型の引数を2つ持つFunctionプロシージャfunc3を定義しています。func3ではInteger型の引数num1、num2を使ってかけ算の計算をしています。その結果を用いて文字列を作り、戻り値としています。func3はInteger型の値2と3を指定して呼び出しています。参照による引数渡しについて先ほど引数を指定する際にByVal句を使用する場合とByRef句を使用する場合があるとお伝えしました。ByVal句は引数をFunctionプロシージャ内に値を渡すためだけの場合に使用します。これに対してByRef句を使うと、Functionプロシージャ内に値を渡すためだけではなく、その値が変更されても変更後の値を取得することができます。ByVal句を使った引数渡しを値渡しといいます。ByRef句を使った引数渡しを参照渡しといいます。「ByRef」句を使う場合の記述は下記のようにByVal句をByRef句に替えるだけです。Functionまた「ByVal」句や「ByRef」句は記述を省略することができます。省略した場合は「ByRef」句を記述した場合と同じく参照渡しとみなされます。参照渡しで値を変更されたくない場合は注意しましょう!それでは実際にサンプルコードで確認します。Function実行結果:このサンプルコードではFunctionプロシージャfunc4で足し算とかけ算の2つの計算をしています。足し算の結果を参照渡しで、かけ算の結果を戻り値で返しています。Integer型の変数sumの値は0(ゼロ)でしたが、func4が呼び出されたあとは値が5に変わっています。Functionプロシージャは1つの値しか戻り値として返すことができませんが、このようにByRef句を使って参照渡しをすることで複数以上の処理結果を取得することができます。戻り値にオブジェクトを指定する方法これまでは戻り値が値でしたが、オブジェクトを戻り値として返すこともできます。オブジェクトを戻り値とする場合はSetステートメントを使用します。以下のようにして記述します。Functionそれではサンプルコードで確認しましょう。Function実行結果:このサンプルコードではFunctionプロシージャobjの戻り値の型にオブジェクト型のrangeを指定しています。Setステートメントを使ってobjに代入しています。objを呼び出す際にもSetステートメントを使っています。引数に配列を指定する場合には引数名の後に「()」(カッコ)を付けます。引数に配列を指定する場合は全て参照渡しになります。これは引数に配列を指定する場合、先頭のアドレスを渡しているためで値を渡すようにはなっていないからです。戻り値に配列を指定する場合には戻り値のデータ型の後に「()」(カッコ)を付けます。以下のような記述になります。Functionそれでは実際の使い方をサンプルコードで確認しましょう。Function実行結果:このサンプルコードではFunctionプロシージャmyArrayで引数と戻り値にInteger型の配列を指定しています。「myArray」を呼び出し代入するためにReDim動的配列new_arrを定義しています。サンプルコードでは配列の要素数を調べるためにLBound関数とUBound関数を使用しています。LBound関数は引数に指定した配列で使用できる最も小さいインデックス番号を返します。UBound関数は引数に指定した配列で使用できる<最も大きいインデックス番号を返します。VBAの関数についてVBAには元々用意されている関数もあります。VBAで用意されている関数については、こちらのサイトで詳しく解説しています。2019年4月28日VBAの将来性VBAのスキルを学んで業務を効率化したいこのように思っている人は多いでしょう。VBAの用途はさまざまで、VBAのスキルがあれば転職できるのでは?業務効率化のスキルは需要が高そうだからなどが上げられます。確かに、業務効率化はどこの企業も目指していて、需要が高いように見えます。VBAを扱えることが強みになるかといわれると、すこし疑問があります。VBAは基本的にエクセル上でしか使用することができません。最近では社内書式をスプレッドシートで管理している企業も増えており、今後エクセル自体の需要が少なくなってしまう可能性も考えられます。なってしまうと、VBAを習得しても活躍の場が限られてしまいますよね。考えると将来的にVBAの需要はあまり高くないといえます。VBAを学んでいる人はどうすればいいのでしょう。VBAの将来性や今後の対策などをこちらの記事でまとめているのでぜひご確認ください。2019年10月9日まとめここでは、Functionプロシージャについて説明しました。値や参照での引数渡し、戻り値が値やオブジェクトの場合、引数・戻り値が配列の場合などいろいろな内容をお伝えしましたが、どれも使う機会が多いものばかりではないかと思います。使いこなすことができるように、この記事を何度も参考にして下さいね!TweetPocket無料でSEからWebエンジニアへ転職しませんか?侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、システムエンジニアという職業だけどコードが書けない事務作業が多くスキルがないため将来が不安スクールに通うと完全未経験者と同じスタートになるからレベルが合わないという、すでに知識があるSEならではのお悩みがあることに気づきました。弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。こちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。お問合せはこちらでも受け付けています。