VBA関数の戻り値を効率化!早期Return(Exit Function)と計算順序の極意
生徒
「VBAで自作関数を作ってみたのですが、条件分岐が重なりすぎて、どこで結果を返しているのか自分でも分からなくなってしまいました。もっとスッキリ書くコツはありますか?」
先生
「それは『戻り値(もどりち)』の扱い方を工夫するタイミングですね!『早期Return』というテクニックを使えば、複雑なIf文を劇的に短くできますよ。」
生徒
「ソウキリターン……?早く返すということですか?初心者でもすぐに使えるようになりますか?」
先生
「もちろんです!無駄な計算を省いて、プログラムの読みやすさを向上させる設計術を、分かりやすく解説しますね。」
1. 関数の「戻り値」とは?基本をおさらい
Excel VBAで Function(ファンクション)を作ると、その処理が終わったときに「計算結果」を呼び出し元に返してくれます。この結果のことを戻り値(もどりち)と呼びます。自動販売機にお金を入れると、飲み物が出てくる様子をイメージしてください。この「飲み物」が戻り値に当たります。
通常の設計では、関数名に値を代入することで戻り値を設定します。例えば MyFunction = 100 と書けば、その関数は「100」という結果を返します。しかし、プログラムが複雑になると、計算の途中で「もうこれ以上計算しなくていいよ!」という場面が出てきます。そこで役立つのが、効率的な戻り値の返し方なのです。関数設計の基本をマスターして、スマートな自動化を実現しましょう。
2. 早期Return(Exit Function)でコードを整理する
早期Return(そうきりたーん)とは、関数の中で「これ以上処理を進める必要がない」と判断した瞬間に、すぐに結果を返して処理を切り上げるテクニックです。VBAでは Exit Function(エグジット・ファンクション)という言葉を使います。
例えば、入力されたデータが空っぽだったら、その後の複雑な計算は全部無駄ですよね。最初に「もし空なら、ここで終わり!」と宣言して退出してしまうことで、後ろに続くメインの処理を If 文で囲む必要がなくなり、見た目が非常にスッキリします。これを専門用語で「ガード節」と呼んだりもしますが、初心者の方は「ダメなときは即退場!」と覚えておきましょう。これが読みやすいプログラム構成の第一歩です。
3. 実践!早期Returnを使った条件判定関数
まずは、早期Returnを使わない「ごちゃごちゃした書き方」と、使った「スッキリした書き方」を比較してみましょう。今回は「入力された数字が合格か」を判定する関数です。
' スッキリしない例:If文が入れ子になりやすい
Function JudgeNormal(score As Integer) As String
If score < 0 Then
JudgeNormal = "エラー:マイナスです"
Else
If score >= 80 Then
JudgeNormal = "合格"
Else
JudgeNormal = "不合格"
End If
End If
End Function
' スッキリした例:早期Return(Exit Function)を活用
Function JudgeFast(score As Integer) As String
' 1. まず異常なデータを追い出す(ガード)
If score < 0 Then
JudgeFast = "エラー:マイナスです"
Exit Function ' ここで関数終了!
End If
' 2. メインの処理(Ifの入れ子がなくなる)
If score >= 80 Then
JudgeFast = "合格"
Else
JudgeFast = "不合格"
End If
End Function
早期Returnを使うと、プログラムが階段のように深く(右側に長く)ならず、上から下へ流れるように読めるようになります。可読性(かどくせい)という、コードの読みやすさが劇的に向上します。
4. 計算順序を最適化して処理速度を上げる
関数の効率を高めるもう一つのポイントは、計算順序(けいさんじゅんじょ)です。パソコンは一つずつ順番に命令をこなしますが、重い計算(時間がかかる処理)を後回しにして、軽い計算(すぐに終わるチェック)を先に持ってくるのが鉄則です。
例えば、「何万行もあるデータを検索する」という重い処理の前に、「今日は日曜日か?」という簡単なチェックを入れれば、日曜日のときは重い処理を飛ばして終わることができます。これを意識するだけで、Excelが固まったり、動作が遅くなったりするのを防ぐことができます。パフォーマンス改善は、こうした小さな工夫の積み重ねです。
5. 実践!重い処理を避けるスマートな計算順序
具体的なコードで見てみましょう。ファイルを読み込むような重い作業の前に、基本的な条件を確認する設計です。
' 効率的な計算順序の例
Function GetDataSmart(id As String) As String
' 軽いチェックを先にする
If id = "" Then
GetDataSmart = "IDが空です"
Exit Function
End If
' IDの形式が正しいか先に確認
If Len(id) <> 5 Then
GetDataSmart = "IDの桁数が違います"
Exit Function
End If
' ここまで来たら、初めて「重い検索処理」を実行する
' GetDatabaseValueは架空の重い処理だと思ってください
GetDataSmart = GetDatabaseValue(id)
End Function
パソコンに詳しくない方でも、この「簡単なチェックから順番に並べる」というルールはすぐに取り入れられるはずです。これが効率的なアルゴリズムの基礎になります。
6. 戻り値を変数に一時保存するメリット
関数名に直接結果を代入するのも良いですが、複雑な計算の場合は一度「変数(へんすう)」という名前を付けた箱に結果を入れておき、最後にまとめて関数名に渡す方法もおすすめです。
途中で何度も関数名に値を上書きすると、最終的に何が返るのか分かりにくくなります。Dim result As String のように一時的な変数を作り、最後の1行で MyFunction = result と書くことで、デバッグ(間違い探し)がしやすくなります。VBAの変数活用術を組み合わせることで、より堅牢なプログラムになります。
7. 実践!一時変数を使った丁寧な戻り値処理
計算の過程が複数ある場合に、一時変数を使って結果を整える方法を紹介します。
' 値を加工して返す関数
Function FormatPrice(price As Long) As String
Dim tempResult As String
' 金額に応じた文字を作る
If price >= 10000 Then
tempResult = "高額商品:" & Format(price, "#,##0")
Else
tempResult = "通常商品:" & Format(price, "#,##0")
End If
' 最後に記号を付け加えるなどの共通加工
tempResult = "【" & tempResult & " 円】"
' 最後に一回だけ戻り値をセット
FormatPrice = tempResult
End Function
この書き方なら、後から「やっぱり【】じゃなくて★にしたい」と思ったときも、1箇所の修正で済みます。メンテナンス性(後から直しやすさ)を考えた優れた設計です。
8. Boolean(真偽値)を返す関数の賢い設計
「はい(True)」か「いいえ(False)」のどちらかを返す関数を Boolean(ブーリアン)型と呼びます。この場合、初期値が False であることを利用すると、さらにコードを短くできます。
わざわざ Else を書いて False を代入しなくても、条件に合ったときだけ True を代入して Exit Function すればいいのです。これを理解すると、VBAのロジック設計が一段と楽しくなります。初心者の方も、この「初期値を利用する」という考え方をぜひ身につけてください。
9. 実践!True/Falseをスマートに返すチェック関数
セルの値が入力されているかチェックする、よく使う関数のスッキリ版です。
' セルが空でないか確認する関数
Function IsFilled(cellAddr As String) As Boolean
' VBAでは、Booleanの初期値は自動的に False
' 条件に合致したときだけ True を返して即終了
If Range(cellAddr).Value <> "" Then
IsFilled = True
Exit Function
End If
' ここに来る場合は、自動的に初期値の False が返る
End Function
Sub CheckEntry()
' スッキリした関数を呼び出す
If IsFilled("A1") Then
MsgBox "入力されています!"
Else
MsgBox "A1が空っぽです。"
End If
End Sub
10. 効率的な関数設計がマクロの品質を決める
ここまで学んだ「早期Return」や「計算順序の最適化」は、プログラムが正しく動くためだけでなく、人間にとって「読みやすく」、パソコンにとって「負担が少ない」コードを書くための知恵です。
プログラミング未経験から始めた方は、まず「無駄な計算はさせない」「ダメな時はすぐに Exit する」という2点を意識してみてください。それだけで、あなたの書くVBAコードはプロ級の品質へと近づきます。Excelの自動化は、ただ動けばいいという段階から、こうした「設計の美しさ」を意識する段階へと進むことで、さらに面白くなっていきます。今日から自分の関数に Exit Function を取り入れて、スッキリ爽快なコードを書きましょう!