VBA Functionプロシージャ入門|結果を返してコードをシンプルに

VBA Functionのアイキャッチ VBA

VBAを使っていると、複雑な計算や処理の結果をほかの場所で使いたくなることがありますよね。
でも、どうやってそれを実現するか迷ってしまうことも…。

お悩みポイント
悩む人
  • 計算結果を返すにはどうしたらいいの?
  • 同じ処理を何度も書かずに再利用したい…
  • 処理の結果を別のプロシージャでも使いたい!

VBAの「Functionプロシージャ」を使えば、計算や処理をまとめて、結果を返すことができるので、コードがスッキリします。

この記事では、初めてVBAを学ぶ方でも理解できるように「Functionプロシージャ」の基礎から使い方を丁寧に解説していきます。

最後まで読んでいただければ、VBAでの計算や処理がぐっと簡単に、効率的になりますよ!


【 この記事の概要 】

  よく使う度    4.5  
  難しさ     4.0  
  覚えておくと安心度     4.5  

この記事を読むとできること

この記事を見てできるようになること

Functionプロシージャとは?

「Functionプロシージャ」とは、簡単に言うと、処理を行ってその結果を返すプログラムのブロックのことです。
例えば、計算を行って、その結果(答え)を他の場所で使いたいときに便利です。

「Subプロシージャ」と「Functionプロシージャ」は機能が違うため、うまく使い分けることが重要です。

「Subプロシージャ」と「Functionプロシージャ」の違い

通常の「Subプロシージャ」と違い、「Functionプロシージャ」は値を返すことができるのが特徴です。

Subプロシージャを使うべき場合

Sub を使うべき場合
  • 処理を行うだけで、結果を返す必要がない場合
  • 「セルの値を変更」「メッセージを表示」したりする場合

Subプロシージャは、Functionプロシージャと同様に、他のプロシージャから呼び出すことができます。
その際に使用するのが「Callステートメント」です。
Callステートメントを使うことで、複数のSubプロシージャを順次実行することが可能です。

Callステートメントについては、別の記事で詳しく解説を行っています。
合わせてご覧ください。

Functionプロシージャを使うべき場合

Function を使うべき場合
  • 計算や条件分岐によって結果を返す必要がある場合
  • 複数のプロシージャで同じ計算ロジックを使いたい場合

本記事では、Functionについて、解説を行います。

Functionの基本構文

それでは、Functionの基本構文について解説を行います。


Functionの基本構文
設定解説
  • 関数名
    • 関数名は、作成するFunctionに自分でつける名前です。
      この名前を使って、後でこの関数を呼び出して使います。
      関数名は自由に決めることができますが、意味のある名前にすると後でわかりやすくなります。
  • (引数 As データ型)
    • 引数とは、Functionに渡す「データ」です。
      引数を使って、関数に外部からデータを入力し、そのデータをもとに計算や処理を行います。
    • データ型は、その引数がどの種類のデータを受け取るかを決めるものです。
      たとえば、Long型は整数、String型は文字列を表します。
  • 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

処理結果

Functionの処理結果

詳細解説

Functionの動作概要

このように、SumValuesという関数を作ると、どこでも簡単に使うことができ、結果(合計値)を返してくれます。

Functionプロシージャのメリット

Functionプロシージャを使うと、コードが短くなり、何度も同じ処理を書く必要がなくなります。
また、1度作った関数を何回でも使い回せるので、プログラムのメンテナンスが簡単になります。

メリット
  • コードの可読性が向上し、再利用が可能になる
    • Functionプロシージャを使うことで、複数の場所で同じ処理を行いたい場合に、その処理を何度も書く必要がなくなります

      たとえば、計算のロジックを1つの「Functionプロシージャ」にまとめておけば、他の場所から何度でもその関数を呼び出して使うことができます。
      これにより、コードがスッキリし、長くなりがちな処理も簡潔に記述できます。
      また、関数に名前を付けることで、その関数が何をするかが一目で分かるため、プログラムの見た目が整理され、他の人がコードを見たときにも理解しやすくなります。
  • 処理結果を返すことができる
    • 「Functionプロシージャ」は、計算結果や処理結果を他のプロシージャやセルに返すことができます
      これにより、特定の計算結果を他の部分で使いたい場合や、条件に応じて異なる結果を返す必要があるときに便利です。

      たとえば、複雑な計算を行った結果を返し、その結果を後で別の処理に利用できるのがFunctionの強みです。
  • エラーが少なくなる
    • 同じ処理を何度も書くと、コピーミスやタイプミスなどのエラーが発生しやすくなりますが、Functionプロシージャにまとめることで、そうしたミスを減らすことができます
      関数を1度作成してしまえば、どこで使っても同じ結果が得られるため、信頼性が高まります。

Functionプロシージャの使い方に気をつけよう

  • 必ず結果を返す必要がある
    • Functionプロシージャは、必ず1つの結果を返すという役割を持っています。
      つまり、Functionが呼び出された後、何かしらの処理結果を返さなければなりません

      例えば、計算の結果や特定の条件に基づいた値などがその「結果」にあたります。
      この結果を返さないままFunctionを終了してしまうと、エラーが発生するので注意が必要です。
  • 結果を複数返す場合の工夫
    • VBAのFunctionプロシージャでは、1つの値しか直接返すことができません
      しかし、複数の結果を返したい場合には、いくつかの工夫を使うことでそれを実現できます。
      • 工夫1: 配列を使う方法
        • 1つの値として配列を返すことで、複数の値をまとめて返すことができます。
          配列は、複数のデータを1つにまとめて扱える便利な仕組みです。

          例えば、計算結果や文字列のセットなど、複数の関連するデータを一度に返す際に配列が役立ちます。
      • 工夫2: ByRefを使う方法
        • 「ByRef」を使って、関数の引数として渡された変数を直接変更することで、結果を複数の変数に反映させる方法もあります。
          この方法では、Function自体は1つの値を返しますが、ByRefで渡された引数の値をFunctionの中で変更することで、複数の結果を受け取ることが可能です。

使用例: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

このコードで使用している機能

1行ずつ解説

コードの詳細
  1. Sub MainProcedure()
    • これは新しいサブルーチン「MainProcedure」を定義しています。
      Subは「サブルーチン(Subroutine)」の略で、VBAにおける一連の処理をまとめた小さなプログラムのことです。
  2. Dim result As Long
    • Long型の変数「result」を宣言します。
      この変数は、後で関数「SumValues」の結果を受け取るために使用されます。
  3. result = SumValues(10, 20)
    • ここで、関数「SumValues」を呼び出し、引数として「10」と「20」を渡しています
      関数「SumValues」は、これらの引数を受け取り、その合計を計算して結果を返します
      その結果が、変数「result」に格納されます。
  4. MsgBox “合計は ” & result
    • MsgBoxはメッセージボックスを表示するための関数です。
      ここでは、result変数に格納された合計値をメッセージボックスに表示しています。
  5. End Sub
    • End Subは、サブルーチンの終わりを示す命令です。

  1. Function SumValues(ByVal num1 As Long, ByVal num2 As Long) As Long
    • ここでは、新しい関数を定義しています。
      「Function」は、VBAで関数を作成するためのキーワードです。
      関数は、特定の処理を行い、その結果を返すことができます。
      「SumValues」という名前の関数を定義しており、この関数は2つの引数「num1」と「num2」を受け取ります
      「ByVal」は、引数を値として渡すことを意味しています。
      引数のデータ型はLong型(長整数)です。
      最後の「As Long」は、この関数がLong型の値を返すことを示しています。
  2. SumValues = num1 + num2
    • ここでは、「num1」と「num2」の2つの数値を足した結果を、関数「SumValues」の返り値として設定しています。
      例えば、「num1」が「10」で、「num2」が「20」であれば、この行は「30」という結果を返します。
      この結果は、「MainProcedure」の中で変数「result」に格納され、メッセージボックスで表示されます。
  3. End Function
    • 「End Function」は、関数の終わりを示します。
      これにより、関数「SumValues」が終了し、計算された結果が返されます。
      この行がないと、関数が正常に終了せず、エラーが発生する可能性があります。
      関数が終了すると、VBAはこの関数の呼び出し元に戻り、処理を続行します。

このコードは、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関数」を使って最小値と最大値を計算します。
    その後、それらを配列に格納して返します。

処理結果

使用例2

このコードで使用している機能

1行ずつ解説

コードの詳細
  1. Sub MainProcedure()
    • これは新しいサブルーチン「MainProcedure」を定義しています。
      Subは「サブルーチン(Subroutine)」の略で、VBAにおける一連の処理をまとめた小さなプログラムのことです。
  2. Dim minMax() As Long
    • ここで、「minMax」という名前の配列変数を宣言しています。
      「Dim」は変数宣言のためのキーワードで、「minMax()」は、複数の数値(ここではLong型の整数)を格納できる配列です。
      配列を使うことで、複数の値を1つの変数名で扱うことができます。
  3. minMax = GetMinMax(10, 20)
    • 「GetMinMax」という関数を呼び出し、その結果を配列「minMax」に代入しています。
      関数「GetMinMax」は、「10」と「20」という2つの数値を引数として受け取り、その最小値と最大値を配列にして返します
      この配列の最初の要素「minMax(0)」には最小値が、2番目の要素「minMax(1)」には最大値が格納されます。
  4. MsgBox “最小値は ” & minMax(0) & “, 最大値は ” & minMax(1)
    • MsgBox関数を使用して、メッセージボックスに最小値と最大値を表示しています。
      「minMax(0)」には最小値が、「minMax(1)」には最大値が格納されており、それらを文字列に結合して表示しています。
      このようにメッセージボックスで結果をユーザーに表示することで、コードの実行結果が確認できるようになっています。
  5. End Sub
    • End Subは、サブルーチンの終わりを示す命令です。

  1. Function GetMinMax(ByVal num1 As Long, ByVal num2 As Long) As Variant
    • ここで、新しい関数「GetMinMax」を定義しています。
      「Function」は、計算や処理を行って、その結果を返すブロックを定義するためのキーワードです。
      「ByVal」は、引数「num1」と「num2」を値として関数に渡すことを示しており、これらの引数はLong型の整数です。
      戻り値の型はVariantとしており、これはどのようなデータ型でも返せる万能型です。
      今回は、配列を返すためにVariant型を使用しています。
  2. Dim result(1) As Long
    • ここで、「result」という名前の配列変数を宣言しています。
      「result(1)」という指定は、2つの要素を持つ配列を意味します(0から1までのインデックスを持ちます)。
      この配列には、最小値と最大値がそれぞれ格納されます。
  3. result(0) = WorksheetFunction.Min(num1, num2)
    • 「WorksheetFunction.Min」は、Excelのワークシート関数「MIN」をVBA内で使用するための命令です。
      この行では、「num1」と「num2」のうち小さい方の数値を取得し、配列「result」の最初の要素「result(0)」に格納しています。
      これにより、result(0)には最小値が保存されます。
  4. result(1) = WorksheetFunction.Max(num1, num2)
    • 「WorksheetFunction.Max」を使用して、「num1」と「num2」のうち大きい方の数値を取得し、配列「result」の2番目の要素「result(1)」に格納しています。
      これにより、「result(1)」には最大値が保存されます。
  5. GetMinMax = result
    • 関数「GetMinMax」の戻り値として、配列「result」を返しています
      この配列には最小値と最大値が格納されており、関数を呼び出した元の場所(ここではMainProcedure)に返されます。
  6. End Function
    • 「End Function」は、関数「GetMinMax」の終了を示しています。
      これにより、関数が正常に終了し、VBAはこの関数から返された値を元の場所に渡します。
      「End Function」がない場合、関数は正常に終了しないため、エラーが発生します。

このコードは、2つの数値を比較して最小値と最大値を求め、それらを配列として返し、その結果をメッセージボックスに表示するシンプルな処理を示しています。
関数「GetMinMax」を使用して、最小値と最大値の計算を行い、その結果を1つの配列にまとめて返す手法は、複数の値を一度に扱う際に非常に便利です。
また、WorksheetFunctionを利用することで、VBAコード内でもExcelの標準関数を活用できる点が重要です。
このような処理は、データ分析やレポート作成など、さまざまな場面で応用可能です。

まとめ

「Functionプロシージャ」は、処理結果を他のプロシージャやセルに返すための非常に便利な方法です。

計算やデータ処理の結果を再利用する必要がある場合や、コードの可読性を高めたいときに効果的に使用できます。
また、配列を使うことで、複数の結果を返すことも可能です。
これにより、コードがシンプルになり、効率的なプログラム作成が可能となります。

ポイントのおさらい

  • VBAのFunctionプロシージャを使って結果を返す方法を理解する
  • FunctionとSubの違いを把握する
  • Functionプロシージャのメリット
    • Functionプロシージャを使用することで、コードが短くなり、再利用が可能となります。
      また、複数の場所で同じ処理を行う際に、その処理を1つにまとめられるため、コードがシンプルかつ保守しやすくなります。

      「Functionプロシージャのメリット」もう一度見る。
  • Functionプロシージャの使い方に気をつけよう
  • 配列を使った関数の使用例を確認する
    • VBAのFunctionプロシージャでは1つの値しか返せませんが、配列を使うことで複数の値を返すことが可能です。
      これにより、複雑な処理を簡潔にまとめることができます。
      使用例を実践することで、Functionプロシージャの理解が深まり、VBAコードがより効率的に書けるようになります。

      「使用例:Functionプロシージャを使ってみよう」もう一度見る。

VBAのFunctionプロシージャは、結果を返すことで処理の再利用性を高め、コードをシンプルに保つ強力なツールです。

配列を使用することで、複数の値を効率的に扱えるため、複雑な計算や処理にも対応できます。

この記事を通じて、より柔軟で効率的なVBAコードの作成方法を習得できるでしょう。

タイトルとURLをコピーしました