<?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%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%82%A8%E3%83%A9%E3%83%BC/feed/" rel="self" type="application/rss+xml" />
	<link>https://mashukabu.com</link>
	<description></description>
	<lastBuildDate>Thu, 04 Jun 2026 07:38:42 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.3</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】Option Explicitで変数の宣言を強制する方法｜設定と使い方を解説</title>
		<link>https://mashukabu.com/excel-vba-option-explicit/</link>
					<comments>https://mashukabu.com/excel-vba-option-explicit/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Mon, 14 Mar 2022 13:41:32 +0000</pubDate>
				<category><![CDATA[VBA・マクロ]]></category>
		<category><![CDATA[Dim]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[Option Explicit]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[コンパイルエラー]]></category>
		<category><![CDATA[デバッグ]]></category>
		<category><![CDATA[変数宣言]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=1359</guid>

					<description><![CDATA[VBAのOption Explicitの意味と設定方法を解説。変数の宣言を強制してスペルミスや型の曖昧さによるバグを防ぐ方法を、基本コードから実践コードまで紹介します。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">VBAを書いていて「変数名を打ち間違えたのにエラーにならない」という経験はありませんか？</p>



<p class="wp-block-paragraph">原因は、VBAが未宣言の変数を自動的に作ってしまう仕組みにあります。スペルミスに気づけず、バグの特定に何時間もかかることも珍しくありません。</p>



<p class="wp-block-paragraph">そんなトラブルを防いでくれるのが <strong>Option Explicit</strong> です。この記事では、VBA Option Explicitの意味・設定方法・実践コードをまとめて紹介します。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>VBEの起動方法や画面の見方は「<a href="https://mashukabu.com/excel-vba-vbe-menu-explanation/">VBE画面の見方</a>」で解説しています。<code>Alt</code> + <code>F11</code> でVBEを起動し、「挿入」→「標準モジュール」でコードを書く準備ができます。</p></blockquote>




  <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 Option Explicitとは？</a></li><li><a href="#toc2" tabindex="0">Option Explicitがないとどうなる？（スペルミスバグの実例）</a><ol><li><a href="#toc3" tabindex="0">タイプミスで別変数が作られる</a></li><li><a href="#toc4" tabindex="0">Option Explicitありなら一瞬で発見</a></li><li><a href="#toc5" tabindex="0">Option Explicitなしで起きる3つのトラブル</a></li></ol></li><li><a href="#toc6" tabindex="0">Option Explicitの基本的な使い方</a><ol><li><a href="#toc7" tabindex="0">宣言セクションに記述する</a></li><li><a href="#toc8" tabindex="0">動作確認してみよう</a></li></ol></li><li><a href="#toc9" tabindex="0">Option Explicitを自動入力する設定方法</a><ol><li><a href="#toc10" tabindex="0">VBEのオプションで「変数の宣言を強制する」を有効にする</a></li><li><a href="#toc11" tabindex="0">既存モジュールへの反映</a></li></ol></li><li><a href="#toc12" tabindex="0">変数の型宣言と組み合わせてVBAの品質を上げる</a><ol><li><a href="#toc13" tabindex="0">よく使う型とメモリ比較</a></li><li><a href="#toc14" tabindex="0">型宣言を活かした実務コード</a></li><li><a href="#toc15" tabindex="0">定数（Const）との併用パターン</a></li></ol></li><li><a href="#toc16" tabindex="0">Option Explicitを使い忘れるパターンと対策</a></li><li><a href="#toc17" tabindex="0">よくあるエラーと対処法</a></li><li><a href="#toc18" tabindex="0">チームでVBAを管理するときのOption Explicit運用ルール</a><ol><li><a href="#toc19" tabindex="0">全モジュールへの一括確認方法</a></li><li><a href="#toc20" tabindex="0">新規モジュール作成時のミスを防ぐ</a></li><li><a href="#toc21" tabindex="0">プロシージャをまたいだ変数に注意する</a></li></ol></li><li><a href="#toc22" tabindex="0">Option Explicitのよくある質問（FAQ）</a><ol><li><a href="#toc23" tabindex="0">Q1. Option ExplicitはすべてのモジュールタイプでDimを要求する？</a></li><li><a href="#toc24" tabindex="0">Q2. Option ExplicitとOption Compareは何が違う？</a></li><li><a href="#toc25" tabindex="0">Q3. On Error Resume Nextと組み合わせると効果が薄まる？</a></li><li><a href="#toc26" tabindex="0">Q4. Option ExplicitなしでDimだけを使えばよいのでは？</a></li><li><a href="#toc27" tabindex="0">Q5. 後からOption Explicitを追加すると既存コードは壊れる？</a></li></ol></li><li><a href="#toc28" tabindex="0">まとめ</a><ol><li><a href="#toc29" tabindex="0">関連記事</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">VBA Option Explicitとは？</span></h2>



<p class="wp-block-paragraph"><strong>Option Explicit</strong> は、モジュール内のすべての変数に <code>Dim</code> などの宣言を必須にする命令です。</p>



<p class="wp-block-paragraph">モジュールの先頭（宣言セクション）に1行書くだけでOK。宣言なしの変数があると <strong>コンパイルエラー</strong> になるので、スペルミスや未宣言の変数を即座に検出できます。</p>



<pre class="wp-block-code"><code>Option Explicit  '← モジュールの先頭に書くだけ

Sub SampleMacro()
    Dim sName As String '--- 変数を宣言してから使う ---
    sName = &quot;田中太郎&quot;
    MsgBox sName
End Sub</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP</strong></p><p>Option Explicitはモジュール単位で適用されます。プロジェクト内のすべてのモジュールに記述するか、後述の自動設定を有効にしておきましょう。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc2">Option Explicitがないとどうなる？（スペルミスバグの実例）</span></h2>



<p class="wp-block-paragraph">「Option Explicitなしでも動くなら、なくていいのでは？」と思うかもしれません。でも実務では、これが原因で見つけにくいバグが発生します。</p>



<h3 class="wp-block-heading"><span id="toc3">タイプミスで別変数が作られる</span></h3>



<p class="wp-block-paragraph">次のコードを見てください。<code>total</code> と書くべきところを <code>totla</code> とタイプミスしています。</p>



<pre class="wp-block-code"><code>Sub CalcWithoutOptionExplicit()
    Dim total As Long '--- 合計金額 ---
    total = 1000

    '--- タイプミスに気づかない ---
    totla = totla + 500  '← total ではなく totla

    MsgBox &quot;合計: &quot; &amp; total  '--- 結果は 1000（500が加算されていない）---
End Sub</code></pre>



<p class="wp-block-paragraph">このコードを実行すると、エラーは出ません。<code>totla</code> が新しいVariant型変数として自動作成され、<code>total</code> には500が加算されないまま処理が進みます。結果は「合計: 1000」と表示されます。</p>



<p class="wp-block-paragraph">金額計算でこのバグが混入すると、集計結果が数十万円ずれることもあります。しかもエラーが出ないので、数字を見比べるまで間違いに気づけません。</p>



<h3 class="wp-block-heading"><span id="toc4">Option Explicitありなら一瞬で発見</span></h3>



<p class="wp-block-paragraph">同じコードにOption Explicitを付けると、結果はこう変わります。</p>



<pre class="wp-block-code"><code>Option Explicit

Sub CalcWithOptionExplicit()
    Dim total As Long '--- 合計金額 ---
    total = 1000

    '--- タイプミスに気づかない ---
    totla = totla + 500  '← ここでコンパイルエラーが発生
End Sub</code></pre>



<p class="wp-block-paragraph">F5キーで実行した瞬間、「<strong>コンパイル エラー: 変数が定義されていません。</strong>」と表示されます。<code>totla</code> がハイライトされるので、スペルミスの場所が一目瞭然です。</p>



<h3 class="wp-block-heading"><span id="toc5">Option Explicitなしで起きる3つのトラブル</span></h3>



<figure class="wp-block-table"><table><thead><tr><th>トラブル</th><th>具体例</th><th>影響</th></tr></thead><tbody><tr><td>スペルミスが検出されない</td><td><code>total</code> を <code>totla</code> と書いてもエラーにならない</td><td>値が空のまま処理が進む</td></tr><tr><td>型が曖昧になる</td><td>すべての変数が Variant 型になる</td><td>メモリ消費が増え処理速度が低下する</td></tr><tr><td>バグの原因特定が困難</td><td>エラーにならないので原因箇所が分からない</td><td>デバッグに何時間もかかる</td></tr></tbody></table></figure>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>数百行のマクロでこのバグが発生すると、原因の特定に何時間もかかります。Option Explicitを設定しておけば一瞬で見つかりますよ。変数の値をリアルタイムで追跡したいときは「<a href="https://mashukabu.com/excel-vbe-local-window-explanation/">ローカルウィンドウ</a>」も合わせて使うと効率的です。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc6">Option Explicitの基本的な使い方</span></h2>



<h3 class="wp-block-heading"><span id="toc7">宣言セクションに記述する</span></h3>



<p class="wp-block-paragraph">Option Explicitは、モジュールの <strong>一番上</strong>（宣言セクション）に記述します。</p>



<pre class="wp-block-code"><code>Option Explicit

Sub SampleMacro()
    Dim sName As String '--- 氏名 ---
    sName = &quot;田中太郎&quot;
    MsgBox sName
End Sub</code></pre>



<p class="wp-block-paragraph"><code>Option Explicit</code> と <code>Sub</code> の間に区切り線が自動表示されます。宣言セクションとプロシージャの境目です。</p>



<h3 class="wp-block-heading"><span id="toc8">動作確認してみよう</span></h3>



<p class="wp-block-paragraph">宣言した変数名と違う名前を使うとどうなるか、試してみましょう。</p>



<pre class="wp-block-code"><code>Option Explicit

Sub TestWithOptionExplicit()
    Dim sName As String '--- 氏名 ---
    sName = &quot;田中太郎&quot;

    '--- わざとスペルミスをする ---
    MsgBox sNaem  '← ここでコンパイルエラーが発生
End Sub</code></pre>



<p class="wp-block-paragraph">このコードをF5キーで実行すると <code>sNaem</code> がハイライトされます。スペルミスを即発見できますね。</p>



<p class="wp-block-paragraph">比較として、Option Explicitがない場合も見てみましょう。</p>



<pre class="wp-block-code"><code>Sub TestWithoutOptionExplicit()
    Dim sName As String '--- 氏名 ---
    sName = &quot;田中太郎&quot;

    '--- わざとスペルミスをする ---
    MsgBox sNaem  '← エラーにならず空白のメッセージが表示される
End Sub</code></pre>



<p class="wp-block-paragraph">こちらはエラーが出ません。<strong>空のメッセージボックス</strong> が表示されるだけです。<code>sNaem</code> がVariant型変数として自動作成され、値はEmpty（空）になります。</p>



<h2 class="wp-block-heading"><span id="toc9">Option Explicitを自動入力する設定方法</span></h2>



<p class="wp-block-paragraph">毎回手入力するのは手間ですよね。VBEの設定を変更すれば、新規モジュール作成時に自動で入力されるようになります。</p>



<h3 class="wp-block-heading"><span id="toc10">VBEのオプションで「変数の宣言を強制する」を有効にする</span></h3>



<ol class="wp-block-list"><li>VBEのメニューバーから [ツール] → [オプション] を開く</li><li>[編集] タブの「<strong>変数の宣言を強制する</strong>」にチェックを入れる</li><li>[OK] をクリック</li></ol>



<p class="wp-block-paragraph">これで、新しくモジュールを挿入するたびに <code>Option Explicit</code> が自動挿入されます。</p>



<h3 class="wp-block-heading"><span id="toc11">既存モジュールへの反映</span></h3>



<p class="wp-block-paragraph">注意点がひとつあります。この設定は <strong>新規モジュールにのみ</strong> 適用されます。</p>



<p class="wp-block-paragraph">設定を有効にする前に作成したモジュールには反映されません。既存モジュールには手動で先頭に <code>Option Explicit</code> を追記してください。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP</strong></p><p>まだ設定していない方は、この記事を読んでいる今がチャンスです。VBEを開いて [ツール] → [オプション] から設定しておきましょう。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc12">変数の型宣言と組み合わせてVBAの品質を上げる</span></h2>



<p class="wp-block-paragraph">Option Explicitを設定すると、変数の型を意識する習慣が自然につきます。適切な型を指定すれば、処理速度とメモリ効率が改善しますよ。</p>



<h3 class="wp-block-heading"><span id="toc13">よく使う型とメモリ比較</span></h3>



<figure class="wp-block-table"><table><thead><tr><th>型</th><th>メモリ</th><th>用途</th><th>具体例</th></tr></thead><tbody><tr><td>Long</td><td>4バイト</td><td>行番号・カウンター</td><td><code>Dim i As Long</code></td></tr><tr><td>String</td><td>文字数に応じて変動</td><td>文字列データ</td><td><code>Dim sName As String</code></td></tr><tr><td>Double</td><td>8バイト</td><td>金額・小数を含む数値</td><td><code>Dim dTotal As Double</code></td></tr><tr><td>Boolean</td><td>2バイト</td><td>真偽値（True/False）</td><td><code>Dim bFlg As Boolean</code></td></tr><tr><td>Variant</td><td>16バイト以上</td><td>型が不確定な場合のみ</td><td><code>Dim vData As Variant</code></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Variant型は便利ですが、Long型の4倍以上のメモリを消費します。大量データのマクロでは体感できるほど差が出ます。</p>



<h3 class="wp-block-heading"><span id="toc14">型宣言を活かした実務コード</span></h3>



<p class="wp-block-paragraph"><a href="https://mashukabu.com/excel-vba-howto-use-range/">Range</a>で最終行まで処理するコードを例に見てみましょう。</p>



<pre class="wp-block-code"><code>Option Explicit

Sub SpeedOptimizedMacro()
    Dim ws As Worksheet '--- 対象シート ---
    Dim i As Long '--- 行カウンター ---
    Dim lLastRow As Long '--- 最終行 ---
    Dim sResult As String '--- 処理結果 ---

    Set ws = ThisWorkbook.Sheets(&quot;Sheet1&quot;)
    lLastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    '--- A列の値を順番に処理する ---
    For i = 2 To lLastRow
        If ws.Range(&quot;A&quot; &amp; i).Value &lt;&gt; &quot;&quot; Then
            sResult = sResult &amp; ws.Range(&quot;A&quot; &amp; i).Value &amp; vbCrLf
        End If
    Next i

    MsgBox &quot;処理結果:&quot; &amp; vbCrLf &amp; sResult
End Sub</code></pre>



<p class="wp-block-paragraph">すべての変数に型を指定しているので、スペルミスも型の曖昧さも発生しません。<a href="https://mashukabu.com/how-to-use-do-loop/">Do Loop</a>を使う場合も同様に、ループ変数を <code>Long</code> で宣言しておくのがおすすめです。</p>



<h3 class="wp-block-heading"><span id="toc15">定数（Const）との併用パターン</span></h3>



<p class="wp-block-paragraph">Option Explicitと合わせて、変更しない値は定数（Const）で宣言するのがおすすめです。</p>



<pre class="wp-block-code"><code>Option Explicit

'--- 定数の宣言 ---
Const START_ROW As Long = 2 '--- データ開始行 ---
Const SHEET_NAME As String = &quot;売上データ&quot; '--- 対象シート名 ---

Sub ProcessSalesData()
    Dim ws As Worksheet '--- 対象シート ---
    Dim i As Long '--- 行カウンター ---
    Dim lLastRow As Long '--- 最終行 ---
    Dim dTotal As Double '--- 合計金額 ---

    Set ws = ThisWorkbook.Sheets(SHEET_NAME)
    lLastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    '--- 売上金額を集計する ---
    For i = START_ROW To lLastRow
        dTotal = dTotal + ws.Range(&quot;C&quot; &amp; i).Value
    Next i

    MsgBox SHEET_NAME &amp; &quot;の合計金額: &quot; &amp; Format(dTotal, &quot;#,##0&quot;) &amp; &quot;円&quot;
End Sub</code></pre>



<p class="wp-block-paragraph">定数を使うメリットは2つあります。</p>



<ul class="wp-block-list"><li><strong>変更が1か所で済む</strong>: シート名や開始行を変えたいとき、定数の値を変えるだけでOK</li><li><strong>誤って値を変更できない</strong>: 定数に値を代入しようとするとコンパイルエラーになる</li></ul>



<h2 class="wp-block-heading"><span id="toc16">Option Explicitを使い忘れるパターンと対策</span></h2>



<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>設定は新規モジュールにのみ適用される</td><td>既存モジュールの先頭に手動で追記する</td></tr><tr><td>ThisWorkbook・Sheet1などのオブジェクトモジュール</td><td>標準モジュール以外は見落としやすい</td><td>オブジェクトモジュールにも必ず記述する</td></tr><tr><td>他の人が作ったマクロを引き継いだ</td><td>前任者が設定していない</td><td>引き継ぎ時に全モジュールをチェックする</td></tr><tr><td>UserFormのコードビハインド</td><td>フォームモジュールも対象</td><td>UserFormのコード画面の先頭にも追記する</td></tr></tbody></table></figure>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP</strong></p><p>プロジェクトエクスプローラーで各モジュールを開き、先頭に <code>Option Explicit</code> があるか1つずつ確認するのが確実です。数が多いときは面倒ですが、一度チェックしてしまえば安心ですよ。</p></blockquote>



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



<p class="wp-block-paragraph">Option Explicitを使い始めると、いくつかのエラーに遭遇することがあります。</p>



<figure class="wp-block-table"><table><thead><tr><th>エラー</th><th>原因</th><th>対処法</th></tr></thead><tbody><tr><td>コンパイル エラー: 変数が定義されていません。</td><td>変数を <code>Dim</code> で宣言していない</td><td><code>Dim 変数名 As 型</code> で宣言する</td></tr><tr><td>コンパイル エラー: 変数が定義されていません。（スペルミス）</td><td>宣言した変数名と綴りが違う</td><td>ハイライト箇所のスペルを修正する</td></tr><tr><td>実行時エラー &#8217;91&#8217;</td><td>オブジェクト変数に <code>Set</code> を使わずに代入した</td><td><code>Set ws = ...</code> のように <code>Set</code> を付ける</td></tr><tr><td>マクロが実行できない</td><td>ファイルを <code>.xlsx</code> で保存している</td><td><code>.xlsm</code>（マクロ有効ブック）に変更する</td></tr><tr><td>マクロが無効です</td><td>セキュリティ設定でブロックされている</td><td>トラスト センターでマクロを有効化する</td></tr></tbody></table></figure>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>「変数が定義されていません。」エラーが出たときは慌てなくて大丈夫です。VBEが原因の変数をハイライトしてくれるので、スペルを確認するか <code>Dim</code> 宣言を追加しましょう。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc18">チームでVBAを管理するときのOption Explicit運用ルール</span></h2>



<p class="wp-block-paragraph">複数人がVBAを編集するプロジェクトでは、Option Explicitの有無がバグの温床になります。個人で使うときより一歩踏み込んだ運用ルールを決めておくと、引き継ぎのトラブルを減らせます。</p>



<h3 class="wp-block-heading"><span id="toc19">全モジュールへの一括確認方法</span></h3>



<p class="wp-block-paragraph">プロジェクトを引き継いだ際は、すべてのモジュールにOption Explicitが書かれているか確認します。VBEのメニューから「編集 → 検索」で <code>Option Explicit</code> を検索し、ヒットしないモジュールを洗い出す方法が手早いです。</p>



<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>高</td><td>モジュールの先頭1行目</td></tr><tr><td>ThisWorkbook</td><td>高</td><td>コードの先頭1行目</td></tr><tr><td>シートモジュール（Sheet1など）</td><td>高</td><td>コードの先頭1行目</td></tr><tr><td>UserFormのコードビハインド</td><td>中</td><td>フォームのコード先頭</td></tr><tr><td>クラスモジュール</td><td>中</td><td>クラスのコード先頭</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><span id="toc20">新規モジュール作成時のミスを防ぐ</span></h3>



<p class="wp-block-paragraph">VBEの「ツール → オプション → 変数の宣言を強制する」にチェックを入れると、新しいモジュールを作成するたびにOption Explicitが自動挿入されます。チームメンバー全員にこの設定を徹底するのが最も確実な予防策です。</p>



<p class="wp-block-paragraph">既存モジュールには自動設定の効果はないため、過去に作成されたファイルは手動で追記が必要です。<a href="https://mashukabu.com/excel-vba-variable-explanation/">VBAの変数宣言とデータ型</a>の基礎も合わせて確認しておくと、Dim宣言の追加作業がスムーズです。</p>



<h3 class="wp-block-heading"><span id="toc21">プロシージャをまたいだ変数に注意する</span></h3>



<p class="wp-block-paragraph">Option Explicitを後から追加した際にエラーになりやすいのが、プロシージャの外（モジュールレベル）に書かれた変数です。複数のSubやFunctionが同じ変数を共有している場合、その変数の宣言箇所を見落とすとエラーが出続けます。</p>



<pre class="wp-block-code"><code>Option Explicit

' モジュールレベル変数（全プロシージャから参照可）
Private wsTarget As Worksheet
Private lastRow As Long</code></pre>



<p class="wp-block-paragraph">モジュールレベル変数はPrivateで宣言し、必要な場合のみPublicにするのが<a href="https://mashukabu.com/excel-vba-project-module-procedure/">プロジェクト・モジュール構成</a>の基本です。</p>



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



<h3 class="wp-block-heading"><span id="toc23">Q1. Option ExplicitはすべてのモジュールタイプでDimを要求する？</span></h3>



<p class="wp-block-paragraph">はい。標準モジュール、クラスモジュール、UserFormのコードビハインド、オブジェクトモジュール（Sheet1やThisWorkbookなど）のいずれでも、Option Explicitを記述するとそのモジュール内のすべての変数にDim/Public/Private/Staticいずれかの宣言が必要になります。</p>



<p class="wp-block-paragraph">モジュールをまたいだ設定（プロジェクト全体への一括設定）はできません。VBEのオプションで「変数の宣言を強制する」を有効にしておくと、新しく作ったモジュールに自動挿入されます。</p>



<h3 class="wp-block-heading"><span id="toc24">Q2. Option ExplicitとOption Compareは何が違う？</span></h3>



<p class="wp-block-paragraph">別の機能です。</p>



<ul class="wp-block-list"><li><strong>Option Explicit</strong>: 変数宣言を強制する（未宣言変数のコンパイルエラー検出）</li><li><strong>Option Compare Text / Binary</strong>: 文字列比較の大文字・小文字の扱いを設定する</li></ul>



<p class="wp-block-paragraph">Option Compare Textを設定すると「A」と「a」を同一として比較します。Option Compare Binary（デフォルト）はバイナリ比較なので「A」≠「a」です。Option Explicitとは目的がまったく異なりますが、同じ宣言セクションに複数記述できます。</p>



<pre class="wp-block-code"><code>Option Explicit
Option Compare Text</code></pre>



<h3 class="wp-block-heading"><span id="toc25">Q3. On Error Resume Nextと組み合わせると効果が薄まる？</span></h3>



<p class="wp-block-paragraph">その通りです。<code>On Error Resume Next</code> をコード中に記述するとエラーが発生しても処理が続行されます。Option Explicitのコンパイルエラーは実行前に検出されるため影響を受けませんが、実行時エラーについてはOn Errorで回避されます。</p>



<p class="wp-block-paragraph">デバッグをしやすくするためにも、On Error Resume Nextの使用箇所は最小限にとどめ、エラー処理は <code>On Error GoTo ErrorHandler</code> パターンで明示的に書くのがVBAのベストプラクティスです。</p>



<h3 class="wp-block-heading"><span id="toc26">Q4. Option ExplicitなしでDimだけを使えばよいのでは？</span></h3>



<p class="wp-block-paragraph">Dimを書いても、書き忘れた変数（タイプミスで生まれた変数）はVariant型として自動作成されます。Option Explicitがないと「宣言した変数名と違う名前」を使ってもエラーにならないのが問題です。</p>



<p class="wp-block-paragraph">Option ExplicitはDimの書き忘れと同時に「宣言していない変数へのアクセス」を禁止するので、スペルミス由来のバグを確実に防げます。両方を組み合わせて使うことに意味があります。</p>



<h3 class="wp-block-heading"><span id="toc27">Q5. 後からOption Explicitを追加すると既存コードは壊れる？</span></h3>



<p class="wp-block-paragraph">Option Explicitを追加した時点で、そのモジュール内に未宣言の変数があればコンパイルエラーになります。ただし「壊れる」のではなく「未宣言だった変数が可視化される」というのが正確です。</p>



<p class="wp-block-paragraph">追加後にF5キーで実行すると、コンパイルエラーで未宣言変数がハイライトされます。表示された変数を確認しながら順番にDim宣言を追加していけばOKです。既存コードが多い場合は、一気に修正しようとせず、エラー1件ずつ対処するのがやりやすいですよ。</p>



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



<p class="wp-block-paragraph">Option Explicitは、VBAの品質を底上げしてくれる設定です。この記事の内容を振り返っておきましょう。</p>



<figure class="wp-block-table"><table><thead><tr><th>項目</th><th>ポイント</th></tr></thead><tbody><tr><td>基本</td><td>モジュールの先頭に <code>Option Explicit</code> を記述し、変数の宣言を強制する</td></tr><tr><td>効果</td><td>未宣言の変数を使うとコンパイルエラーで即座に教えてくれる</td></tr><tr><td>自動設定</td><td>VBEの [ツール] → [オプション] →「変数の宣言を強制する」で自動挿入できる</td></tr><tr><td>型宣言</td><td>Dim &#8230; As 型 で明示的に宣言し、処理速度とメモリ効率を改善する</td></tr><tr><td>定数</td><td>Const と併用して保守性をさらに上げる</td></tr><tr><td>注意</td><td>既存モジュール・オブジェクトモジュール・UserFormにも手動で追記する</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">まだ設定していない方は、今すぐVBEを開いて設定してみてください。たった1回の操作でデバッグ時間が大幅に減りますよ。</p>



<h3 class="wp-block-heading"><span id="toc29">関連記事</span></h3>



<p class="wp-block-paragraph">VBAの基礎を固めたい方は、こちらの記事もあわせてどうぞ。</p>



<ul class="wp-block-list"><li><a href="https://mashukabu.com/excel-vba-vbe-menu-explanation/">VBE画面の見方</a></li><li><a href="https://mashukabu.com/excel-vba-variable-explanation/">変数の使い方とルール</a></li><li><a href="https://mashukabu.com/excel-vba-howto-use-range/">Rangeの使い方</a></li><li><a href="https://mashukabu.com/how-to-use-do-loop/">Do Loopの使い方</a></li><li><a href="https://mashukabu.com/excel-vbe-local-window-explanation/">ローカルウィンドウの使い方</a></li><li><a href="https://mashukabu.com/excel-vba-like-wildcard/">Like演算子の使い方</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/excel-vba-option-explicit/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
