VBAを使っていると、複雑な計算や処理の結果をほかの場所で使いたくなることがありますよね。
でも、どうやってそれを実現するか迷ってしまうことも…。
VBAの「Functionプロシージャ」を使えば、計算や処理をまとめて、結果を返すことができるので、コードがスッキリします。
この記事では、初めてVBAを学ぶ方でも理解できるように「Functionプロシージャ」の基礎から使い方を丁寧に解説していきます。
最後まで読んでいただければ、VBAでの計算や処理がぐっと簡単に、効率的になりますよ!
【 この記事の概要 】
よく使う度 | |
難しさ | |
覚えておくと安心度 |
この記事を読むとできること
Functionプロシージャとは?
「Functionプロシージャ」とは、簡単に言うと、処理を行ってその結果を返すプログラムのブロックのことです。
例えば、計算を行って、その結果(答え)を他の場所で使いたいときに便利です。
「Subプロシージャ」と「Functionプロシージャ」は機能が違うため、うまく使い分けることが重要です。
「Subプロシージャ」と「Functionプロシージャ」の違い
通常の「Subプロシージャ」と違い、「Functionプロシージャ」は値を返すことができるのが特徴です。
Subプロシージャを使うべき場合
Subプロシージャは、Functionプロシージャと同様に、他のプロシージャから呼び出すことができます。
その際に使用するのが「Callステートメント」です。
Callステートメントを使うことで、複数のSubプロシージャを順次実行することが可能です。
Callステートメントについては、別の記事で詳しく解説を行っています。
合わせてご覧ください。
Functionプロシージャを使うべき場合
本記事では、Functionについて、解説を行います。
Functionの基本構文
それでは、Functionの基本構文について解説を行います。
- 関数名
- 関数名は、作成するFunctionに自分でつける名前です。
この名前を使って、後でこの関数を呼び出して使います。
関数名は自由に決めることができますが、意味のある名前にすると後でわかりやすくなります。
- 関数名は、作成するFunctionに自分でつける名前です。
- (引数 As データ型)
- 引数とは、Functionに渡す「データ」です。
引数を使って、関数に外部からデータを入力し、そのデータをもとに計算や処理を行います。 - データ型は、その引数がどの種類のデータを受け取るかを決めるものです。
たとえば、Long型は整数、String型は文字列を表します。
- 引数とは、Functionに渡す「データ」です。
- As データ型
- 「As データ型」は、関数が返す値の種類を指定するものです。
関数がどの種類のデータを返すかを事前に決める必要があります。
- 「As データ型」は、関数が返す値の種類を指定するものです。
Functionプロシージャは、計算結果や処理結果を他のプロシージャやセルに返すことができるため、再利用性が高まります。
Functionプロシージャを実際に使用する際は、次のように記載します。
コード例
例:合計を計算する場合
Sub MainProcedure()
Dim result As Long
result = SumValues(10, 20)
MsgBox "合計は " & result
End Sub
Function SumValues(ByVal num1 As Long, ByVal num2 As Long) As Long
SumValues = num1 + num2
End Function
処理結果
詳細解説
このように、SumValuesという関数を作ると、どこでも簡単に使うことができ、結果(合計値)を返してくれます。
Functionプロシージャのメリット
Functionプロシージャを使うと、コードが短くなり、何度も同じ処理を書く必要がなくなります。
また、1度作った関数を何回でも使い回せるので、プログラムのメンテナンスが簡単になります。
Functionプロシージャの使い方に気をつけよう
- 必ず結果を返す必要がある
- Functionプロシージャは、必ず1つの結果を返すという役割を持っています。
つまり、Functionが呼び出された後、何かしらの処理結果を返さなければなりません。
例えば、計算の結果や特定の条件に基づいた値などがその「結果」にあたります。
この結果を返さないままFunctionを終了してしまうと、エラーが発生するので注意が必要です。
- Functionプロシージャは、必ず1つの結果を返すという役割を持っています。
- 結果を複数返す場合の工夫
- VBAのFunctionプロシージャでは、1つの値しか直接返すことができません。
しかし、複数の結果を返したい場合には、いくつかの工夫を使うことでそれを実現できます。- 工夫1: 配列を使う方法
- 1つの値として配列を返すことで、複数の値をまとめて返すことができます。
配列は、複数のデータを1つにまとめて扱える便利な仕組みです。
例えば、計算結果や文字列のセットなど、複数の関連するデータを一度に返す際に配列が役立ちます。
- 1つの値として配列を返すことで、複数の値をまとめて返すことができます。
- 工夫2: ByRefを使う方法
- 「ByRef」を使って、関数の引数として渡された変数を直接変更することで、結果を複数の変数に反映させる方法もあります。
この方法では、Function自体は1つの値を返しますが、ByRefで渡された引数の値をFunctionの中で変更することで、複数の結果を受け取ることが可能です。
- 「ByRef」を使って、関数の引数として渡された変数を直接変更することで、結果を複数の変数に反映させる方法もあります。
- 工夫1: 配列を使う方法
- VBAのFunctionプロシージャでは、1つの値しか直接返すことができません。
使用例:Functionプロシージャを使ってみよう
それでは実際にFunctionプロシージャを使ってみましょう。
以下にいくつかの使用例を紹介します。
使用例1: 引数を2つ渡して、合計を計算する
2つの数値を引数として関数に渡し、その合計を計算する方法を紹介します。
主な使用用途: 複数の場所で同じ計算を行いたいときに、Functionプロシージャとしてまとめて再利用できます。
Sub MainProcedure()
Dim result As Long
result = SumValues(10, 20)
MsgBox "合計は " & result
End Sub
Function SumValues(ByVal num1 As Long, ByVal num2 As Long) As Long
SumValues = num1 + num2
End Function
- STEP1変数resultの宣言と初期設定
「MainProcedure」内で「result」というLong型変数を宣言し、初期化します。
- STEP2関数SumValuesの呼び出し
関数「SumValues」を呼び出し、引数として「10」と「20」を渡します。
この関数は、2つの数値の合計を返します。 - STEP3メッセージボックスに結果を表示
関数「SumValues」から返された合計値をメッセージボックスで表示します。
処理結果
このコードで使用している機能
1行ずつ解説
- Sub MainProcedure()
- これは新しいサブルーチン「MainProcedure」を定義しています。
Subは「サブルーチン(Subroutine)」の略で、VBAにおける一連の処理をまとめた小さなプログラムのことです。
- これは新しいサブルーチン「MainProcedure」を定義しています。
- Dim result As Long
- Long型の変数「result」を宣言します。
この変数は、後で関数「SumValues」の結果を受け取るために使用されます。
- Long型の変数「result」を宣言します。
- result = SumValues(10, 20)
- ここで、関数「SumValues」を呼び出し、引数として「10」と「20」を渡しています。
関数「SumValues」は、これらの引数を受け取り、その合計を計算して結果を返します。
その結果が、変数「result」に格納されます。
- ここで、関数「SumValues」を呼び出し、引数として「10」と「20」を渡しています。
- MsgBox “合計は ” & result
- MsgBoxはメッセージボックスを表示するための関数です。
ここでは、result変数に格納された合計値をメッセージボックスに表示しています。
- MsgBoxはメッセージボックスを表示するための関数です。
- End Sub
- End Subは、サブルーチンの終わりを示す命令です。
- Function SumValues(ByVal num1 As Long, ByVal num2 As Long) As Long
- ここでは、新しい関数を定義しています。
「Function」は、VBAで関数を作成するためのキーワードです。
関数は、特定の処理を行い、その結果を返すことができます。
「SumValues」という名前の関数を定義しており、この関数は2つの引数「num1」と「num2」を受け取ります。
「ByVal」は、引数を値として渡すことを意味しています。
引数のデータ型はLong型(長整数)です。
最後の「As Long」は、この関数がLong型の値を返すことを示しています。
- ここでは、新しい関数を定義しています。
- SumValues = num1 + num2
- ここでは、「num1」と「num2」の2つの数値を足した結果を、関数「SumValues」の返り値として設定しています。
例えば、「num1」が「10」で、「num2」が「20」であれば、この行は「30」という結果を返します。
この結果は、「MainProcedure」の中で変数「result」に格納され、メッセージボックスで表示されます。
- ここでは、「num1」と「num2」の2つの数値を足した結果を、関数「SumValues」の返り値として設定しています。
- End Function
- 「End Function」は、関数の終わりを示します。
これにより、関数「SumValues」が終了し、計算された結果が返されます。
この行がないと、関数が正常に終了せず、エラーが発生する可能性があります。
関数が終了すると、VBAはこの関数の呼び出し元に戻り、処理を続行します。
- 「End Function」は、関数の終わりを示します。
このコードは、2つの数値を合計するシンプルな処理を示しています。
サブルーチン「MainProcedure」で数値を渡し、関数「SumValues」でその合計を返す流れは、よく使用されるパターンです。
特に複雑な計算を関数として分離することで、コードが読みやすく、メンテナンスしやすくなります。
使用例2: 配列を使って複数の結果を返す関数
複数の数値を配列で受け取り、その合計と平均を1つの関数から配列として返す方法を紹介します
VBAのFunctionプロシージャでは基本的に1つの値しか返せませんが、配列を使うことで複数の値を返すことができます。
Sub MainProcedure()
Dim minMax() As Long
minMax = GetMinMax(10, 20)
MsgBox "最小値は " & minMax(0) & ", 最大値は " & minMax(1)
End Sub
Function GetMinMax(ByVal num1 As Long, ByVal num2 As Long) As Variant
Dim result(1) As Long
result(0) = WorksheetFunction.Min(num1, num2)
result(1) = WorksheetFunction.Max(num1, num2)
GetMinMax = result
End Function
- STEP1配列の受け渡し
「MainProcedure」で、関数「GetMinMax」を呼び出し、2つの数値(10と20)を引数として渡します。
この関数内で、この2つの数値を使って最小値と最大値を計算し、それらを配列として返します。 - STEP2結果の表示
関数「GetMinMax」から返された配列は、変数「minMax」に格納されます。
この配列の最初の要素には最小値が、2番目の要素には最大値が格納されています。
MsgBox関数を使って、最小値と最大値をメッセージボックスに表示します。 - STEP3関数の処理内容
Function GetMinMax(ByVal num1 As Long, ByVal num2 As Long) As Variantでは、2つの引数「num1」と「num2」をもとに、Excelの「MIN」および「MAX関数」を使って最小値と最大値を計算します。
その後、それらを配列に格納して返します。
処理結果
このコードで使用している機能
1行ずつ解説
- Sub MainProcedure()
- これは新しいサブルーチン「MainProcedure」を定義しています。
Subは「サブルーチン(Subroutine)」の略で、VBAにおける一連の処理をまとめた小さなプログラムのことです。
- これは新しいサブルーチン「MainProcedure」を定義しています。
- Dim minMax() As Long
- ここで、「minMax」という名前の配列変数を宣言しています。
「Dim」は変数宣言のためのキーワードで、「minMax()」は、複数の数値(ここではLong型の整数)を格納できる配列です。
配列を使うことで、複数の値を1つの変数名で扱うことができます。
- ここで、「minMax」という名前の配列変数を宣言しています。
- minMax = GetMinMax(10, 20)
- 「GetMinMax」という関数を呼び出し、その結果を配列「minMax」に代入しています。
関数「GetMinMax」は、「10」と「20」という2つの数値を引数として受け取り、その最小値と最大値を配列にして返します。
この配列の最初の要素「minMax(0)」には最小値が、2番目の要素「minMax(1)」には最大値が格納されます。
- 「GetMinMax」という関数を呼び出し、その結果を配列「minMax」に代入しています。
- MsgBox “最小値は ” & minMax(0) & “, 最大値は ” & minMax(1)
- MsgBox関数を使用して、メッセージボックスに最小値と最大値を表示しています。
「minMax(0)」には最小値が、「minMax(1)」には最大値が格納されており、それらを文字列に結合して表示しています。
このようにメッセージボックスで結果をユーザーに表示することで、コードの実行結果が確認できるようになっています。
- MsgBox関数を使用して、メッセージボックスに最小値と最大値を表示しています。
- End Sub
- End Subは、サブルーチンの終わりを示す命令です。
- Function GetMinMax(ByVal num1 As Long, ByVal num2 As Long) As Variant
- ここで、新しい関数「GetMinMax」を定義しています。
「Function」は、計算や処理を行って、その結果を返すブロックを定義するためのキーワードです。
「ByVal」は、引数「num1」と「num2」を値として関数に渡すことを示しており、これらの引数はLong型の整数です。
戻り値の型はVariantとしており、これはどのようなデータ型でも返せる万能型です。
今回は、配列を返すためにVariant型を使用しています。
- ここで、新しい関数「GetMinMax」を定義しています。
- Dim result(1) As Long
- ここで、「result」という名前の配列変数を宣言しています。
「result(1)」という指定は、2つの要素を持つ配列を意味します(0から1までのインデックスを持ちます)。
この配列には、最小値と最大値がそれぞれ格納されます。
- ここで、「result」という名前の配列変数を宣言しています。
- result(0) = WorksheetFunction.Min(num1, num2)
- 「WorksheetFunction.Min」は、Excelのワークシート関数「MIN」をVBA内で使用するための命令です。
この行では、「num1」と「num2」のうち小さい方の数値を取得し、配列「result」の最初の要素「result(0)」に格納しています。
これにより、result(0)には最小値が保存されます。
- 「WorksheetFunction.Min」は、Excelのワークシート関数「MIN」をVBA内で使用するための命令です。
- result(1) = WorksheetFunction.Max(num1, num2)
- 「WorksheetFunction.Max」を使用して、「num1」と「num2」のうち大きい方の数値を取得し、配列「result」の2番目の要素「result(1)」に格納しています。
これにより、「result(1)」には最大値が保存されます。
- 「WorksheetFunction.Max」を使用して、「num1」と「num2」のうち大きい方の数値を取得し、配列「result」の2番目の要素「result(1)」に格納しています。
- GetMinMax = result
- 関数「GetMinMax」の戻り値として、配列「result」を返しています。
この配列には最小値と最大値が格納されており、関数を呼び出した元の場所(ここではMainProcedure)に返されます。
- 関数「GetMinMax」の戻り値として、配列「result」を返しています。
- End Function
- 「End Function」は、関数「GetMinMax」の終了を示しています。
これにより、関数が正常に終了し、VBAはこの関数から返された値を元の場所に渡します。
「End Function」がない場合、関数は正常に終了しないため、エラーが発生します。
- 「End Function」は、関数「GetMinMax」の終了を示しています。
このコードは、2つの数値を比較して最小値と最大値を求め、それらを配列として返し、その結果をメッセージボックスに表示するシンプルな処理を示しています。
関数「GetMinMax」を使用して、最小値と最大値の計算を行い、その結果を1つの配列にまとめて返す手法は、複数の値を一度に扱う際に非常に便利です。
また、WorksheetFunctionを利用することで、VBAコード内でもExcelの標準関数を活用できる点が重要です。
このような処理は、データ分析やレポート作成など、さまざまな場面で応用可能です。
まとめ
「Functionプロシージャ」は、処理結果を他のプロシージャやセルに返すための非常に便利な方法です。
計算やデータ処理の結果を再利用する必要がある場合や、コードの可読性を高めたいときに効果的に使用できます。
また、配列を使うことで、複数の結果を返すことも可能です。
これにより、コードがシンプルになり、効率的なプログラム作成が可能となります。
ポイントのおさらい
VBAのFunctionプロシージャは、結果を返すことで処理の再利用性を高め、コードをシンプルに保つ強力なツールです。
配列を使用することで、複数の値を効率的に扱えるため、複雑な計算や処理にも対応できます。
この記事を通じて、より柔軟で効率的なVBAコードの作成方法を習得できるでしょう。