こんにちは!ぐーです。
いつもブログをご覧いただき、ありがとうございます!
「VBAを覚えれば楽になるはず」と思って始めたのに、Sub と Function の使い分けで、「どっちを使えばいいの?もう嫌だ…」と落ち込んでいませんか?
私も最初は同じことで悩んでいました。今日は、そんな悩みをわかりやすい方法で解決します。
それではいきましょう!
1. ズバリ、違いは「報告(戻り値)」があるかないか
教科書的な説明は一旦忘れてください。現場では、この1点だけ押さえればOKです。
- Subプロシージャ:作業をお願いしたら、やりっぱなしで終了。「やっといたよ!」で終わり。
- Functionプロシージャ:作業をお願いしたら、計算結果や答えを持って帰ってくる。「計算結果は〇〇円でした!」と戻ってくる。
この「持って帰ってくる答え」のことを、プログラミング用語で「戻り値(もどりち)」と呼びます。
2. イメージは「上司と部下」の関係
あなたが上司(メインのプログラム)だとして、部下(SubやFunction)に指示を出す場面を想像してください。
- Subへの指示:「Aさん、この書類をコピーしておいて」
Aさん(Sub)はコピーをして終了です。「コピーしました」とは言うかもしれませんが、あなたに何か「値」を渡すわけではありません。 - Functionへの指示:「Bさん、この見積書の消費税額を計算して教えて」
Bさん(Function)は計算し、「3,000円です」という数値(戻り値)をあなたに手渡します。あなたは、その3,000円を使って、次の処理(合計金額を出すなど)ができます。
3. 実際のコードで見てみよう(コピペOK)
では、実際に消費税(10%)を計算するコードで比較してみましょう。VBE(エディタ)に貼り付けて試してみてください。
① Subプロシージャの場合(やりっぱなし)
' 計算して、その場でメッセージを表示して終わる
Sub ShowTax_Sub()
Dim price As Long
price = 1000
' ここで計算し、ここで完結!
MsgBox "Subでの計算結果: " & price * 0.1
End Sub
② Functionプロシージャの場合(答えを返す)
' 計算担当のFunction(これ単体では動かないことが多いです)
Function GetTax_Func(price As Long) As Long
' 計算結果を「関数名」に入れることで、呼び出し元に返す
GetTax_Func = price * 0.1
End Function
' Functionを使うためのメインのSub
Sub Main()
Dim price As Long
Dim tax As Long
price = 1000
' Functionを呼び出して、結果(tax)を受け取る!
tax = GetTax_Func(price)
MsgBox "Functionから受け取った税額: " & tax
End Sub
Functionのほうは、tax = GetTax_Func(price) というように、計算結果を変数taxに代入できています。 これが「答えを受け取っている」状態です。
4. どう使い分ける?
「結局、どっちで書けばいいの?」と迷ったら、こう考えてください。
- 基本は Sub で書く
「ボタンを押したら処理開始」「データを転記する」など、動作そのものが目的の場合は Sub です。 - 「計算式」のような役割なら Function
「消費税計算」「氏名から苗字だけ抜き出す」など、何度も使う計算処理は Function にしておくと便利です。なぜなら、もし税率が変わっても、Function の中身を1箇所直すだけで、すべての計算が修正できるからです。
最後に
こうしてみると「難しそう…」と思っていた壁が、少し低く見えてきませんか?
ITやプログラミングは、最初から完璧に理解する必要はありません。まずは「答えが返ってくるのがFunction」という点だけ覚えていれば大丈夫です。
お察しの良い人はお気づきかもしれませんが、「さまざまなFunctionをたくさん用意しておいて、必要なときに組み合わせて業務用ツールを開発する」ことも可能です。
もっと高度で複雑な業務ツールやシステム開発ではそうしていることが多いです。
つまり、今回の内容を理解していると、ゆくゆく応用が効きやすいということです!
一緒にがんばっていきましょう!
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を厳選して紹介します。 もう本選びで失敗したくない方は、ぜひ参考にしてみてください。

コメント