<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Function &#8211; biz-tactics</title>
	<atom:link href="https://mashukabu.com/tag/function/feed/" rel="self" type="application/rss+xml" />
	<link>https://mashukabu.com</link>
	<description></description>
	<lastBuildDate>Tue, 09 Jun 2026 01:45:49 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://mashukabu.com/wp-content/uploads/2022/04/cropped-site-icon-32x32.png</url>
	<title>Function &#8211; biz-tactics</title>
	<link>https://mashukabu.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>VBAのFunctionプロシージャの使い方｜SubとFunctionの違いと戻り値の返し方</title>
		<link>https://mashukabu.com/excel-vba-howto-use-function/</link>
					<comments>https://mashukabu.com/excel-vba-howto-use-function/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Tue, 09 Jun 2026 01:45:49 +0000</pubDate>
				<category><![CDATA[VBA・マクロ]]></category>
		<category><![CDATA[Function]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[プロシージャ]]></category>
		<category><![CDATA[ユーザー定義関数]]></category>
		<category><![CDATA[引数]]></category>
		<category><![CDATA[戻り値]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=7886</guid>

					<description><![CDATA[VBAのFunctionプロシージャの使い方を初心者向けに解説。Subとの違い・戻り値の返し方・呼び出し方法から、引数のByVal/ByRef、複数の戻り値を返す設計パターン、On Errorによるエラー処理まで実務コード付きで紹介します。ExcelのLAMBDA関数との使い分けも整理しました。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">VBAで「Subは書けるようになったけれど、Functionプロシージャはいつ使うの？」と感じていませんか。</p>



<p class="wp-block-paragraph">SubとFunctionは見た目が似ていますが、役割がはっきり違います。この違いを理解すると、コードがぐっと整理しやすくなります。</p>



<p class="wp-block-paragraph">この記事では、Functionプロシージャの基本構文から戻り値の返し方、呼び出し方、SubとFunctionの使い分けまでを解説します。引数のByVal/ByRefの違いや、複数の値を返す設計パターン、エラー処理の組み込み方も実務コードで紹介します。最後にExcelのLAMBDA関数との使い分けも整理しました。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-1" checked><label class="toc-title" for="toc-checkbox-1">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">VBAのFunctionプロシージャとは？</a><ol><li><a href="#toc2" tabindex="0">SubとFunctionの違い</a></li></ol></li><li><a href="#toc3" tabindex="0">Functionプロシージャの基本構文と戻り値の返し方</a><ol><li><a href="#toc4" tabindex="0">実際に書いてみる</a></li><li><a href="#toc5" tabindex="0">VBEの起動とコードの準備</a></li><li><a href="#toc6" tabindex="0">戻り値の代入を忘れるとどうなるか</a></li></ol></li><li><a href="#toc7" tabindex="0">Functionプロシージャの呼び出し方</a><ol><li><a href="#toc8" tabindex="0">戻り値を受け取る呼び出し方</a></li><li><a href="#toc9" tabindex="0">戻り値を使わずに呼び出す方法</a></li></ol></li><li><a href="#toc10" tabindex="0">SubとFunctionの使い分け基準</a></li><li><a href="#toc11" tabindex="0">引数の渡し方｜ByValとByRefの違い</a><ol><li><a href="#toc12" tabindex="0">ByValとByRefの違い</a></li><li><a href="#toc13" tabindex="0">実際の動作を比べる</a></li><li><a href="#toc14" tabindex="0">安全のためのおすすめ</a></li></ol></li><li><a href="#toc15" tabindex="0">複数の戻り値が必要なときの設計パターン</a><ol><li><a href="#toc16" tabindex="0">パターン1: ByRef引数で複数の値を返す</a></li><li><a href="#toc17" tabindex="0">パターン2: 配列を返す</a></li><li><a href="#toc18" tabindex="0">パターン3: ユーザー定義型を返す</a></li></ol></li><li><a href="#toc19" tabindex="0">Functionプロシージャにエラー処理を組み込む（On Error）</a><ol><li><a href="#toc20" tabindex="0">基本のエラー処理パターン</a></li><li><a href="#toc21" tabindex="0">成否を呼び出し元に伝える</a></li></ol></li><li><a href="#toc22" tabindex="0">ユーザー定義関数（UDF）としてワークシートで使う</a><ol><li><a href="#toc23" tabindex="0">UDFの作り方と使い方</a></li><li><a href="#toc24" tabindex="0">UDFの制約に注意</a></li></ol></li><li><a href="#toc25" tabindex="0">VBA FunctionとExcelのLAMBDA関数の使い分け</a></li><li><a href="#toc26" tabindex="0">よくあるエラーと対処法</a></li><li><a href="#toc27" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">VBAのFunctionプロシージャとは？</span></h2>



<p class="wp-block-paragraph">VBAのFunctionプロシージャは、処理を実行して<strong>結果（戻り値）を呼び出し元に返す</strong>ためのプロシージャです。</p>



<p class="wp-block-paragraph">一方、Subプロシージャは処理を実行するだけで、結果を返しません。この「結果を返せるかどうか」が両者の最大の違いです。</p>



<p class="wp-block-paragraph">たとえば「消費税を計算する」処理を考えてみましょう。計算した税込金額を呼び出し元で受け取って使いたいですよね。こういうときにFunctionが活躍します。</p>



<h3 class="wp-block-heading"><span id="toc2">SubとFunctionの違い</span></h3>



<p class="wp-block-paragraph">まずは両者の違いを表で整理します。</p>



<figure class="wp-block-table"><table><thead><tr><th>項目</th><th>Subプロシージャ</th><th>Functionプロシージャ</th></tr></thead><tbody><tr><td>役割</td><td>処理を実行する</td><td>処理を実行して結果を返す</td></tr><tr><td>戻り値</td><td>なし</td><td>あり</td></tr><tr><td>開始と終了</td><td><code>Sub ～ End Sub</code></td><td><code>Function ～ End Function</code></td></tr><tr><td>呼び出し方</td><td><code>名前 引数</code> または <code>Call 名前(引数)</code></td><td><code>変数 = 名前(引数)</code></td></tr><tr><td>主な用途</td><td>セルの書き込み・書式設定など</td><td>計算結果・判定結果を返す</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">ざっくり言うと、<strong>「何かを実行したいだけならSub」「結果を受け取りたいならFunction」</strong>という使い分けになります。</p>



<p class="wp-block-paragraph">プロシージャの種類全体については「<a href="https://mashukabu.com/excel-vba-project-module-procedure/">VBAのプロジェクト・モジュール・プロシージャの違いと役割</a>」でも解説しています。VBAの構成要素を整理したい方はあわせてご覧ください。</p>



<h2 class="wp-block-heading"><span id="toc3">Functionプロシージャの基本構文と戻り値の返し方</span></h2>



<p class="wp-block-paragraph">Functionプロシージャの基本構文は次のとおりです。</p>



<pre class="wp-block-code"><code>Function 関数名(引数) As 戻り値の型
    '--- 処理を書く ---
    関数名 = 戻り値
End Function</code></pre>



<p class="wp-block-paragraph">ポイントは2つあります。</p>



<ul class="wp-block-list"><li><code>As 戻り値の型</code> で、返す値の型を指定する</li><li><strong><code>関数名 = 戻り値</code> の形で、関数名に結果を代入する</strong></li></ul>



<p class="wp-block-paragraph">この「関数名に値を代入する」のが、Functionで戻り値を返す方法です。Subにはない、Function特有の書き方です。</p>



<h3 class="wp-block-heading"><span id="toc4">実際に書いてみる</span></h3>



<p class="wp-block-paragraph">消費税の税込金額を計算するFunctionを作ってみましょう。</p>



<pre class="wp-block-code"><code>Function 税込計算(金額 As Long) As Double
    税込計算 = 金額 * 1.1
End Function</code></pre>



<p class="wp-block-paragraph"><code>As Double</code> で戻り値が小数も扱える数値型であることを指定しています。そして <code>税込計算 = 金額 * 1.1</code> で、計算結果を関数名に代入しています。これで税込金額が呼び出し元に返ります。</p>



<p class="wp-block-paragraph">税率1.1を掛けると小数が出ることがあるため、戻り値の型は整数型（Long）ではなく、小数を扱えるDouble型にしておくのが安全です。整数型で受け取ると小数部分が丸められ、金額がずれてしまう場合があります。</p>



<p class="wp-block-paragraph">ここからは実際にコピペして動かせるコードを紹介していきます。VBE（Visual Basic Editor）を開いて、標準モジュールに貼り付けてみてください。</p>



<h3 class="wp-block-heading"><span id="toc5">VBEの起動とコードの準備</span></h3>



<p class="wp-block-paragraph">VBEはExcelからすぐに開けます。起動方法は次のとおりです。</p>



<ul class="wp-block-list"><li><strong>ショートカットキー</strong>: Alt + F11 を押す（最も手軽）</li><li><strong>リボンから</strong>: 「開発」タブ →「Visual Basic」をクリック</li></ul>



<p class="wp-block-paragraph">「開発」タブが表示されていない場合は、次の手順で追加できます。</p>



<ol class="wp-block-list"><li>「ファイル」→「オプション」を開く</li><li>「リボンのユーザー設定」を選択</li><li>右側の一覧で「開発」にチェックを入れて「OK」</li></ol>



<p class="wp-block-paragraph">VBEが開いたら、「挿入」メニュー →「標準モジュール」を選択してください。コードの貼り付け先ができます。</p>



<h3 class="wp-block-heading"><span id="toc6">戻り値の代入を忘れるとどうなるか</span></h3>



<p class="wp-block-paragraph">注意点として、<code>関数名 = 戻り値</code> の代入を忘れると、戻り値はその型の既定値になります。数値型なら0、文字列型なら空文字が返ってしまいます。</p>



<pre class="wp-block-code"><code>Function 税込計算(金額 As Long) As Double
    '--- 代入を忘れた例。戻り値は常に0になる ---
    Dim 結果 As Double '計算結果を入れる変数
    結果 = 金額 * 1.1
End Function</code></pre>



<p class="wp-block-paragraph">この例では <code>結果</code> という変数に計算しただけで、関数名 <code>税込計算</code> に代入していません。そのため戻り値は0のままです。エラーは出ないので、原因に気づきにくいミスです。戻り値は必ず関数名に代入しましょう。</p>



<h2 class="wp-block-heading"><span id="toc7">Functionプロシージャの呼び出し方</span></h2>



<p class="wp-block-paragraph">作ったFunctionは、別のプロシージャから呼び出して使います。呼び出し方には2通りあります。</p>



<h3 class="wp-block-heading"><span id="toc8">戻り値を受け取る呼び出し方</span></h3>



<p class="wp-block-paragraph">戻り値を変数で受け取るときは、<strong>カッコを付けて <code>変数 = 関数名(引数)</code></strong> と書きます。</p>



<pre class="wp-block-code"><code>Sub テスト()
    Dim 結果 As Double '税込金額を受け取る変数
    結果 = 税込計算(1000) '戻り値は1100になる
    MsgBox &quot;税込金額は &quot; &amp; 結果 &amp; &quot; 円です&quot;
End Sub</code></pre>



<p class="wp-block-paragraph"><code>税込計算(1000)</code> の戻り値1100が、変数 <code>結果</code> に代入されます。これがFunctionの最も基本的な使い方です。</p>



<h3 class="wp-block-heading"><span id="toc9">戻り値を使わずに呼び出す方法</span></h3>



<p class="wp-block-paragraph">戻り値を使わずに、Subのように実行だけしたい場合は、カッコなしで <code>関数名 引数</code> と書くか、<code>Call 関数名(引数)</code> と書きます。</p>



<pre class="wp-block-code"><code>Sub テスト2()
    税込計算 1000 '戻り値は捨てられる
End Sub</code></pre>



<p class="wp-block-paragraph">このとき戻り値1100は受け取られず、捨てられます。Functionは戻り値を受け取らない使い方もできますが、それならSubで書くほうが自然です。</p>



<p class="wp-block-paragraph">カッコの使い方には注意が必要です。<strong>戻り値を受け取るときはカッコを付ける、実行だけならカッコを付けない</strong>と覚えておきましょう。</p>



<h2 class="wp-block-heading"><span id="toc10">SubとFunctionの使い分け基準</span></h2>



<p class="wp-block-paragraph">「どちらで書けばいいか迷う」という方のために、使い分けの基準を整理します。</p>



<p class="wp-block-paragraph">判断の軸はシンプルです。<strong>「呼び出し元で結果を受け取って使うか」</strong>で決めます。</p>



<ul class="wp-block-list"><li><strong>結果を受け取って使う</strong> → Function（計算結果・判定結果・変換結果など）</li><li><strong>実行するだけで結果は要らない</strong> → Sub（セルへの書き込み・書式設定・並べ替えなど）</li></ul>



<p class="wp-block-paragraph">具体例で見てみましょう。</p>



<figure class="wp-block-table"><table><thead><tr><th>やりたいこと</th><th>適したプロシージャ</th><th>理由</th></tr></thead><tbody><tr><td>税込金額を計算して受け取る</td><td>Function</td><td>計算結果を呼び出し元で使う</td></tr><tr><td>セルA1に値を書き込む</td><td>Sub</td><td>実行するだけで戻り値は不要</td></tr><tr><td>文字列が有効なメールアドレスか判定する</td><td>Function</td><td>True/Falseの判定結果を返す</td></tr><tr><td>シート全体を並べ替える</td><td>Sub</td><td>並べ替えを実行するだけ</td></tr><tr><td>2つの日付の営業日数を計算する</td><td>Function</td><td>日数を計算して返す</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">迷ったときは「この処理の結果を、別の場所で使うか」を自問してみてください。使うならFunctionです。</p>



<h2 class="wp-block-heading"><span id="toc11">引数の渡し方｜ByValとByRefの違い</span></h2>



<p class="wp-block-paragraph">Functionに値を渡す「引数」には、2つの渡し方があります。ByVal（値渡し）とByRef（参照渡し）です。</p>



<p class="wp-block-paragraph">この違いを知らないと、思わぬバグに悩まされることがあります。しっかり押さえておきましょう。</p>



<h3 class="wp-block-heading"><span id="toc12">ByValとByRefの違い</span></h3>



<p class="wp-block-paragraph">両者の違いは「呼び出し元の変数そのものを渡すか、コピーを渡すか」です。</p>



<figure class="wp-block-table"><table><thead><tr><th>渡し方</th><th>渡すもの</th><th>Function内で変更すると</th><th>既定値</th></tr></thead><tbody><tr><td>ByVal（値渡し）</td><td>変数のコピー</td><td>呼び出し元は変わらない</td><td>いいえ</td></tr><tr><td>ByRef（参照渡し）</td><td>変数そのもの</td><td>呼び出し元も変わる</td><td>はい</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">VBAでは引数の指定を省略すると、自動的にByRef（参照渡し）になります。この点が事故のもとになりやすいので注意が必要です。</p>



<h3 class="wp-block-heading"><span id="toc13">実際の動作を比べる</span></h3>



<p class="wp-block-paragraph">次のコードで、ByValとByRefの違いを確認してみましょう。</p>



<pre class="wp-block-code"><code>Function ByVal版(ByVal n As Long) As Long
    n = n + 100 '引数を変更する
    ByVal版 = n
End Function

Function ByRef版(ByRef n As Long) As Long
    n = n + 100 '引数を変更する
    ByRef版 = n
End Function

Sub 比較テスト()
    Dim x As Long '元の値を入れる変数
    x = 10
    MsgBox ByVal版(x) &amp; &quot; / 元の値: &quot; &amp; x '結果は「110 / 元の値: 10」
    x = 10
    MsgBox ByRef版(x) &amp; &quot; / 元の値: &quot; &amp; x '結果は「110 / 元の値: 110」
End Sub</code></pre>



<p class="wp-block-paragraph">ByVal版では、呼び出し元の <code>x</code> は10のまま変わりません。コピーを渡しているからです。一方、ByRef版では <code>x</code> が110に書き換わってしまいます。変数そのものを渡しているためです。</p>



<h3 class="wp-block-heading"><span id="toc14">安全のためのおすすめ</span></h3>



<p class="wp-block-paragraph">意図せず呼び出し元の変数を書き換える事故を防ぐには、<strong>変更する必要のない引数にはByValを明示する</strong>のがおすすめです。</p>



<pre class="wp-block-code"><code>Function 税込計算(ByVal 金額 As Long) As Double
    税込計算 = 金額 * 1.1
End Function</code></pre>



<p class="wp-block-paragraph">こうしておけば、Function内で <code>金額</code> をうっかり変更しても、呼び出し元には影響しません。コードの安全性が高まります。なお戻り値の型は、先ほどと同じく小数を扱えるDouble型にしている点もあわせて確認してください。</p>



<h2 class="wp-block-heading"><span id="toc15">複数の戻り値が必要なときの設計パターン</span></h2>



<p class="wp-block-paragraph">Functionの戻り値は1つだけです。しかし実務では「計算結果と一緒に、成否や付随情報も返したい」という場面があります。そんなときの設計パターンを3つ紹介します。</p>



<h3 class="wp-block-heading"><span id="toc16">パターン1: ByRef引数で複数の値を返す</span></h3>



<p class="wp-block-paragraph">ByRefの「呼び出し元の変数を書き換える」性質を逆手に取る方法です。返したい値の数だけByRef引数を用意します。</p>



<pre class="wp-block-code"><code>Function 割り算(ByVal a As Long, ByVal b As Long, ByRef 余り As Long) As Long
    割り算 = a  b '商を戻り値で返す
    余り = a Mod b '余りはByRef引数で返す
End Function

Sub パターン1テスト()
    Dim あまり As Long '余りを受け取る変数
    Dim 商 As Long '商を受け取る変数
    商 = 割り算(17, 5, あまり)
    MsgBox &quot;商は &quot; &amp; 商 &amp; &quot;、余りは &quot; &amp; あまり '結果は「商は3、余りは2」
End Sub</code></pre>



<p class="wp-block-paragraph">主たる結果（商）は戻り値で、付随する結果（余り）はByRef引数で返しています。読みやすく、実務でよく使うパターンです。</p>



<h3 class="wp-block-heading"><span id="toc17">パターン2: 配列を返す</span></h3>



<p class="wp-block-paragraph">複数の値をまとめて返したいときは、配列を戻り値にする方法があります。戻り値の型をVariantにします。</p>



<pre class="wp-block-code"><code>Function 最小最大(ByVal 範囲 As Range) As Variant
    Dim 結果(1) As Long '0番目に最小、1番目に最大を入れる
    結果(0) = WorksheetFunction.Min(範囲)
    結果(1) = WorksheetFunction.Max(範囲)
    最小最大 = 結果
End Function

Sub パターン2テスト()
    Dim v As Variant '配列を受け取る変数
    v = 最小最大(Range(&quot;A1:A10&quot;))
    MsgBox &quot;最小 &quot; &amp; v(0) &amp; &quot; / 最大 &quot; &amp; v(1)
End Sub</code></pre>



<p class="wp-block-paragraph">関連する複数の値（最小と最大など）をセットで返したいときに向いています。</p>



<h3 class="wp-block-heading"><span id="toc18">パターン3: ユーザー定義型を返す</span></h3>



<p class="wp-block-paragraph">「名前・点数・判定」のような構造化したデータをまとめて返したいときは、ユーザー定義型（Type）を使います。</p>



<pre class="wp-block-code"><code>Type 成績データ
    名前 As String
    点数 As Long
    判定 As String
End Type

Function 成績作成(ByVal nm As String, ByVal pt As Long) As 成績データ
    Dim d As 成績データ '組み立て用の変数
    d.名前 = nm
    d.点数 = pt
    If pt &gt;= 60 Then d.判定 = &quot;合格&quot; Else d.判定 = &quot;不合格&quot;
    成績作成 = d
End Function</code></pre>



<p class="wp-block-paragraph">少し高度ですが、関連する複数の項目を意味のあるまとまりとして返せます。データの中身が増えても引数を増やさずに済むのが利点です。</p>



<h2 class="wp-block-heading"><span id="toc19">Functionプロシージャにエラー処理を組み込む（On Error）</span></h2>



<p class="wp-block-paragraph">Functionの中で予期しないエラーが起きると、処理が止まってしまいます。これを防ぐのが <code>On Error</code> によるエラーハンドリングです。</p>



<h3 class="wp-block-heading"><span id="toc20">基本のエラー処理パターン</span></h3>



<p class="wp-block-paragraph"><code>On Error GoTo ラベル</code> を使うと、エラー発生時に指定したラベルへジャンプできます。</p>



<pre class="wp-block-code"><code>Function 安全な割り算(ByVal a As Double, ByVal b As Double) As Double
    On Error GoTo エラー処理
    安全な割り算 = a / b '0で割るとエラーになる
    Exit Function '正常時はここで終了する
エラー処理:
    安全な割り算 = 0 'エラー時は0を返す
End Function</code></pre>



<p class="wp-block-paragraph">このコードのポイントは2つです。</p>



<ul class="wp-block-list"><li><strong><code>Exit Function</code></strong> で正常処理を終え、エラー処理部分に入らないようにする</li><li>エラーが起きたら <code>エラー処理</code> ラベルへジャンプし、戻り値に0を設定する</li></ul>



<p class="wp-block-paragraph"><code>Exit Function</code> を書き忘れると、正常時でもエラー処理のコードが実行されてしまいます。必ず正常系の最後に入れましょう。</p>



<h3 class="wp-block-heading"><span id="toc21">成否を呼び出し元に伝える</span></h3>



<p class="wp-block-paragraph">戻り値で「成功か失敗か」を伝える設計も実務で役立ちます。Boolean型を返し、ByRef引数で計算結果を渡すパターンです。</p>



<pre class="wp-block-code"><code>Function 数値変換(ByVal 文字 As String, ByRef 結果 As Double) As Boolean
    On Error GoTo エラー処理
    結果 = CDbl(文字) '数値に変換する
    数値変換 = True '成功
    Exit Function
エラー処理:
    数値変換 = False '失敗
End Function</code></pre>



<p class="wp-block-paragraph">呼び出し元では、戻り値のTrue/Falseで成否を判定し、成功時だけ結果を使えます。エラー処理の考え方は<a href="https://mashukabu.com/excel-vba-conditional-branch-explanation/">VBAのIf文（条件分岐）</a>とあわせて学ぶと理解が深まります。</p>



<h2 class="wp-block-heading"><span id="toc22">ユーザー定義関数（UDF）としてワークシートで使う</span></h2>



<p class="wp-block-paragraph">標準モジュールに作ったFunctionは、ワークシートのセルからも呼び出せます。これを<strong>ユーザー定義関数（UDF: User Defined Function）</strong>といいます。</p>



<p class="wp-block-paragraph">SUM関数やIF関数のように、自分だけのオリジナル関数をセルで使えるようになります。</p>



<h3 class="wp-block-heading"><span id="toc23">UDFの作り方と使い方</span></h3>



<p class="wp-block-paragraph">先ほどの税込計算をUDFとして使ってみましょう。標準モジュールに次のFunctionを書きます。</p>



<pre class="wp-block-code"><code>Function 税込(ByVal 金額 As Double) As Double
    税込 = 金額 * 1.1
End Function</code></pre>



<p class="wp-block-paragraph">あとはワークシートのセルに <code>=税込(A1)</code> と入力するだけです。A1の金額に対する税込金額が表示されます。SUM関数と同じ感覚で使えます。</p>



<h3 class="wp-block-heading"><span id="toc24">UDFの制約に注意</span></h3>



<p class="wp-block-paragraph">UDFには重要な制約があります。<strong>セルの値の取得や計算はできますが、セルへの書き込みや書式設定はできません。</strong></p>



<figure class="wp-block-table"><table><thead><tr><th>UDFでできること</th><th>UDFでできないこと</th></tr></thead><tbody><tr><td>セルの値を読み取る</td><td>他のセルに値を書き込む</td></tr><tr><td>計算して結果を返す</td><td>セルの色や書式を変える</td></tr><tr><td>文字列を加工して返す</td><td>シートの並べ替えを実行する</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">セルを操作したい場合はSubプロシージャを使います。UDFはあくまで「値を計算して返すだけ」と覚えておきましょう。</p>



<p class="wp-block-paragraph">なお、Privateで宣言したFunctionはワークシートから呼び出せません。UDFにしたいFunctionは <code>Function</code> または <code>Public Function</code> で宣言してください。UDFを使うブックは、必ずマクロ有効ブック（.xlsm）で保存しましょう。</p>



<h2 class="wp-block-heading"><span id="toc25">VBA FunctionとExcelのLAMBDA関数の使い分け</span></h2>



<p class="wp-block-paragraph">Excel 2021やMicrosoft 365では、VBAを使わずにワークシートの数式だけでカスタム関数を作れる<a href="https://mashukabu.com/excel-let-lambda-function-guide/">LAMBDA関数</a>が登場しました。</p>



<p class="wp-block-paragraph">「カスタム関数を作るなら、VBAとLAMBDAのどちらを選ぶべきか」は多くの方が悩む点です。実務観点で比較します。</p>



<figure class="wp-block-table"><table><thead><tr><th>観点</th><th>VBA Functionプロシージャ</th><th>LAMBDA関数</th></tr></thead><tbody><tr><td>作成手段</td><td>VBAコード（VBE）</td><td>数式のみ</td></tr><tr><td>保存形式</td><td>xlsm（マクロ有効ブック）</td><td>xlsx</td></tr><tr><td>セキュリティ警告</td><td>出る</td><td>出ない</td></tr><tr><td>対応バージョン</td><td>VBA対応のExcel全般</td><td>Microsoft 365のみ</td></tr><tr><td>可能な処理</td><td>ファイル操作・API呼出・複雑な制御も可</td><td>数式で書ける範囲</td></tr><tr><td>学習コスト</td><td>VBA文法を学ぶ必要あり</td><td>Excelの数式知識のみ</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">判断基準を実務シーン別に整理すると次のようになります。</p>



<ul class="wp-block-list"><li><strong>数式で書ける計算（税込・営業日・評価判定など）</strong> → LAMBDA</li><li><strong>xlsxのまま配布したい・マクロ警告を避けたい</strong> → LAMBDA</li><li><strong>Excel 2019以前の旧バージョンユーザーがいる</strong> → VBA Function</li><li><strong>ファイル操作・正規表現・外部API呼び出しが必要</strong> → VBA Function</li></ul>



<p class="wp-block-paragraph">おすすめのアプローチは「まずLAMBDAで実装してみて、数式ではできない処理だけVBA Functionに移す」という考え方です。LAMBDA関数の詳しい使い方は「<a href="https://mashukabu.com/excel-let-lambda-function-guide/">ExcelのLET・LAMBDA関数の使い方</a>」で解説しています。</p>



<h2 class="wp-block-heading"><span id="toc26">よくあるエラーと対処法</span></h2>



<p class="wp-block-paragraph">Functionプロシージャでつまずきやすいエラーと対処法をまとめました。</p>



<figure class="wp-block-table"><table><thead><tr><th>エラー・症状</th><th>原因</th><th>対処法</th></tr></thead><tbody><tr><td>戻り値が常に0や空文字になる</td><td>関数名への代入忘れ</td><td><code>関数名 = 値</code> の代入を必ず書く</td></tr><tr><td>戻り値が反映されない</td><td>関数名と別の変数に代入している</td><td>代入先を関数名に修正する</td></tr><tr><td>型が一致しませんエラー</td><td>戻り値の型と受け取る変数の型が違う</td><td>型を揃えるか型変換関数を使う</td></tr><tr><td>呼び出し時にコンパイルエラー</td><td>戻り値を受け取るのにカッコがない</td><td><code>変数 = 関数名(引数)</code> と書く</td></tr><tr><td>呼び出し元の変数が勝手に変わる</td><td>ByRefで引数を渡している</td><td>変更不要な引数はByValを明示する</td></tr><tr><td>UDFがセルで動かない（無反応）</td><td>UDF内でセル操作をしている</td><td>UDFは値を返すだけにする</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">マクロを保存するときはファイル形式に注意してください。<strong>「Excelマクロ有効ブック（.xlsm）」</strong>を選びましょう。通常の .xlsx で保存すると、書いたマクロが消えてしまいます。</p>



<h2 class="wp-block-heading"><span id="toc27">まとめ</span></h2>



<p class="wp-block-paragraph">この記事では、VBAのFunctionプロシージャについて基本から実務活用まで解説しました。</p>



<p class="wp-block-paragraph">ポイントをおさらいしておきましょう。</p>



<ul class="wp-block-list"><li>Functionは <strong>処理を実行して戻り値を返す</strong> プロシージャ。Subは戻り値を返さない</li><li>戻り値は <strong><code>関数名 = 値</code></strong> の形で代入する。代入忘れに注意</li><li>呼び出しは <strong>戻り値を受け取るときカッコあり、実行だけならカッコなし</strong></li><li><strong>結果を受け取って使うならFunction、実行だけならSub</strong> で使い分ける</li><li>引数は <strong>変更不要ならByValを明示</strong> して事故を防ぐ</li><li>複数の値を返すには <strong>ByRef引数・配列・ユーザー定義型</strong> の3パターン</li><li>エラー処理は <strong>On Error GoTo + Exit Function</strong> で正常系と分離する</li><li>標準モジュールのFunctionは <strong>UDF</strong> としてセルでも使える（値を返すだけ）</li></ul>



<p class="wp-block-paragraph">まずはこの記事のサンプルコードをコピーして動かしてみてください。自分で書いて動かすと、SubとFunctionの違いがすっと腑に落ちますよ。</p>



<p class="wp-block-paragraph">Functionの基礎を理解したら、次は<a href="https://mashukabu.com/excel-vba-project-module-procedure/">VBAのプロジェクト・モジュール・プロシージャの違い</a>でコードの整理術を学んでみましょう。条件分岐の<a href="https://mashukabu.com/excel-vba-conditional-branch-explanation/">VBAのIf文</a>や<a href="https://mashukabu.com/excel-vba-howto-use-select-case/">Select Case文</a>とあわせて使えば、より実践的なマクロが書けるようになります。数式でカスタム関数を作りたい方は<a href="https://mashukabu.com/excel-let-lambda-function-guide/">ExcelのLET・LAMBDA関数の使い方</a>もあわせてご覧ください。VBA学習全体の進め方は<a href="https://mashukabu.com/excel-vba-learning-roadmap/">VBA学習の順番とロードマップ</a>を参考にしてみてください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/excel-vba-howto-use-function/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
