VBA にはサブルーチンやワークシートで呼びだすことのできる Function プロシージャ(ユーザー定義関数) を作成できます。Function プロシージャはサブルーチンで呼び出すこともできるし、ワークシートで Excel 関数のように振る舞います。要するに自作の Excel 関数のようなものです。
【VBA】Function プロシージャ
VBA における Function プロシージャとは、何かの「値」を返すマクロです。値といっても、必ずしも数字のことだけでなく、文字列なども含むのですけど、要するに入力した値を足し算したり、入力した文字列を並べ替えたりして、その結果を返すということです。
一方で、セルを選択したり、シートをコピーしたりするような Function プロシージャはつくれません。そういうのは普通のサブルーチンでつくってください。何はともあれ簡単な関数を作ってみましょう。立方体の「縦」「横」「高さ」の値を入力して体積を求める Function プロシージャです。
'[VBA] 立方体の体積を求めるFunctionプロシージャ Function CUBE(a As Double, b As Double, c As Double) As Double CUBE = a * b * c End Function
Function プロシージャを作成するときは、Sub ではなく、Function ステートメントでコードを書き始めます。結びは End Function です。上の例では CUBE が関数名です。() の中にはユーザーさんが入力する引数の変数名とデータ型を書いておきます(データ型を省略すると Variant 型になります)。上の例では a, b, c が変数名で、すべて Double 型にしてあります。そして ( ) の後ろには、戻り値のデータ型を宣言しておきます(こちらもデータ型を省略すると Variant 型になります)。上の例では戻り値も Double 型です。
それでは、CUBE 関数をワークシートで使ってみましょう。どこか適当なセルに
=CUBE(2,3,5)
と入力してみてください。
図のように体積の値「30」が返ってくるはずです。
今度は Function プロシージャをサブルーチンで呼びだしてみましょう。
'[VBA] 辺の長さが2,3,5の立方体の体積を求めるサブルーチン Sub Cube_Volume() Dim x As Double, y As Double, z As Double x = 2 y = 3 z = 5 Debug.Print CUBE(x, y, z) End Sub
Cube_Volume() を実行するとイミディエイトウィンドウに「30」が表示されます。このマクロでは、変数 x, y, z に予め値を入れておいてから、その変数名で CUBE 関数を呼びだしています。変数のデータ型さえ合っていれば、このようにしてかまいません。もちろん、数値を直接入れて値を得ることもできます。
ワークシート関数 (Excel関数) では引数の一部を省略できる場合があります。たとえば RANK.EQ関数は
=RANK.EQ(数値,範囲,[順序])
という形で入力すると、指定した「範囲」の中で「数値」が何番目にあるかを返してくれますが、[] で囲われた 3 番目の引数は省略できることになっています。もしここに何も指定しなければ、指定した数値が「大きいほうから何番目か」を返します。0 以外の数値を指定すると「小さいほうから何番目か」を返すようになっています。このように定義することで、一つの関数で色々な処理ができるようにしてあるのです。
Function プロシージャにおいても、Optional ステートメントで省略可能な引数を設定できます。一般的に省略可能な引数は
Optional 変数名 As 変数のデータ型 = 省略された場合の値
という形で指定します。それでは実際に引数が省略可能な簡単なマクロを作ってみましょう。第1引数で指定した値を整数倍して返す MULTIPLE関数です。
Function MULTIPLE(x As Double, Optional n As Integer = 2) As Double MULTIPLE = n * x End Function
1つめの引数に指定した値に2つめの引数を掛けた値を返します。たとえば適当なセルに
=MULTIPLE(10,5)
と入力すると、「10」を 5 倍して「50」を返します。2 番目の引数を省略して、たとえば
=MULTIPLE(10)
と入力すると、「10」を 2 倍して「20」を返します。このマクロでは引数の部分が
x As Double, Optional n As Integer = 2
となっています。x は倍精度浮動小数点型で指定する省略できない引数です。n は省略可能な整数型引数で「もし何も指定されなければ 2 を入れておきますよ」と決めてあります。
VBA をあまり使わない人も、Function プロシージャの作り方だけでも覚えておくと、関数の種類を増やすことができるし、さらに他の関数と組合わせることで、機能を次々と拡張していくことができます。皆さんも、お仕事に役立つようなオリジナル関数をたくさんつくってください。
コメント
【AI解説】Functionプロシージャの概念と使い方
[ChatGPT] VBA(Visual Basic for Applications)のFunctionプロシージャは、特定の処理を実行し、結果を返すために使用されるブロックです。以下では、VBAのFunctionプロシージャについて、基本的な概念と使用方法について説明します。
VBAのFunctionプロシージャは、ほかのコード内で呼び出すことができる再利用可能な部品です。通常、関数は値を返すために使用されます。たとえば、数値の合計を計算する関数や、文字列の長さを返す関数などがあります。以下に、VBAのFunctionプロシージャを作成する手順を示します。
1.VBAエディタを開きます。通常、Alt + F11キーを押すことで開くことができます。
2.モジュールを作成するために、挿入(Insert)メニューから「モジュール」を選択します。
3.新しいモジュールが作成され、コードエディタ上に表示されます。
4.Functionプロシージャを作成するために、以下のようなコードを入力します。
上記のコードでは、以下の要素を定義しています。
・関数の名前を指定します。一意でわかりやすい名前を選ぶことが望ましいです。
・引数1 As データ型, 引数2 As データ型, …: 関数に渡される引数を指定します。引数は必要な数だけ定義できます。それぞれの引数は、データ型とともに指定します。
・戻り値のデータ型: 関数が返す結果のデータ型を指定します。
関数の処理を実装します。関数が実行する具体的な処理を、’ 処理の実装 ‘の部分にコードとして記述します。関数内で必要な変数や条件分岐などを使用することもできます。
結果を返すためのコードを追加します。関数が結果を返すためには、戻り値のデータ型で指定したデータ型に合った値を、戻り値のデータ型と同じ名前の変数に代入します。そして、End Function文を使用して関数の定義を終了します。