<?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>プロシージャ &#8211; biz-tactics</title>
	<atom:link href="https://mashukabu.com/tag/%E3%83%97%E3%83%AD%E3%82%B7%E3%83%BC%E3%82%B8%E3%83%A3/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.1</generator>

<image>
	<url>https://mashukabu.com/wp-content/uploads/2022/04/cropped-site-icon-32x32.png</url>
	<title>プロシージャ &#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>
		<item>
		<title>VBAのプロジェクト・モジュール・プロシージャの違い｜3つの構成要素の役割を初心者向けに解説</title>
		<link>https://mashukabu.com/excel-vba-project-module-procedure/</link>
					<comments>https://mashukabu.com/excel-vba-project-module-procedure/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Sat, 20 Nov 2021 13:44:42 +0000</pubDate>
				<category><![CDATA[VBA・マクロ]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[VBE]]></category>
		<category><![CDATA[プロシージャ]]></category>
		<category><![CDATA[プロジェクト]]></category>
		<category><![CDATA[モジュール]]></category>
		<category><![CDATA[初心者向け]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=356</guid>

					<description><![CDATA[VBAのプロジェクト・モジュール・プロシージャの違いと役割を初心者向けに解説。会社組織の比喩で階層構造を理解し、5種類のモジュール（標準・ブック・シート・フォーム・クラス）と3種類のプロシージャ（Sub・Function・Property）の使い分けをコード例とVBE操作手順付きで整理します。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">VBAを触り始めたとき、「プロジェクト」「モジュール」「プロシージャ」という用語に戸惑った経験はありませんか。</p>



<p class="wp-block-paragraph">「とりあえず標準モジュールを追加して」と言われたものの、そもそもモジュールが何なのか分からない。そんな状態でコードを書き始めると、どこに何を書けばいいのか迷い続けることになります。</p>



<p class="wp-block-paragraph">この記事では、VBAの3つの構成要素であるプロジェクト・モジュール・プロシージャの違いと役割を、会社組織の比喩や具体的なコード例を交えて解説します。それぞれの関係性を理解すれば、コードの整理がぐっと楽になりますよ。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">VBAのプロジェクト・モジュール・プロシージャとは？3要素の関係</a></li><li><a href="#toc2" tabindex="0">プロジェクトとは｜VBAの最上位の箱</a><ol><li><a href="#toc3" tabindex="0">プロジェクトの3つの特徴</a></li><li><a href="#toc4" tabindex="0">プロジェクトのパスワード保護</a></li></ol></li><li><a href="#toc5" tabindex="0">モジュールとは｜コードをまとめる5種類のグループ</a><ol><li><a href="#toc6" tabindex="0">5種類のモジュールと使い分け</a></li><li><a href="#toc7" tabindex="0">標準モジュール｜まずはここに書けばOK</a></li><li><a href="#toc8" tabindex="0">ブックモジュール｜ブックを開いたときに動かす</a></li><li><a href="#toc9" tabindex="0">シートモジュール｜セルの変更に反応させる</a></li><li><a href="#toc10" tabindex="0">フォームモジュール｜入力画面の操作を制御する</a></li><li><a href="#toc11" tabindex="0">クラスモジュール｜独自の部品を作る上級者向け</a></li></ol></li><li><a href="#toc12" tabindex="0">プロシージャとは｜処理を実行する3種類の最小単位</a><ol><li><a href="#toc13" tabindex="0">3種類のプロシージャと使い分け</a></li><li><a href="#toc14" tabindex="0">Subプロシージャ｜マクロの基本形</a></li><li><a href="#toc15" tabindex="0">Functionプロシージャ｜結果を返したいとき</a></li><li><a href="#toc16" tabindex="0">Propertyプロシージャ｜クラスとセットで使う</a></li><li><a href="#toc17" tabindex="0">Sub・Functionの使い分けと呼び出し方</a></li></ol></li><li><a href="#toc18" tabindex="0">VBEで階層を確認する手順（プロジェクトエクスプローラー）</a><ol><li><a href="#toc19" tabindex="0">手順1：VBEを起動する</a></li><li><a href="#toc20" tabindex="0">手順2：プロジェクトエクスプローラーを表示する</a></li><li><a href="#toc21" tabindex="0">手順3：標準モジュールを挿入する</a></li></ol></li><li><a href="#toc22" tabindex="0">実務でのコード整理術｜モジュールの分け方</a><ol><li><a href="#toc23" tabindex="0">機能ごとにモジュールを分ける</a></li><li><a href="#toc24" tabindex="0">共通処理はFunctionにまとめる</a></li></ol></li><li><a href="#toc25" tabindex="0">よくある質問（FAQ）</a><ol><li><a href="#toc26" tabindex="0">Q. マクロの記録で作ったコードはどこに入りますか？</a></li><li><a href="#toc27" tabindex="0">Q. モジュールはいくつ作ればよいですか？</a></li><li><a href="#toc28" tabindex="0">Q. シートモジュールに書いたマクロが「マクロ」ダイアログに出てきません</a></li><li><a href="#toc29" tabindex="0">Q. SubとFunctionはどちらを使えばよいですか？</a></li><li><a href="#toc30" tabindex="0">Q. プロジェクト名は変更してもよいですか？</a></li></ol></li><li><a href="#toc31" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">VBAのプロジェクト・モジュール・プロシージャとは？3要素の関係</span></h2>



<p class="wp-block-paragraph">VBAの構成は「入れ子構造（階層構造）」になっています。会社組織に例えると、一気にイメージしやすくなります。</p>



<figure class="wp-block-table"><table><thead><tr><th>VBAの構成要素</th><th>会社組織の例え</th><th>役割</th></tr></thead><tbody><tr><td>プロジェクト</td><td>会社全体</td><td>ワークブック1つに対して1つ存在する最上位の箱</td></tr><tr><td>モジュール</td><td>部署（営業部・経理部など）</td><td>コードをまとめるグループ。種類ごとに役割が異なる</td></tr><tr><td>プロシージャ</td><td>担当者</td><td>実際の処理内容を記述する最小単位</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">つまり、<strong>プロジェクトの中にモジュールがあり、モジュールの中にプロシージャがある</strong>という3階層の関係です。</p>



<p class="wp-block-paragraph">イメージとしては、次のような入れ子で覚えておくと混乱しません。</p>



<pre class="wp-block-code"><code>VBAProject（プロジェクト）
├── 標準モジュール（Module1）
│   ├── Sub マクロA
│   └── Sub マクロB
├── ThisWorkbook（ブックモジュール）
│   └── Workbook_Open
└── Sheet1（シートモジュール）
    └── Worksheet_Change</code></pre>



<p class="wp-block-paragraph">会社で言えば、会社（プロジェクト）の中に部署（モジュール）があり、部署の中に担当者（プロシージャ）がいる構図です。担当者が実際の仕事をするように、プロシージャが実際の処理を行います。</p>



<p class="wp-block-paragraph">この3階層は、VBE（Visual Basic Editor）の左側にある「プロジェクトエクスプローラー」で目で見て確認できます。VBEの画面構成について詳しくは「<a href="https://mashukabu.com/excel-vba-vbe-menu-explanation/">VBEの画面の見方を図解で解説</a>」を参考にしてください。</p>



<p class="wp-block-paragraph">なお、VBAとマクロの言葉の違いがあいまいな方は、先に「<a href="https://mashukabu.com/excel-vba-macro-difference/">Excel VBAとマクロの違い</a>」を読んでおくと理解がスムーズです。</p>



<h2 class="wp-block-heading"><span id="toc2">プロジェクトとは｜VBAの最上位の箱</span></h2>



<p class="wp-block-paragraph">プロジェクトは、VBAの構成要素の中で最も大きな「箱」です。すべてのモジュールとプロシージャは、このプロジェクトの中に収まります。</p>



<p class="wp-block-paragraph">Excelのワークブック1つにつき、VBAプロジェクトが1つ自動的に作成されます。新しいワークブックを作ると、VBE上に「VBAProject (Book1)」のように表示されるのがプロジェクトです。自分でわざわざ作る必要はありません。</p>



<h3 class="wp-block-heading"><span id="toc3">プロジェクトの3つの特徴</span></h3>



<p class="wp-block-paragraph">プロジェクトには次のような特徴があります。</p>



<ul class="wp-block-list"><li>ワークブック1つに対して1つだけ存在する</li><li>プロジェクトの中にモジュールやプロシージャを作成していく</li><li>プロジェクト名はあとから変更できる（VBEのプロパティウィンドウで設定）</li></ul>



<p class="wp-block-paragraph">複数のExcelファイルを同時に開いている場合は、ファイルの数だけプロジェクトが存在します。プロジェクトエクスプローラーに「VBAProject (売上集計.xlsm)」「VBAProject (在庫管理.xlsm)」のように、ファイルごとに並んで表示されます。</p>



<h3 class="wp-block-heading"><span id="toc4">プロジェクトのパスワード保護</span></h3>



<p class="wp-block-paragraph">ほかの人にコードを見られたくない場合は、プロジェクトにパスワードを設定できます。</p>



<p class="wp-block-paragraph">設定手順は次のとおりです。</p>



<ol class="wp-block-list"><li>VBEのメニューから「ツール」→「VBAProject のプロパティ」を選択する</li><li>「保護」タブを開く</li><li>「プロジェクトを表示用にロックする」にチェックを入れる</li><li>パスワードを入力して「OK」をクリックする</li><li>ファイルを保存して閉じ、もう一度開くとロックが有効になる</li></ol>



<p class="wp-block-paragraph">パスワードを設定すると、パスワードを知らない人はコードの閲覧・編集ができなくなります。</p>



<p class="wp-block-paragraph">ただし、VBAのパスワード保護は簡易的な閲覧防止レベルです。解除ツールも存在するため、機密性の高い情報を完全に守る手段ではない点だけ覚えておきましょう。</p>



<h2 class="wp-block-heading"><span id="toc5">モジュールとは｜コードをまとめる5種類のグループ</span></h2>



<p class="wp-block-paragraph">モジュールは、プロシージャ（処理）をまとめるためのグループです。会社組織で言えば「部署」にあたります。</p>



<p class="wp-block-paragraph">プログラムが大きくなるほど、モジュールは増えていきます。小さな会社は部署が少なくても回りますが、大企業になると部署が細かく分かれますよね。VBAでも同じで、規模に応じてモジュールを分けて整理していきます。</p>



<h3 class="wp-block-heading"><span id="toc6">5種類のモジュールと使い分け</span></h3>



<p class="wp-block-paragraph">VBAには5種類のモジュールがあります。まずは「標準モジュール」だけ覚えておけば、基本的な作業は問題ありません。残りは、必要になったときに見返せば十分です。</p>



<figure class="wp-block-table"><table><thead><tr><th>モジュール</th><th>主な用途</th><th>使用頻度</th></tr></thead><tbody><tr><td>標準モジュール</td><td>通常のマクロを記述する場所</td><td>高（最もよく使う）</td></tr><tr><td>ブックモジュール</td><td>ワークブックのイベント処理</td><td>中</td></tr><tr><td>シートモジュール</td><td>ワークシートのイベント処理</td><td>中</td></tr><tr><td>フォームモジュール</td><td>ユーザーフォームの操作処理</td><td>低〜中</td></tr><tr><td>クラスモジュール</td><td>独自のオブジェクト定義</td><td>低</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">なお、ブックモジュールとシートモジュールは、内部的には「ドキュメントモジュール」という同じ仲間に分類されます。ただ初心者のうちは、別々のモジュールとして覚えたほうが用途を区別しやすいです。</p>



<h3 class="wp-block-heading"><span id="toc7">標準モジュール｜まずはここに書けばOK</span></h3>



<p class="wp-block-paragraph"><strong>基本的にマクロは、この標準モジュールに記述します。</strong></p>



<p class="wp-block-paragraph">VBEの「挿入」メニューから「標準モジュール」を追加して使います。追加すると、プロジェクトエクスプローラーに「Module1」が表示されます。</p>



<p class="wp-block-paragraph">「マクロの記録」機能を使った場合も、生成されたコードはこの標準モジュールに自動で記録されます。マクロの記録について詳しくは「<a href="https://mashukabu.com/howto-macro-recording/">Excelのマクロの記録の使い方</a>」をご覧ください。</p>



<pre class="wp-block-code"><code>Sub サンプルマクロ()
    MsgBox &quot;これは標準モジュールに書いたマクロです&quot;
End Sub</code></pre>



<p class="wp-block-paragraph">標準モジュールに書いたSubプロシージャは、Excelの「マクロ」ダイアログ（Alt+F8）に一覧表示されます。そこから選んで実行できるので、初心者はまず標準モジュールを使えば困りません。</p>



<h3 class="wp-block-heading"><span id="toc8">ブックモジュール｜ブックを開いたときに動かす</span></h3>



<p class="wp-block-paragraph">ブックモジュールには、ワークブックに対するイベント処理を記述します。</p>



<p class="wp-block-paragraph">「ワークブックを開いたときに自動で処理を実行したい」といった場面で使います。プロジェクトエクスプローラーの「ThisWorkbook」をダブルクリックすると開けます。</p>



<pre class="wp-block-code"><code>Private Sub Workbook_Open()
    MsgBox &quot;ファイルが開かれました&quot;
End Sub</code></pre>



<p class="wp-block-paragraph">このコードを記述すると、ファイルを開くたびにメッセージが表示されます。ほかにも、保存前に処理を走らせる <code>Workbook_BeforeSave</code> などのイベントが用意されています。</p>



<h3 class="wp-block-heading"><span id="toc9">シートモジュール｜セルの変更に反応させる</span></h3>



<p class="wp-block-paragraph">シートモジュールには、特定のワークシートに対するイベント処理を記述します。</p>



<p class="wp-block-paragraph">「セルの値が変更されたら自動で処理を実行したい」といった場面で使います。プロジェクトエクスプローラーの「Sheet1」などをダブルクリックすると開けます。</p>



<pre class="wp-block-code"><code>Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = &quot;$A$1&quot; Then
        MsgBox &quot;A1セルが変更されました&quot;
    End If
End Sub</code></pre>



<p class="wp-block-paragraph">シートモジュールはシートごとに用意されています。Sheet1に書いたイベントはSheet1でしか動かない点に注意しましょう。</p>



<h3 class="wp-block-heading"><span id="toc10">フォームモジュール｜入力画面の操作を制御する</span></h3>



<p class="wp-block-paragraph">フォームモジュールは、ユーザーフォームの操作を記述する場所です。</p>



<p class="wp-block-paragraph">ユーザーフォームとは、独立したウィンドウを表示して、ボタンやテキストボックスなどのコントロールを配置できる機能です。「ボタンをクリックしたらこの処理を実行する」といった操作を、フォームモジュールに記述します。</p>



<pre class="wp-block-code"><code>Private Sub CommandButton1_Click()
    MsgBox &quot;ボタンがクリックされました&quot;
End Sub</code></pre>



<p class="wp-block-paragraph">入力フォームを作って、データ入力の手間を減らしたいときに活躍します。</p>



<h3 class="wp-block-heading"><span id="toc11">クラスモジュール｜独自の部品を作る上級者向け</span></h3>



<p class="wp-block-paragraph">クラスモジュールは、独自のオブジェクト（データと処理をまとめた部品）を定義するためのモジュールです。</p>



<p class="wp-block-paragraph">「オブジェクト指向プログラミング」という考え方を使いたい場合に活用します。業務効率化レベルのマクロ開発では使う機会は少ないですが、大規模なプログラムで同じ構造のデータを繰り返し扱う場合に便利です。</p>



<p class="wp-block-paragraph">まずは存在を知っておく程度で問題ありません。必要になったタイミングで学習すれば十分です。</p>



<h2 class="wp-block-heading"><span id="toc12">プロシージャとは｜処理を実行する3種類の最小単位</span></h2>



<p class="wp-block-paragraph">プロシージャは、実際の処理内容を記述する最小単位です。モジュールの中にプロシージャを書いて、はじめてマクロが動作します。会社組織で言えば「担当者」にあたります。</p>



<h3 class="wp-block-heading"><span id="toc13">3種類のプロシージャと使い分け</span></h3>



<p class="wp-block-paragraph">VBAのプロシージャには3つの種類があります。</p>



<figure class="wp-block-table"><table><thead><tr><th>プロシージャ</th><th>特徴</th><th>使用頻度</th></tr></thead><tbody><tr><td>Subプロシージャ</td><td>処理を実行する。戻り値なし</td><td>高（最もよく使う）</td></tr><tr><td>Functionプロシージャ</td><td>処理を実行して結果を返す。戻り値あり</td><td>中</td></tr><tr><td>Propertyプロシージャ</td><td>クラスモジュールでプロパティを定義する</td><td>低</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><span id="toc14">Subプロシージャ｜マクロの基本形</span></h3>



<p class="wp-block-paragraph"><strong>基本的にマクロは、このSubプロシージャで作成します。</strong></p>



<p class="wp-block-paragraph"><code>Sub</code> で始まり <code>End Sub</code> で終わるのが特徴です。処理を実行するだけで、結果（戻り値）を返しません。</p>



<pre class="wp-block-code"><code>Sub 挨拶する()
    MsgBox &quot;こんにちは！&quot;
End Sub</code></pre>



<p class="wp-block-paragraph">マクロの実行は、VBEでF5キーを押すか、Excelの「マクロ」ダイアログ（Alt+F8）から選んで実行します。なお、Alt+F8の一覧に表示されるのは、引数のないPublicなSubプロシージャだけです。</p>



<h3 class="wp-block-heading"><span id="toc15">Functionプロシージャ｜結果を返したいとき</span></h3>



<p class="wp-block-paragraph">Functionプロシージャは、処理を実行した結果を呼び出し元に返せます。この「返す値」のことを<strong>戻り値</strong>といいます。</p>



<p class="wp-block-paragraph">たとえば「消費税を計算する」という処理を作る場合、計算結果を戻り値として返せると便利ですよね。</p>



<pre class="wp-block-code"><code>Function 税込計算(金額 As Long) As Long
    '--- 金額に1.1を掛けて税込価格を返す ---
    税込計算 = 金額 * 1.1
End Function

Sub テスト()
    Dim 結果 As Long  '計算結果を入れる変数
    結果 = 税込計算(1000)  '税込計算を呼び出す（結果は1100）
    MsgBox &quot;税込金額は &quot; &amp; 結果 &amp; &quot; 円です&quot;
End Sub</code></pre>



<p class="wp-block-paragraph">Functionプロシージャは、同じ計算を何度も繰り返す場面で特に役立ちます。処理を1つにまとめておけば、金額を変えるだけで使い回せます。</p>



<p class="wp-block-paragraph">さらに、Functionプロシージャは「ユーザー定義関数（UDF）」としてワークシートのセルから呼び出すこともできます。セルに <code>=税込計算(A1)</code> のように入力すれば、自作した関数をSUMやIFと同じ感覚で使えます。</p>



<h3 class="wp-block-heading"><span id="toc16">Propertyプロシージャ｜クラスとセットで使う</span></h3>



<p class="wp-block-paragraph">Propertyプロシージャは、クラスモジュールとセットで使うプロシージャです。</p>



<p class="wp-block-paragraph">クラスモジュールで定義したオブジェクトのプロパティ（属性）を取得・設定するときに使います。<code>Property Get</code>（取得）と <code>Property Let</code>（設定）を組み合わせて記述します。</p>



<p class="wp-block-paragraph">業務効率化レベルでは使う場面はほとんどありません。ここでは存在だけ覚えておけば十分です。</p>



<h3 class="wp-block-heading"><span id="toc17">Sub・Functionの使い分けと呼び出し方</span></h3>



<p class="wp-block-paragraph">SubとFunctionで迷ったら、次の基準で判断すると分かりやすいです。</p>



<ul class="wp-block-list"><li>処理を実行するだけでよい → Subプロシージャ</li><li>計算結果や判定結果を呼び出し元に返したい → Functionプロシージャ</li></ul>



<p class="wp-block-paragraph">最初のうちはSubだけで十分対応できます。「結果を返したい」と感じたタイミングでFunctionを覚えれば問題ありません。</p>



<p class="wp-block-paragraph">呼び出し方にも、SubとFunctionで覚えておきたい違いがあります。</p>



<ul class="wp-block-list"><li><strong>Subを呼ぶとき</strong>：引数はカッコで囲まずに書きます（例: <code>処理A 引数1, 引数2</code>）。<code>Call</code> を付けて呼ぶ場合だけカッコで囲みます（例: <code>Call 処理A(引数1, 引数2)</code>）。</li><li><strong>Functionを呼ぶとき</strong>：戻り値を受け取る場合は、引数を必ずカッコで囲みます（例: <code>結果 = 税込計算(1000)</code>）。</li></ul>



<p class="wp-block-paragraph">なお、Subにカッコを付けて呼ぶと、エラーになったり意図しない動作をしたりすることがあります。とくに引数が1つのときに不要なカッコで囲むと、その値は「値渡し（コピー）」として渡され、呼び出し先で書き換えても呼び出し元の変数には反映されません。「Subはカッコなし、Functionの戻り値を受け取るときはカッコあり」と覚えておくと、初心者がつまずきやすいポイントを避けられます。</p>



<h2 class="wp-block-heading"><span id="toc18">VBEで階層を確認する手順（プロジェクトエクスプローラー）</span></h2>



<p class="wp-block-paragraph">ここまでの3階層は、VBEを開けば実際に目で見て確認できます。手順を順番に見ていきましょう。</p>



<h3 class="wp-block-heading"><span id="toc19">手順1：VBEを起動する</span></h3>



<p class="wp-block-paragraph">Excelの画面で <strong>Alt+F11</strong> を押すと、VBE（Visual Basic Editor）が起動します。</p>



<p class="wp-block-paragraph">リボンから開く場合は、「開発」タブ →「Visual Basic」をクリックします。もし「開発」タブが表示されていない場合は、次の手順で追加します。</p>



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



<p class="wp-block-paragraph">開発タブの表示について詳しくは「<a href="https://mashukabu.com/excel-vba-before-study-explanation/">Excel VBA 開発タブを表示する方法</a>」を参考にしてください。</p>



<h3 class="wp-block-heading"><span id="toc20">手順2：プロジェクトエクスプローラーを表示する</span></h3>



<p class="wp-block-paragraph">VBEの左上にあるツリー表示が「プロジェクトエクスプローラー」です。ここにプロジェクト・モジュールの階層が一覧表示されます。</p>



<p class="wp-block-paragraph">もし表示されていない場合は、「表示」メニュー →「プロジェクトエクスプローラー」をクリックします。ショートカットの <strong>Ctrl+R</strong> でも表示できます。</p>



<h3 class="wp-block-heading"><span id="toc21">手順3：標準モジュールを挿入する</span></h3>



<p class="wp-block-paragraph">コードを書く場所として、標準モジュールを追加します。</p>



<ol class="wp-block-list"><li>VBEのメニューから「挿入」→「標準モジュール」を選ぶ</li><li>プロジェクトエクスプローラーに「Module1」が追加される</li><li>Module1をダブルクリックするとコードウィンドウが開く</li></ol>



<p class="wp-block-paragraph">このコードウィンドウにSubプロシージャを書けば、マクロを作る準備は完了です。「VBAProject（プロジェクト）→ Module1（モジュール）→ Sub（プロシージャ）」という階層が、実際に手元で再現できます。</p>



<h2 class="wp-block-heading"><span id="toc22">実務でのコード整理術｜モジュールの分け方</span></h2>



<p class="wp-block-paragraph">マクロが増えてくると、すべてを1つの標準モジュールに詰め込むと読みにくくなります。会社で言えば、全員が同じ部署にいて誰が何の担当か分からない状態です。</p>



<p class="wp-block-paragraph">そこで、機能ごとにモジュールを分けて整理するのがおすすめです。</p>



<h3 class="wp-block-heading"><span id="toc23">機能ごとにモジュールを分ける</span></h3>



<p class="wp-block-paragraph">たとえば、次のように役割でモジュールを分けると、あとから修正箇所をすぐに見つけられます。</p>



<figure class="wp-block-table"><table><thead><tr><th>モジュール名の例</th><th>まとめる処理</th></tr></thead><tbody><tr><td>mod_集計</td><td>売上集計・データ集計のマクロ</td></tr><tr><td>mod_印刷</td><td>帳票の印刷・PDF出力のマクロ</td></tr><tr><td>mod_共通</td><td>複数のマクロから呼び出す共通処理</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">モジュール名は、プロジェクトエクスプローラーでモジュールを選び、プロパティウィンドウの「(オブジェクト名)」から変更できます。</p>



<h3 class="wp-block-heading"><span id="toc24">共通処理はFunctionにまとめる</span></h3>



<p class="wp-block-paragraph">複数のマクロで同じ処理を繰り返す場合は、その処理をFunctionプロシージャにまとめておくと便利です。1か所を直せば、呼び出している全マクロに修正が反映されます。</p>



<p class="wp-block-paragraph">整理のコツは「迷ったら標準モジュールにSubで書く。同じ処理を2回以上書きそうになったらFunctionにまとめる」という流れです。最初から完璧に分ける必要はありません。</p>



<p class="wp-block-paragraph">VBAをこれから体系的に学ぶ方は、学習の順番をまとめた「<a href="https://mashukabu.com/excel-vba-learning-roadmap/">Excel VBA学習ロードマップ</a>」もあわせてご覧ください。</p>



<h2 class="wp-block-heading"><span id="toc25">よくある質問（FAQ）</span></h2>



<h3 class="wp-block-heading"><span id="toc26">Q. マクロの記録で作ったコードはどこに入りますか？</span></h3>



<p class="wp-block-paragraph">「マクロの記録」で生成されたコードは、自動的に新しい標準モジュール（Module1など）に格納されます。記録後にVBEを開き、プロジェクトエクスプローラーの標準モジュールを確認すると、記録された内容を見られます。</p>



<h3 class="wp-block-heading"><span id="toc27">Q. モジュールはいくつ作ればよいですか？</span></h3>



<p class="wp-block-paragraph">決まりはありません。最初は標準モジュール1つで十分です。マクロが増えて読みにくくなってきたら、機能ごとにモジュールを分けていきましょう。</p>



<h3 class="wp-block-heading"><span id="toc28">Q. シートモジュールに書いたマクロが「マクロ」ダイアログに出てきません</span></h3>



<p class="wp-block-paragraph">シートモジュールやブックモジュールのイベントプロシージャは、既定で <code>Private</code> です。Alt+F8のマクロ一覧には、Publicで引数のないSubプロシージャだけが表示されます。そのため、イベントプロシージャは一覧に出てきません。これは正常な動作です。</p>



<h3 class="wp-block-heading"><span id="toc29">Q. SubとFunctionはどちらを使えばよいですか？</span></h3>



<p class="wp-block-paragraph">処理を実行するだけならSub、計算結果や判定結果を返したいならFunctionを使います。初心者のうちはSubだけで十分です。呼び出すときは、Subはカッコなし、Functionの戻り値を受け取るときはカッコありと覚えておきましょう。</p>



<h3 class="wp-block-heading"><span id="toc30">Q. プロジェクト名は変更してもよいですか？</span></h3>



<p class="wp-block-paragraph">変更できます。ただし、初心者のうちは既定の「VBAProject」のままで問題ありません。複数のプロジェクトを扱うようになって、見分けがつきにくくなったら変更を検討しましょう。</p>



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



<p class="wp-block-paragraph">VBAのプロジェクト・モジュール・プロシージャの関係をおさらいしましょう。</p>



<figure class="wp-block-table"><table><thead><tr><th>構成要素</th><th>役割</th><th>ポイント</th></tr></thead><tbody><tr><td>プロジェクト</td><td>最上位の箱</td><td>ワークブック1つに1つ</td></tr><tr><td>モジュール</td><td>コードのグループ</td><td>まずは標準モジュールを使う</td></tr><tr><td>プロシージャ</td><td>処理の最小単位</td><td>まずはSubプロシージャを使う</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">最初のうちは「標準モジュールにSubプロシージャを書く」という組み合わせだけで、十分に対応できます。</p>



<p class="wp-block-paragraph">モジュールやプロシージャを機能ごとに分けて整理する習慣をつけておくと、プログラムが大きくなったときにも修正箇所をすぐに見つけられるようになります。会社組織の比喩を思い出しながら、少しずつ階層構造に慣れていきましょう。</p>



<p class="wp-block-paragraph">VBAの学習を進める方は、次のステップとして以下の記事も参考にしてみてください。</p>



<ul class="wp-block-list"><li>初めてマクロを作る手順を知りたい方:「<a href="https://mashukabu.com/excel-vba-macro-beginners-guide/">Excel VBAマクロ入門</a>」</li><li>VBAとマクロの違いを知りたい方:「<a href="https://mashukabu.com/excel-vba-macro-difference/">Excel VBAとマクロの違い</a>」</li><li>VBAで使うファイル形式を知りたい方:「<a href="https://mashukabu.com/excel-vba-filetype-explanation/">Excel VBAのファイル形式｜.xlsxと.xlsmの違いを解説</a>」</li><li>VBAの変数について学びたい方:「<a href="https://mashukabu.com/excel-vba-variable-explanation/">VBAの変数の使い方とルールについて解説</a>」</li><li>条件分岐を学びたい方:「<a href="https://mashukabu.com/excel-vba-conditional-branch-explanation/">VBA If文の使い方</a>」</li><li>繰り返し処理を学びたい方:「<a href="https://mashukabu.com/excel-vba-howto-use-for/">VBA For~Next文の使い方</a>」</li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/excel-vba-project-module-procedure/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
