20その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。Functionプロシージャを使うために、呼び出す方法について解説していきます。Functionプロシージャの呼び出し方は戻り値なしの場合と、戻り値ありの場合で異なります。戻り値なしの場合はCallステートメントを使って呼び出します。Callステートメントは他のSubプロシージャやFunctionプロシージャなどを呼び出す場合に使います。戻り値なしのFunctionプロシージャを呼び出す場合は、Callステートメントを使います。このサンプルコードでは、戻り値なしでMsgBox関数を実行するFunctionプロシージャfunc1を定義しています。これをCallステートメントを使って呼び出しています。Callステートメントは省略することもできます。)」(括弧)で囲みます。)」(括弧)で囲みません。Functionプロシージャの戻り値を代入するオブジェクトを用意します。用意したオブジェクトに呼び出すFunctionプロシージャ名を指定して代入します。Excelにはたくさんの関数が用意されていますが、これらの関数と同じように自分で計算式などを作って処理を行いたい場合にFunctionプロシージャを使います。プロシージャ内で様々な処理を行った後で、プロシージャ名に値を格納することで呼び出し元に値を返す事ができます。この返される値を戻り値と言います。侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。VBAにてユーザー定義関数の作り方を解説しています。Functionプロシージャを使えば戻り値を返せる関数を作成できます。Subプロシージャは戻り値を指定できないのに対して、Functionプロシージャは戻り値を指定する点が大きな違いのひとつです。Functionプロシージャを定義する方法についてみていきましょう。Functionプロシージャが戻り値を返さない場合と返す場合とに分けて解説します。ここでは引数なしの場合について解説し、引数ありの場合は後ほど解説します。この例では、Functionプロシージャfunc1を定義しています。func1の戻り値はなしで、MsgBox関数を実行します。変数の定義のようにプロシージャ名と戻り値のデータ型を記述します。プロシージャ名には処理の結果得られる戻り値を代入します。この例では、Functionプロシージャfunc1を定義しています。御教授いただきたいのですが、ExcelのセルからFunctionプロシジャを呼び出し、その戻り値を呼び出しもとのセルに返す。この時その戻り値によって、セルの属性を変化(例えば色替えなど)を、行いたいものです。Excelにはたくさんの関数が用意されていますが、これらの関数と同じように自分で計算式などを作って処理を行いたい場合にFunctionプロシージャを使います。FunctionプロシージャはVBAの関数のように自分で処理内容を定義して関数を作ることができます。関数とは処理のひとかたまりのことです。変数や配列などの値を使って処理を行います。指定して処理結果を取得することもできます。処理に使う変数や配列などを引数といいます。関数内では引数もしくは関数内で定義した変数、オブジェクトのみを使用することができます。返す処理結果のことを戻り値といいます。戻り値には変数やオブジェクトなど1つ指定することができます。他にも処理内容を定義できるプロシージャとして、Subプロシージャがあります。"のFunctionプロシージャfunc1を定義しています。Subプロシージャmacro1ではfunc1を呼び出すためにString型のオブジェクトstrを用意し、strにfunc1を代入しています。これをMsgBoxを使って出力表示しています。これまでは引数のない基本的な定義について解説してきました。Functionプロシージャを使って処理をする場合、引数に指定した変数を使って戻り値の処理を行う場合がほとんどです。引数が1つの場合はプロシージャ名の後の「()」の中にByVal句を使って引数名とそのデータ型を指定します。ByVal句の他にByRef句を使う場合があります。ByVal句とByRef句の使い分けについては後ほど解説します。このサンプルコードでは、Integer型の引数を1つ持つFunctionプロシージャfunc2を定義しています。func2ではInteger型の引数numを使って二乗の計算をしています。その結果を用いて文字列を作り、戻り値としています。ちなみにCstr関数は引数に指定した値を文字列型(String)に変換します。このサンプルコードでは、Integer型の引数を2つ持つFunctionプロシージャfunc3を定義しています。func3ではInteger型の引数num1、num2を使ってかけ算の計算をしています。その結果を用いて文字列を作り、戻り値としています。func3はInteger型の値2と3を指定して呼び出しています。先ほど引数を指定する際にByVal句を使用する場合とByRef句を使用する場合があるとお伝えしました。ByVal句は引数をFunctionプロシージャ内に値を渡すためだけの場合に使用します。これに対してByRef句を使うと、Functionプロシージャ内に値を渡すためだけではなく、その値が変更されても変更後の値を取得することができます。ByVal句を使った引数渡しを値渡しといいます。ByRef句を使った引数渡しを参照渡しといいます。「ByRef」句を使う場合の記述は下記のようにByVal句をByRef句に替えるだけです。「ByVal」句や「ByRef」句は記述を省略することができます。省略した場合は「ByRef」句を記述した場合と同じく参照渡しとみなされます。このサンプルコードではFunctionプロシージャfunc4で足し算とかけ算の2つの計算をしています。足し算の結果を参照渡しで、かけ算の結果を戻り値で返しています。Integer型の変数sumの値は0(ゼロ)でしたが、func4が呼び出されたあとは値が5に変わっています。Functionプロシージャは1つの値しか戻り値として返すことができませんが、このようにByRef句を使って参照渡しをすることで複数以上の処理結果を取得することができます。これまでは戻り値が値でしたが、オブジェクトを戻り値として返すこともできます。オブジェクトを戻り値とする場合はSetステートメントを使用します。このサンプルコードではFunctionプロシージャobjの戻り値の型にオブジェクト型のrangeを指定しています。Setステートメントを使ってobjに代入しています。objを呼び出す際にもSetステートメントを使っています。引数に配列を指定する場合は全て参照渡しになります。これは引数に配列を指定する場合、先頭のアドレスを渡しているためで値を渡すようにはなっていないからです。戻り値に配列を指定する場合には戻り値のデータ型の後に「()」(カッコ)を付けます。このサンプルコードではFunctionプロシージャmyArrayで引数と戻り値にInteger型の配列を指定しています。「myArray」を呼び出し代入するためにReDim動的配列new_arrを定義しています。サンプルコードでは配列の要素数を調べるためにLBound関数とUBound関数を使用しています。LBound関数は引数に指定した配列で使用できる最も小さいインデックス番号を返します。