VBAのSubとFunctionの使い分けを徹底解説!初心者が迷いやすいポイントを解決
生徒
「VBAのコードを書くとき、一番最初に『Sub』って書く場合と『Function』って書く場合がありますよね。この二つはどう違うんですか?」
先生
「とても大切なポイントです。一言で言うと、『何か作業をお願いするだけ』なのが Sub で、『計算して結果を返してもらう』のが Function なんですよ。」
生徒
「なるほど!でも、どちらを使えばいいか迷ってしまう場面がありそうです。」
先生
「使い分けのコツさえ掴めば、プログラミングがもっと分かりやすくなります。基本的な違いから具体例まで、詳しく見ていきましょう!」
1. Sub(サブプロシージャ)とは?「命令を実行する」専門家
Excel VBAの基本となるのが Subプロシージャ です。これは、パソコンに対して「この作業をやっておいて!」と命令を出すためのものです。例えば、シートの色を塗る、文字を消す、印刷するといった具体的なアクション(動作)を担当します。
プログラミング未経験の方には、「家事代行サービス」をイメージしてもらうと分かりやすいでしょう。「掃除をしておいて」「洗濯をしておいて」と頼むだけで、作業が終わればそれで完了です。何かを手に持って戻ってくる必要はありません。VBAでマクロを記録したときに作成されるのも、この Sub プロシージャです。プロシージャ設計において、メインの動きを作るのがこの役割です。
2. Function(関数)とは?「結果を返してくれる」計算機
一方で、Functionプロシージャ(関数)は、何か計算や加工をお願いして、その「結果」を自分の方に持って帰ってきてもらうためのものです。材料を渡すと料理を返してくれる自動調理器のような存在です。
最大の特徴は、戻り値(もどりち)があることです。戻り値とは、処理が終わった後に手元に残る値のことです。例えば、「100円の商品の税込価格はいくら?」と聞いて、「110円です」と答えを返してもらうイメージです。自分で新しい計算式を作るようなものなので、エクセルの標準関数(SUMやAVERAGEなど)を自作している感覚に近いですね。関数設計をマスターすると、複雑な計算を何度も書く手間が省けます。
3. 実践!Subプロシージャでセルを操作してみよう
まずは、Subプロシージャを使って「セルに文字を入力して色を塗る」という作業を行ってみましょう。これは「一方的な命令」なので Sub が最適です。
' セルを装飾する Sub プロシージャ
Sub SetupSheet()
' A1セルに文字を入れる
Range("A1").Value = "こんにちはVBA"
' A1セルの背景を黄色にする
Range("A1").Interior.Color = vbYellow
MsgBox "作業が完了しました!"
End Sub
このコードを実行すると、エクセルの画面が直接書き換わります。作業が終わると「作業が完了しました!」と表示されますが、このプロシージャ自体が何か「答え」を抱えているわけではありません。これが Sub の特徴です。
4. 実践!Functionプロシージャで計算してみよう
次に、Functionプロシージャを使って「消費税を計算する」処理を作ってみましょう。材料(金額)を渡して、答え(税込価格)をもらいます。
' 消費税を計算する Function プロシージャ
Function AddTax(price As Long) As Long
' 計算結果を「自分自身の名前」に代入して返す
AddTax = price * 1.1
End Function
' Function を呼び出して使う Sub
Sub ShowPrice()
Dim finalPrice As Long
' 1000円を渡して、計算結果を受け取る
finalPrice = AddTax(1000)
MsgBox "税込価格は " & finalPrice & " 円です。"
End Sub
このように、AddTax(1000) と書くことで、計算機に 1000 を投げ込み、返ってきた 1100 という値を finalPrice という箱にしまっています。これが Function の使い方です。
5. 呼び出し方の違いを知ろう
Sub と Function では、呼び出し方(実行のさせ方)にも違いがあります。これも初心者がつまずきやすいポイントです。
- Sub の呼び出し:
Call プロシージャ名と書くか、単に名前だけを書きます。エクセルの「マクロ実行」画面から直接動かすこともできます。 - Function の呼び出し:
変数 = 関数名(引数)のように、何かの変数に代入して使うのが一般的です。単独で呼び出しても動きますが、せっかくの「答え」が捨てられてしまうのでもったいないです。
また、大きな違いとして、Function はエクセルのセルの中に数式として書き込めるという点があります。自作の関数を =AddTax(A1) のようにセルで使えるのは、Function だけの特権です。これにより業務効率化の幅が大きく広がります。
6. 実践!文字を加工して返す Function
計算だけでなく、文字を加工するのも Function の得意分野です。「名字」と「名前」をくっつけて、「様」を付けて返す関数を作ってみましょう。
' 宛名を作成する関数
Function MakeAtena(sei As String, mei As String) As String
' 二つを繋げて「様」を付ける
MakeAtena = sei & " " & mei & " 様"
End Function
' 実行して確認
Sub SendMail()
Dim fullAtena As String
' 田中さんと太郎さんを渡す
fullAtena = MakeAtena("田中", "太郎")
MsgBox "メールの宛先は「" & fullAtena & "」に決定しました。"
End Sub
実行結果は以下のようになります。
メールの宛先は「田中 太郎 様」に決定しました。
このように、特定の「加工ルール」を Function に閉じ込めておくと、後で「様」を「御中」に変えたくなった時、この関数一箇所を直すだけで全ての処理が修正できるため、保守性(メンテナンスのしやすさ)が非常に高まります。
7. 使い分けの判断基準:どっちを使うべき?
「この処理は Sub かな? Function かな?」と迷ったら、以下の質問を自分に投げかけてみてください。
| チェック項目 | Sub を使う | Function を使う |
|---|---|---|
| 目的は? | 作業・動作(印刷、色塗り、保存) | 計算・加工(消費税、文字結合) |
| 結果が欲しい? | いらない(やってくれればOK) | 欲しい(答えを受け取りたい) |
| セルで使いたい? | 使えない | 使える |
基本的には、「何かを変える」のが Sub、「何かを求める」のが Function と考えるとスッキリします。この使い分けを意識することで、あなたのコードは誰が見ても読みやすい、整理されたものになっていきます。
8. 実践!合体させて使うプロシージャ設計
実際の開発では、Sub と Function を組み合わせて使います。大きな作業を Sub で行い、その中の細かい計算を Function に任せるという モジュール化(部品化) の考え方です。
' メインの作業(Sub)
Sub CreateInvoice()
Dim gaku As Long
gaku = 5000
' 計算は Function に任せる
Dim total As Long
total = AddTax(gaku)
' 結果を使って、セルに書き込む(Subの仕事)
Range("B2").Value = total
MsgBox "請求書に金額を記入しました。"
End Sub
こうすることで、もし「税率が変わった」という場合でも、計算専用の Function だけを直せばよくなり、メインの作業手順(Sub)をいじらなくて済みます。これがエラーの少ないプログラミング設計のコツです。
9. 初心者がやりがちな間違い:戻り値を忘れる
Function を書くときに一番多いミスは、「最後に自分の名前に答えを代入し忘れる」ことです。代入を忘れると、関数は「空っぽ」のまま戻ってきてしまいます。
また、Sub の中で計算をして、その結果を他の場所でも使いたいのに Sub で作ってしまうこともよくあります。その値を「使い回したい」と思ったなら、それは Function に昇格させるべきサインです。パソコンに慣れていない方でも、「この計算結果、後でも使うかも?」と一度立ち止まって考えてみてください。それだけで、無駄のない綺麗なコードが書けるようになります。
10. 自分のルールを作って使いこなそう
VBAの世界には正解が一つではありませんが、基本のルールを知ることで迷いがなくなります。Sub は行動、Function は知識(計算ルール)を司るものとして、あなたのマクロという物語を組み立ててみてください。
まずは小さな Sub から書き始め、同じ計算が二回出てきたら Function にまとめてみる。そんな風に少しずつステップアップしていけば、気づいた時には複雑なシステムも自由自在に設計できるようになっているはずです。エクセルの自動化を楽しみながら、ぜひこの二つの使い分けをマスターして、脱・初心者を目指しましょう!