【Excel VBA入門 第12回】戻り値を返せる!Function(関数)プロシージャの基礎と作り方

スポンサーリンク
Excel VBA

導入

前回(第11回)では、ダブルクリックのトグル処理に合わせてセルの背景色を自動変更する方法をご紹介した。第8回から続いた「イベントプロシージャとダブルクリックの活用編」は、これでひと区切りとなる。

今回からは新しいテーマとして、Function(関数)プロシージャの基礎を学んでいこう。

これまで扱ってきた Sub プロシージャは、処理を実行するだけで「結果を呼び出し元に返す」ことができなかった。一方、Function プロシージャは処理の結果を戻り値として返すことができ、計算処理をパーツ化して使い回せるようになる。

SubとFunctionの違い

SubFunction はどちらも「一連の処理をまとめたもの」という点では同じだが、大きな違いが一つある。

Subプロシージャ
処理を実行するが、Functionのような戻り値は持たない
Functionプロシージャ
処理の結果を戻り値として返す

たとえば「消費税込みの価格を計算する」処理を考えてみよう。Sub ではセルに直接値を書き込むことしかできないが、Function なら「計算結果」そのものを他の処理に渡すことができる。

Functionプロシージャの基本的な書き方

Function 関数名(引数 As 型) As 戻り値の型
    ' 処理内容
    関数名 = 戻り値
End Function

ポイントは以下の2つである。

  • As 戻り値の型 で、この関数がどんな型の値を返すかを宣言する
  • 関数名そのものに値を代入することで、戻り値を確定させる(Return 文はVBAには存在しない)

実践!消費税込み価格を計算するFunction

実際に、税抜き価格から税込み価格を計算するFunctionを作ってみよう。今回は、これまでのシートモジュール(ダブルクリックイベントなど)とは違い、標準モジュールにコードを書いていく。手順から確認しよう。

設定手順

  1. Excelを起動し、新規ブックを作成する。
  2. Alt + F11 を押して、VBAエディタ(Visual Basic Editor)を開く。
  3. 画面左側の「プロジェクトエクスプローラー」で右クリック → 「挿入」→「標準モジュール」 を選択する。
    • これまでの回で使っていた「シートモジュール」(Sheet1 などをダブルクリックして開くもの)とは別物である点に注意しよう。
      今回のようにワークシート上からユーザー定義関数として利用するFunctionは、標準モジュールに記述する。
  4. 追加された Module1 のエディタ画面が開くので、コードを入力する。
  5. 以下のコードを貼り付ける。
Function 税込価格(税抜価格 As Long) As Long
    Const 消費税率 As Double = 0.1
    税込価格 = 税抜価格 * (1 + 消費税率)
End Function
  1. Ctrl + S で保存する。このとき、ファイルの種類を選ぶダイアログが表示されるので、「Excel マクロ有効ブック(*.xlsm)」 を選択して保存する。
    • 通常の .xlsx 形式ではマクロが保存されないため、必ず .xlsm 形式を選ぶ必要がある。
  2. Alt + F11 でExcel画面に戻る(VBAエディタとExcel本体は、このショートカットで行き来できる)。

これで準備は完了だ。以降の回では「標準モジュールにコードを書く」という手順は同じになるため、迷ったらこの手順を振り返ってほしい。

このFunctionは、Excel上で2通りの方法で使うことができる。

① ワークシート上でユーザー定義関数として使う

標準モジュールに上記コードを書いておけば、セルに次のように入力するだけで使える。

=税込価格(A1)

この際、A1セルに税抜価格を入力しておき、B1セルなど別のセルにこの式を入力しよう。
もし A1 セルそのものに =税込価格(A1) を入力してしまうと、「自分自身の値を使って自分自身を計算しようとする」循環参照エラーになるため、参照先とは異なるセルに数式を入力するようにしよう。

SUMAVERAGE と同じ感覚で、自作の関数をセル内で呼び出せるのが最大のメリットだ。

② 他のマクロ(Sub)から呼び出す

先ほど開いた Module1 に、①のFunctionと同じモジュール内で構わないので、続けて以下のSubを追記する。

Sub 価格を表示する()
    Dim 結果 As Long
    結果 = 税込価格(1000)
    MsgBox "税込価格は " & 結果 & " 円です"
End Sub

追記したら、次のいずれかの方法で実行しよう。

  • VBAエディタ上で実行する
    Subのコード内にカーソルを置いた状態で F5 キーを押す
  • Excel画面から実行する
    Alt + F8 でマクロ一覧ダイアログを開き、「価格を表示する」を選択して「実行」をクリックする

第10回・第11回で扱った Worksheet_BeforeDoubleClick のようなシートモジュールのマクロは、セルをダブルクリックすると自動的に実行される「イベントマクロ」だった。
一方、今回の Sub 価格を表示する は標準モジュールに書いた「単独で呼び出すマクロ」であるため、上記のように F5Alt+F8 から明示的に実行する必要がある。この違いも確認しておこう。

※今回はFunctionの基本を学ぶための例である。実際の消費税計算では、端数処理などを考慮する必要がある。

このように、Function の戻り値を変数に受け取って、別の処理の中で活用することができる。

コードのポイント解説

「関数名 = 戻り値」という独特の書き方

初心者がつまずきやすいポイントとして、「戻り値をどうやって返すのか」がある。他言語の return のような専用構文はなく、関数名そのものを変数のように扱って値を代入するのがVBAの流儀だ。

税込価格 = 税抜価格 * (1 + 消費税率)

この1行が実行された時点で、呼び出し元に返す値が確定する。

型を明示する習慣をつけよう

As LongAs Double のように戻り値の型を明示しないと、既定では Variant 型(何でも入る型)として扱われる。動作はするが、意図しない型変換によるバグの原因になりやすいため、慣れないうちから型をきちんと指定する習慣をつけておくとよい。

まとめ

今回は、Function プロシージャの基礎を学んだ。

  • Function は処理結果を戻り値として返せるプロシージャである
  • 関数名 = 戻り値 という形で戻り値を確定させる
  • ワークシート上の自作関数としても、他のマクロから呼び出す部品としても使える

もしSub しかご存じなかったとしたら、計算処理を「使い回せる部品」として切り出せるようになったのは大きな進歩といえるだろう。

次回(第13回)は、Functionに欠かせない「引数の渡し方」について、ByVal と ByRef の違いを中心に詳しく解説していこう。

コメント

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