<?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%87%E3%83%90%E3%83%83%E3%82%B0/feed/" rel="self" type="application/rss+xml" />
	<link>https://mashukabu.com</link>
	<description></description>
	<lastBuildDate>Fri, 12 Jun 2026 22:00:16 +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>デバッグ &#8211; biz-tactics</title>
	<link>https://mashukabu.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>VBAのエラーハンドリング完全ガイド｜On Error GoToとResume Nextの使い分け</title>
		<link>https://mashukabu.com/vba-error-handling-complete-guide/</link>
					<comments>https://mashukabu.com/vba-error-handling-complete-guide/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Fri, 12 Jun 2026 22:00:16 +0000</pubDate>
				<category><![CDATA[VBA・マクロ]]></category>
		<category><![CDATA[On Error]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[VBA入門]]></category>
		<category><![CDATA[エラーハンドリング]]></category>
		<category><![CDATA[デバッグ]]></category>
		<category><![CDATA[マクロ]]></category>
		<category><![CDATA[実行時エラー]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=8009</guid>

					<description><![CDATA[VBAのエラーハンドリングを完全解説。On Error GoTo・Resume Next・Errオブジェクトの使い分けを、ファイル不在・シート不在・型ミスマッチなど実務シーン別の雛形コードとともに紹介します。Resume Nextの危険性や使い分けフローも解説。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">「実行時エラー &#8217;13&#8217;: 型が一致しません」「実行時エラー &#8216;1004&#8217;: アプリケーション定義またはオブジェクト定義のエラーです」。VBAマクロを書きはじめると、こうした突然のエラー停止に何度もぶつかります。</p>



<p class="wp-block-paragraph">そのたびに <code>On Error Resume Next</code> を貼り付けて凌いでいませんか。それはたぶん、地雷原の上に絨毯を敷いているようなものです。</p>



<p class="wp-block-paragraph">この記事では、VBAのエラーハンドリングを <code>On Error GoTo</code> <code>On Error Resume Next</code> <code>Err オブジェクト</code> の3要素で整理します。実務でよく遭遇する5つのシーンごとに、コピペで使える雛形コードと使い分け基準をまとめて紹介します。読み終わるころには、自信を持ってエラー処理を設計できるようになります。</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エラーハンドリングとは？</a><ol><li><a href="#toc2" tabindex="0">エラーハンドリングが必要な理由</a></li><li><a href="#toc3" tabindex="0">VBAで発生する3種類のエラー</a></li><li><a href="#toc4" tabindex="0">エラーハンドリングで使う3つの主要構文</a></li></ol></li><li><a href="#toc5" tabindex="0">On Error GoToでエラー処理ラベルへジャンプする</a><ol><li><a href="#toc6" tabindex="0">基本構文と動作の流れ</a></li><li><a href="#toc7" tabindex="0">Sub構造の正しい書き方（Exit Subとセット）</a></li><li><a href="#toc8" tabindex="0">On Error GoTo 0でハンドリングを解除する</a></li></ol></li><li><a href="#toc9" tabindex="0">On Error Resume Nextでエラーを無視する</a><ol><li><a href="#toc10" tabindex="0">基本構文と使いどころ</a></li><li><a href="#toc11" tabindex="0">Resume Nextの危険性と注意点</a></li><li><a href="#toc12" tabindex="0">局所的に使うブロック化テクニック</a></li></ol></li><li><a href="#toc13" tabindex="0">ErrオブジェクトでエラーNo・説明を取得する</a><ol><li><a href="#toc14" tabindex="0">Err.Number / Err.Description / Err.Sourceの使い方</a></li><li><a href="#toc15" tabindex="0">Err.Clearでエラー情報をリセットする</a></li><li><a href="#toc16" tabindex="0">ログ出力に活用する</a></li></ol></li><li><a href="#toc17" tabindex="0">実務シーン別エラーハンドリング雛形5選</a><ol><li><a href="#toc18" tabindex="0">シーン1: 開きたいファイルが存在しない</a></li><li><a href="#toc19" tabindex="0">シーン2: 指定したシートが見つからない</a></li><li><a href="#toc20" tabindex="0">シーン3: 数値変換に失敗する（型ミスマッチ）</a></li><li><a href="#toc21" tabindex="0">シーン4: ループ内で1行だけスキップしたい</a></li><li><a href="#toc22" tabindex="0">シーン5: 外部アプリ連携（Outlook/IE）が失敗する</a></li></ol></li><li><a href="#toc23" tabindex="0">On Error構文の使い分けフロー</a><ol><li><a href="#toc24" tabindex="0">判定軸1: エラーで処理を止めるか継続するか</a></li><li><a href="#toc25" tabindex="0">判定軸2: エラー後にどこから再開するか</a></li><li><a href="#toc26" tabindex="0">やってはいけないアンチパターン3選</a></li></ol></li><li><a href="#toc27" tabindex="0">よくある質問（FAQ）</a><ol><li><a href="#toc28" tabindex="0">Try-Catchはあるか？</a></li><li><a href="#toc29" tabindex="0">Resume Nextは絶対に使ってはいけない？</a></li><li><a href="#toc30" tabindex="0">ハンドリング有無で処理速度は変わる？</a></li></ol></li><li><a href="#toc31" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">VBAエラーハンドリングとは？</span></h2>



<p class="wp-block-paragraph">VBAエラーハンドリングとは、マクロ実行中に発生する想定外のエラーを検出する仕組みです。プログラムを止めずに、ログ出力・代替処理・終了などへ適切に分岐させます。</p>



<p class="wp-block-paragraph">エラー処理を入れていないマクロは、想定外の入力やファイル不在に遭遇すると、その瞬間に「実行時エラー」のダイアログを出して止まります。配布した利用者からすると、何が起きたのか分からないまま処理が中断されるため、信頼を一気に失います。</p>



<h3 class="wp-block-heading"><span id="toc2">エラーハンドリングが必要な理由</span></h3>



<p class="wp-block-paragraph">実務でVBAを使う場面は、想定外が起きやすい環境です。対象のファイルが毎日変わったり、他人が触ったブックを処理したりするからです。エラーハンドリングを仕込んでおくと、次のようなメリットがあります。</p>



<ul class="wp-block-list"><li>ユーザーに分かりやすいメッセージを出して落ち着かせられる</li><li>途中で止まらず、残りの処理を最後まで通せる</li><li>ログにエラー番号と発生場所を記録して、後から原因調査ができる</li><li>万が一のときも、Excelをフリーズさせずに正常終了できる</li></ul>



<h3 class="wp-block-heading"><span id="toc3">VBAで発生する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><th>エラーハンドリング対象</th></tr></thead><tbody><tr><td>コンパイルエラー</td><td>実行前（コードチェック時）</td><td>End If 抜け、Dim 漏れ</td><td>対象外（コード修正で解決）</td></tr><tr><td>実行時エラー</td><td>実行中</td><td>13型不一致、1004、9、91、438</td><td>対象</td></tr><tr><td>論理エラー</td><td>実行は通るが結果が違う</td><td>If条件の書き間違い</td><td>対象外（テストで検出）</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">エラーハンドリングが対応するのは、原則として <strong>実行時エラー</strong> だけです。コンパイルエラーは事前にコードを直せば消えます。論理エラーは「動くけど結果が間違っている」ためエラーとして検出されません。</p>



<h3 class="wp-block-heading"><span id="toc4">エラーハンドリングで使う3つの主要構文</span></h3>



<p class="wp-block-paragraph">VBAのエラーハンドリングは、次の3つの構文要素を組み合わせて構築します。</p>



<ul class="wp-block-list"><li><strong>On Error GoTo ラベル</strong>: エラー発生時に指定ラベルへジャンプする</li><li><strong>On Error Resume Next</strong>: エラー発生行をスキップして次の行から続行する</li><li><strong>Err オブジェクト</strong>: 直近のエラー番号・説明・発生元を保持する</li></ul>



<p class="wp-block-paragraph">これに加えて、ハンドラを解除する <code>On Error GoTo 0</code> と、ハンドラ内から実行を再開する <code>Resume / Resume Next / Resume ラベル</code> が補助的に使われます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>VBAには <code>.NET</code> のような <code>Try-Catch</code> 構文はありません。代わりに <code>On Error GoTo</code> ラベルとExit Subを組み合わせて疑似的に実装します。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc5">On Error GoToでエラー処理ラベルへジャンプする</span></h2>



<p class="wp-block-paragraph"><code>On Error GoTo</code> は、エラー発生時にあらかじめ用意したラベル位置へジャンプさせる構文です。最も基本的なエラーハンドリング構文として位置付けられます。</p>



<p class="wp-block-paragraph">エラーが起きたときに「専用の処理コーナー」に移動して、そこでメッセージ表示やログ書き込みを行うイメージです。<code>Try-Catch</code> の <code>Catch</code> ブロックに相当します。</p>



<h3 class="wp-block-heading"><span id="toc6">基本構文と動作の流れ</span></h3>



<p class="wp-block-paragraph">最小構成のサンプルです。</p>



<pre class="wp-block-code"><code>Sub Sample_OnErrorGoTo()
    '--- エラーハンドラを設定 ---
    On Error GoTo ErrHandler

    Dim n As Integer
    n = CInt(&quot;abc&quot;)  '型不一致エラー（実行時エラー 13）

    MsgBox &quot;正常終了&quot;
    Exit Sub  '正常時はここで抜ける

ErrHandler:
    '--- エラー発生時の処理 ---
    MsgBox &quot;エラー番号: &quot; &amp; Err.Number &amp; vbCrLf &amp; _
           &quot;内容: &quot; &amp; Err.Description
End Sub</code></pre>



<p class="wp-block-paragraph"><code>CInt("abc")</code> は文字列を数値に変換できないため、実行時エラー13を発生させます。<code>On Error GoTo ErrHandler</code> を先に書いておくと、エラーが起きた瞬間に <code>ErrHandler:</code> ラベル位置へ処理が飛びます。そして、メッセージボックスが表示されます。</p>



<h3 class="wp-block-heading"><span id="toc7">Sub構造の正しい書き方（Exit Subとセット）</span></h3>



<p class="wp-block-paragraph"><code>On Error GoTo</code> を使うときに必ず守ってほしいのが、<strong>正常終了の直前に <code>Exit Sub</code> を入れる</strong> ことです。</p>



<pre class="wp-block-code"><code>Sub Sample_Structure()
    On Error GoTo ErrHandler

    '--- ① 通常処理 ---
    Range(&quot;A1&quot;).Value = &quot;OK&quot;

    '--- ② 正常終了：必ず Exit Sub で抜ける ---
    Exit Sub

ErrHandler:
    '--- ③ エラー処理 ---
    MsgBox &quot;エラー: &quot; &amp; Err.Description
End Sub</code></pre>



<p class="wp-block-paragraph"><code>Exit Sub</code> を書き忘れると、正常時もそのまま <code>ErrHandler:</code> ラベルに突入してしまいます。エラーが起きていないのに「エラー: 」というメッセージが出て、利用者を混乱させる原因になります。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>WARNING</strong></p><p><code>On Error GoTo ラベル</code> を使うときは、必ず正常処理の終わりに <code>Exit Sub</code> を入れてください。これを忘れると、正常時にもエラーメッセージが出る原因になります。</p></blockquote>



<h3 class="wp-block-heading"><span id="toc8">On Error GoTo 0でハンドリングを解除する</span></h3>



<p class="wp-block-paragraph"><code>On Error GoTo 0</code> は、現在のプロシージャ内で有効になっているエラーハンドリングを解除する構文です。</p>



<pre class="wp-block-code"><code>Sub Sample_GoTo0()
    On Error Resume Next
    '--- ここはエラー無視 ---
    Worksheets(&quot;存在しないシート&quot;).Activate

    On Error GoTo 0
    '--- ここから先はエラー無視を解除 ---
    Range(&quot;A1&quot;).Value = 100
End Sub</code></pre>



<p class="wp-block-paragraph"><code>On Error GoTo 0</code> の <code>0</code> は数字のゼロで、ラベル名ではありません。そのため、コード内に <code>0:</code> というラベルを書く必要はありません。「ハンドリングをいったん解除する」専用のキーワードとして覚えておきましょう。</p>



<h2 class="wp-block-heading"><span id="toc9">On Error Resume Nextでエラーを無視する</span></h2>



<p class="wp-block-paragraph"><code>On Error Resume Next</code> は、エラー発生行をスキップして次の行から実行を継続する構文です。</p>



<p class="wp-block-paragraph">「とりあえず動かしたい」「エラーは起きるけど無視したい」という場面で多用されます。一方で、使い方を誤ると <strong>バグを見えなくする最も危険な書き方</strong> にもなります。</p>



<h3 class="wp-block-heading"><span id="toc10">基本構文と使いどころ</span></h3>



<p class="wp-block-paragraph">ファイル削除やシート存在チェックなど、「失敗しても次に進めたい」処理で使うのが本来の用途です。</p>



<pre class="wp-block-code"><code>Sub Sample_ResumeNext()
    Dim ws As Worksheet

    '--- シート取得を試行 ---
    On Error Resume Next
    Set ws = Worksheets(&quot;売上データ&quot;)
    On Error GoTo 0  'すぐに解除する

    '--- 取得できたかをErrではなくIs Nothingで判定 ---
    If ws Is Nothing Then
        MsgBox &quot;シート『売上データ』が存在しません&quot;
        Exit Sub
    End If

    ws.Range(&quot;A1&quot;).Value = &quot;OK&quot;
End Sub</code></pre>



<p class="wp-block-paragraph">ポイントは、シート取得を試みた直後に <code>On Error GoTo 0</code> で解除していることです。そのうえで、<code>If ws Is Nothing Then</code> を使って結果を判定しています。</p>



<h3 class="wp-block-heading"><span id="toc11">Resume Nextの危険性と注意点</span></h3>



<p class="wp-block-paragraph"><code>On Error Resume Next</code> を Sub の先頭に1行貼り付けて、それ以降すべてエラー無視にする書き方があります。これは絶対にやめてください。</p>



<pre class="wp-block-code"><code>Sub BadExample()
    On Error Resume Next  'NG: 全文無視は危険

    '--- 以下、すべてのエラーが見えなくなる ---
    Range(&quot;A1&quot;).Value = &quot;テスト&quot;
    Worksheets(&quot;存在しないシート&quot;).Activate
    Workbooks.Open &quot;C:nonexistent.xlsx&quot;
    '何もエラーが出ないが、何も処理されていない
End Sub</code></pre>



<p class="wp-block-paragraph">このコードは一見「エラーが出ないから動いている」ように見えます。しかし実際は、シートを開けず、ファイルも読めず、ただ何もしていない状態です。</p>



<p class="wp-block-paragraph">実務での被害例として、「データ転記マクロが何ヶ月も空のシートを出し続けていた」というケースがあります。原因はリファクタ時に紛れ込んだ <code>On Error Resume Next</code> でした。</p>



<h3 class="wp-block-heading"><span id="toc12">局所的に使うブロック化テクニック</span></h3>



<p class="wp-block-paragraph"><code>On Error Resume Next</code> を使うときは、次の3点セットで囲むのが鉄則です。</p>



<ol class="wp-block-list"><li><code>On Error Resume Next</code> でブロック開始</li><li>試したい処理を <strong>数行</strong> だけ書く</li><li><code>On Error GoTo 0</code> で必ず解除する</li></ol>



<pre class="wp-block-code"><code>Sub Sample_BlockResumeNext()
    Dim wb As Workbook

    '--- ブロック開始 ---
    On Error Resume Next
    Set wb = Workbooks.Open(&quot;C:reportssales.xlsx&quot;)
    On Error GoTo 0
    '--- ブロック終了 ---

    '--- ブロックの結果を判定 ---
    If wb Is Nothing Then
        MsgBox &quot;ファイルを開けませんでした&quot;
        Exit Sub
    End If

    MsgBox &quot;開けました: &quot; &amp; wb.Name
End Sub</code></pre>



<p class="wp-block-paragraph">「Resume Next を使ってよいのは、すぐに <code>On Error GoTo 0</code> するときだけ」と覚えておけば、まず事故は起こりません。</p>



<h2 class="wp-block-heading"><span id="toc13">ErrオブジェクトでエラーNo・説明を取得する</span></h2>



<p class="wp-block-paragraph"><code>Err</code> オブジェクトは、直近に発生したエラーの情報を保持するVBA組み込みオブジェクトです。エラーハンドラ内で <code>Err.Number</code> を見れば、どんなエラーが起きたのかをコードで判定できます。</p>



<h3 class="wp-block-heading"><span id="toc14">Err.Number / Err.Description / Err.Sourceの使い方</span></h3>



<p class="wp-block-paragraph">主要なプロパティは3つです。</p>



<figure class="wp-block-table"><table><thead><tr><th>プロパティ</th><th>戻り値の型</th><th>意味</th></tr></thead><tbody><tr><td>Err.Number</td><td>Long</td><td>エラー番号（例: 13、1004、9、91、438）</td></tr><tr><td>Err.Description</td><td>String</td><td>エラーの説明文（例: &#8220;型が一致しません&#8221;）</td></tr><tr><td>Err.Source</td><td>String</td><td>エラー発生元の名前（例: &#8220;VBAProject&#8221;）</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">エラーハンドラ内で番号別に分岐させるサンプルです。</p>



<pre class="wp-block-code"><code>Sub Sample_ErrObject()
    On Error GoTo ErrHandler

    Dim n As Integer
    n = CInt(&quot;abc&quot;)  'エラー13発生

    Exit Sub

ErrHandler:
    '--- エラー番号で処理を分岐 ---
    Select Case Err.Number
        Case 13
            MsgBox &quot;数値変換に失敗しました: &quot; &amp; Err.Description
        Case 9
            MsgBox &quot;シートが見つかりません: &quot; &amp; Err.Description
        Case Else
            MsgBox &quot;想定外のエラー [&quot; &amp; Err.Number &amp; &quot;]: &quot; &amp; _
                   Err.Description
    End Select
End Sub</code></pre>



<p class="wp-block-paragraph"><code>Select Case Err.Number</code> で番号別に分岐させると、エラーメッセージを「具体的にどう困っているのか」が伝わる文言にカスタマイズできます。利用者は次に取るべきアクションを判断しやすくなります。</p>



<h3 class="wp-block-heading"><span id="toc15">Err.Clearでエラー情報をリセットする</span></h3>



<p class="wp-block-paragraph"><code>Err.Clear</code> メソッドを使うと、<code>Err</code> オブジェクトに保持されているエラー情報をリセットできます。</p>



<pre class="wp-block-code"><code>Sub Sample_ErrClear()
    Dim ws As Worksheet

    On Error Resume Next
    Set ws = Worksheets(&quot;シート1&quot;)
    If Err.Number &lt;&gt; 0 Then
        MsgBox &quot;シート1が見つかりません&quot;
        Err.Clear  'エラー情報をクリア
    End If

    Set ws = Worksheets(&quot;シート2&quot;)
    If Err.Number &lt;&gt; 0 Then
        MsgBox &quot;シート2が見つかりません&quot;
        Err.Clear
    End If
    On Error GoTo 0
End Sub</code></pre>



<p class="wp-block-paragraph"><code>Err.Clear</code> を入れておかないと、前のエラー情報が残ったまま次の処理に進みます。そのため、<code>If Err.Number <> 0 Then</code> の判定が誤動作する可能性があります。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p><code>Resume</code> <code>Resume Next</code> <code>On Error GoTo</code> などの実行時には、VBAが自動的に <code>Err.Clear</code> を呼び出します。明示的な <code>Err.Clear</code> が必要なのは、<code>On Error Resume Next</code> で複数の処理を試行する場合です。</p></blockquote>



<h3 class="wp-block-heading"><span id="toc16">ログ出力に活用する</span></h3>



<p class="wp-block-paragraph"><code>Err</code> オブジェクトの情報は、テキストファイルへのログ出力にも活用できます。</p>



<pre class="wp-block-code"><code>Sub Sample_ErrLog()
    On Error GoTo ErrHandler
    '--- 通常処理 ---
    Workbooks.Open &quot;C:reportssales.xlsx&quot;
    Exit Sub

ErrHandler:
    '--- ログファイルに追記 ---
    Dim logPath As String
    logPath = ThisWorkbook.Path &amp; &quot;error.log&quot;

    Dim ff As Integer
    ff = FreeFile
    Open logPath For Append As #ff
    Print #ff, Format(Now, &quot;yyyy-mm-dd hh:nn:ss&quot;) &amp; _
               vbTab &amp; Err.Number &amp; vbTab &amp; Err.Description
    Close #ff
End Sub</code></pre>



<p class="wp-block-paragraph">エラー発生日時・番号・説明をタブ区切りで追記しておくと、後から「いつ・どんなエラーが起きたか」を CSV ライクに分析できます。</p>



<h2 class="wp-block-heading"><span id="toc17">実務シーン別エラーハンドリング雛形5選</span></h2>



<p class="wp-block-paragraph">ここからは、業務でVBAを書くときに遭遇しやすい5つのシーンごとに、雛形コードと注意点をまとめます。</p>



<h3 class="wp-block-heading"><span id="toc18">シーン1: 開きたいファイルが存在しない</span></h3>



<p class="wp-block-paragraph"><code>Workbooks.Open</code> でファイルを開く処理は、ファイル不在時に実行時エラー1004を起こします。事前に <code>Dir</code> 関数で存在チェックする方法と、<code>On Error</code> で囲む方法の両方があります。</p>



<pre class="wp-block-code"><code>Sub Scene1_FileNotFound()
    Const filePath As String = &quot;C:reportssales.xlsx&quot;

    '--- ① 事前チェック：Dir関数で存在確認 ---
    If Dir(filePath) = &quot;&quot; Then
        MsgBox &quot;ファイルが見つかりません: &quot; &amp; filePath
        Exit Sub
    End If

    '--- ② エラーハンドラ付きで開く ---
    On Error GoTo ErrHandler
    Dim wb As Workbook
    Set wb = Workbooks.Open(filePath)

    MsgBox &quot;開きました: &quot; &amp; wb.Name
    wb.Close SaveChanges:=False
    Exit Sub

ErrHandler:
    MsgBox &quot;ファイルを開けませんでした: &quot; &amp; Err.Description
End Sub</code></pre>



<p class="wp-block-paragraph">ポイントは、<strong><code>Dir</code> で事前チェック + <code>On Error GoTo</code> の二重防御</strong> です。<code>Dir</code> だけでは「他のユーザーがファイルを開いている」「権限が無い」場合をカバーできません。そのため、<code>On Error</code> も併用するのがおすすめです。</p>



<h3 class="wp-block-heading"><span id="toc19">シーン2: 指定したシートが見つからない</span></h3>



<p class="wp-block-paragraph"><code>Worksheets("名前")</code> でシートを取得する処理は、シートが無いと実行時エラー9（添字が有効範囲にありません）を起こします。</p>



<pre class="wp-block-code"><code>Sub Scene2_SheetNotFound()
    Dim ws As Worksheet

    '--- Resume Next + Is Nothing判定 ---
    On Error Resume Next
    Set ws = ThisWorkbook.Worksheets(&quot;売上データ&quot;)
    On Error GoTo 0

    If ws Is Nothing Then
        MsgBox &quot;シート『売上データ』が存在しません&quot;
        Exit Sub
    End If

    '--- 通常処理 ---
    ws.Range(&quot;A1&quot;).Value = &quot;更新済み&quot;
End Sub</code></pre>



<p class="wp-block-paragraph"><code>On Error Resume Next</code> で囲む範囲を <code>Set ws = ...</code> の1行だけに限定し、すぐに <code>On Error GoTo 0</code> で解除しています。これがブロック化の基本パターンです。</p>



<h3 class="wp-block-heading"><span id="toc20">シーン3: 数値変換に失敗する（型ミスマッチ）</span></h3>



<p class="wp-block-paragraph"><code>CInt</code> <code>CLng</code> <code>CDbl</code> などの型変換関数は、変換できない値が来ると実行時エラー13を発生させます。<code>IsNumeric</code> で事前判定する方法が最も読みやすくなります。</p>



<pre class="wp-block-code"><code>Sub Scene3_TypeMismatch()
    Dim raw As Variant
    Dim n As Long

    raw = Range(&quot;A1&quot;).Value

    '--- ① IsNumericで事前判定 ---
    If Not IsNumeric(raw) Then
        MsgBox &quot;A1セルの値が数値ではありません: &quot; &amp; raw
        Exit Sub
    End If

    n = CLng(raw)
    MsgBox &quot;変換結果: &quot; &amp; n
End Sub</code></pre>



<p class="wp-block-paragraph"><code>IsNumeric</code> は引数が数値とみなせる文字列なら <code>True</code> を返すため、<code>CLng</code> 直前のガードとして最適です。事前チェックで弾けるなら、<code>On Error</code> を使うよりコードが読みやすくなります。</p>



<h3 class="wp-block-heading"><span id="toc21">シーン4: ループ内で1行だけスキップしたい</span></h3>



<p class="wp-block-paragraph">ループ処理中、1件だけエラーが出ても残りは最後まで処理を続けたい、という要件はよくあります。<code>On Error Resume Next</code> をループ内で短く囲むのがコツです。</p>



<pre class="wp-block-code"><code>Sub Scene4_SkipInLoop()
    Dim i As Long
    Dim lastRow As Long
    Dim n As Long

    lastRow = Cells(Rows.Count, &quot;A&quot;).End(xlUp).Row

    For i = 2 To lastRow
        '--- 1行ごとにエラーをリセットして試行 ---
        On Error Resume Next
        n = CLng(Cells(i, &quot;A&quot;).Value)

        If Err.Number = 0 Then
            Cells(i, &quot;B&quot;).Value = n * 2
        Else
            Cells(i, &quot;B&quot;).Value = &quot;ERR&quot;
            Err.Clear
        End If
        On Error GoTo 0
    Next i
End Sub</code></pre>



<p class="wp-block-paragraph">ポイントは、ループ反復ごとに決まった手順を踏むことです。<code>On Error Resume Next</code> で開始 → 試行 → <code>Err.Number</code> で判定 → <code>Err.Clear</code> でリセット → <code>On Error GoTo 0</code> で解除、という流れです。エラー情報を毎回クリアしないと、次のループで誤判定が起きます。</p>



<h3 class="wp-block-heading"><span id="toc22">シーン5: 外部アプリ連携（Outlook/IE）が失敗する</span></h3>



<p class="wp-block-paragraph">OutlookやWordなど、他のOfficeアプリを操作するマクロは、相手側の状態によってエラーが起きます。アプリが起動していなかったり、ライブラリが参照設定されていなかったりすると発生します。代表的なエラー番号は438（メソッド未対応）と429（オブジェクトが見つかりません）です。</p>



<pre class="wp-block-code"><code>Sub Scene5_ExternalApp()
    Dim olApp As Object

    On Error GoTo ErrHandler

    '--- ① 既存のOutlookを取得を試行 ---
    Set olApp = GetObject(, &quot;Outlook.Application&quot;)

    '--- ② 通常処理 ---
    MsgBox &quot;Outlook 取得成功: &quot; &amp; olApp.Name
    Exit Sub

ErrHandler:
    '--- 取得失敗時の処理 ---
    Select Case Err.Number
        Case 429
            MsgBox &quot;Outlookが起動していません。先に起動してください。&quot;
        Case Else
            MsgBox &quot;予期しないエラー [&quot; &amp; Err.Number &amp; &quot;]: &quot; &amp; _
                   Err.Description
    End Select
End Sub</code></pre>



<p class="wp-block-paragraph">外部アプリ連携は、相手側の状態によってエラー番号が変わります。<code>Select Case Err.Number</code> で番号別にメッセージを出し分けると、ユーザーが次に取るべきアクションを案内できます。</p>



<h2 class="wp-block-heading"><span id="toc23">On Error構文の使い分けフロー</span></h2>



<p class="wp-block-paragraph">「結局どれを使えばいいの？」という疑問に答えるため、判定軸2つで使い分けを整理します。</p>



<h3 class="wp-block-heading"><span id="toc24">判定軸1: エラーで処理を止めるか継続するか</span></h3>



<figure class="wp-block-table"><table><thead><tr><th>要件</th><th>推奨構文</th><th>理由</th></tr></thead><tbody><tr><td>エラーが起きたら全体を中断したい</td><td>On Error GoTo ラベル + Exit Sub</td><td>エラー処理後に確実に終了</td></tr><tr><td>エラーが起きても残りを続行したい</td><td>On Error Resume Next（局所）</td><td>スキップして次へ</td></tr><tr><td>エラーは絶対に起こさせたくない</td><td>事前チェック（Dir / IsNumeric）</td><td>そもそもエラーを発生させない</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><span id="toc25">判定軸2: エラー後にどこから再開するか</span></h3>



<p class="wp-block-paragraph">エラーハンドラ内で <code>Resume</code> 系のステートメントを使うと、再開地点を選べます。</p>



<figure class="wp-block-table"><table><thead><tr><th>ステートメント</th><th>再開地点</th><th>用途</th></tr></thead><tbody><tr><td>Exit Sub</td><td>プロシージャ終了</td><td>エラー時に処理を中止する</td></tr><tr><td>Resume</td><td>エラー発生行</td><td>修正後にリトライしたい</td></tr><tr><td>Resume Next</td><td>エラー発生行の次</td><td>エラー行をスキップして続行</td></tr><tr><td>Resume ラベル</td><td>指定ラベル</td><td>クリーンアップ処理へ飛ばす</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><span id="toc26">やってはいけないアンチパターン3選</span></h3>



<p class="wp-block-paragraph">最後に、現場でよく見かけるNG例を3つ紹介します。</p>



<ol class="wp-block-list"><li><strong>Sub の先頭に <code>On Error Resume Next</code> を1行だけ書く</strong>: すべてのエラーが見えなくなり、最も危険</li><li><strong><code>Err.Clear</code> の呼び忘れ</strong>: ループ内で前のエラー情報が残り、次の判定が誤動作する</li><li><strong><code>On Error GoTo 0</code> の漏れ</strong>: 局所的に使ったつもりが、Sub末尾までエラー無視が続いてしまう</li></ol>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>WARNING</strong></p><p><code>On Error Resume Next</code> は3点セットを必ず守ってください。「最小限の範囲」「直後に Err.Number 判定」「すぐに On Error GoTo 0 で解除」です。</p></blockquote>



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



<h3 class="wp-block-heading"><span id="toc28">Try-Catchはあるか？</span></h3>



<p class="wp-block-paragraph">VBAには <code>.NET</code> のような <code>Try-Catch</code> 構文はありません。代わりに3点セットで疑似的に実装します。<code>On Error GoTo ラベル</code> + <code>Exit Sub</code> + ラベル位置のエラー処理ブロック、という構成です。書き方さえ覚えてしまえば、<code>Try-Catch</code> と同等のことが実現できます。</p>



<h3 class="wp-block-heading"><span id="toc29">Resume Nextは絶対に使ってはいけない？</span></h3>



<p class="wp-block-paragraph">そんなことはありません。<code>On Error Resume Next</code> は「ファイル削除を試みる（無くてもOK）」「シート存在チェック」など、<strong>失敗しても次に進めたい処理</strong> では正当な選択肢です。重要なのは、囲む範囲を最小限にして、すぐに <code>On Error GoTo 0</code> で解除することです。</p>



<h3 class="wp-block-heading"><span id="toc30">ハンドリング有無で処理速度は変わる？</span></h3>



<p class="wp-block-paragraph"><code>On Error</code> 構文そのものは、エラーが発生しない限りパフォーマンスに大きな影響を与えません。ただし、ループ内で毎回 <code>On Error Resume Next</code> と <code>On Error GoTo 0</code> を呼ぶ構成は、わずかにオーバーヘッドが増えます。10万行を超える大量データを扱うときは、事前チェック方式（<code>IsNumeric</code> など）に切り替えると体感速度が変わります。</p>



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



<p class="wp-block-paragraph">VBAのエラーハンドリングは、<code>On Error GoTo</code> <code>On Error Resume Next</code> <code>Err オブジェクト</code> の3要素で構築します。</p>



<ul class="wp-block-list"><li><code>On Error GoTo ラベル</code>: エラー時に専用ブロックへジャンプ。<code>Exit Sub</code> とセットで使う</li><li><code>On Error Resume Next</code>: 最小範囲で囲み、<code>Err.Number</code> 判定後に <code>On Error GoTo 0</code> で解除する</li><li><code>Err オブジェクト</code>: <code>Err.Number</code> で番号別分岐、<code>Err.Clear</code> でリセット、ログ出力にも使える</li></ul>



<p class="wp-block-paragraph">実務でよく遭遇する5つのシーンには、本記事の雛形コードがそのまま使えます。「ファイル不在」「シート不在」「型ミスマッチ」「ループスキップ」「外部アプリ連携」の各シーンで、コピペしてカスタマイズすれば堅牢なマクロが書けるようになります。</p>



<p class="wp-block-paragraph"><code>On Error Resume Next</code> を1行貼り付けて凌ぐのは今日でやめてみてください。判定軸2つに沿って構文を使い分けるエラーハンドリング設計に切り替えると、次にエラーが起きたときの落ち着き具合がまったく違うはずです。</p>



<p class="wp-block-paragraph">エラー番号別の対処法（13・1004・9・91・438など）は、姉妹記事の<a href="https://mashukabu.com/vba-error-guide/">VBAマクロのエラー解決ガイド｜実行時エラー13・1004・9など頻出エラー別の直し方</a>で詳しく解説しています。あわせてご覧ください。</p>



<p class="wp-block-paragraph">VBAの基本構文（変数宣言・条件分岐・LastRow取得）はそれぞれ、<a href="https://mashukabu.com/excel-vba-variable-explanation/">Excel VBAの変数の使い方</a>、<a href="https://mashukabu.com/excel-vba-conditional-branch-explanation/">Excel VBAの条件分岐（If文）の使い方</a>、<a href="https://mashukabu.com/excel-vba-howto-get-lastrow/">Excel VBAでLastRowを取得する方法</a>で詳しくまとめています。VBAをこれから本格的に始めたい方は、入門ハブ記事の<a href="https://mashukabu.com/excel-vba-automation-guide/">Excel VBAでマクロ自動化を始めるための完全ガイド</a>もぜひ参考にしてください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/vba-error-handling-complete-guide/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>引き継いだExcelマクロを読み解く5ステップ｜前任者のVBAコードを解読する方法</title>
		<link>https://mashukabu.com/vba-macro-reading-guide/</link>
					<comments>https://mashukabu.com/vba-macro-reading-guide/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Fri, 12 Jun 2026 21:55:46 +0000</pubDate>
				<category><![CDATA[VBA・マクロ]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[VBE]]></category>
		<category><![CDATA[デバッグ]]></category>
		<category><![CDATA[マクロ]]></category>
		<category><![CDATA[引き継ぎ]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=7935</guid>

					<description><![CDATA[前任者のVBAマクロを読み解く5ステップを解説。VBEの開き方・変数名の読み方・For/Do/With/On Errorの構文パターン早見表・F8ステップ実行まで網羅。コードが書けなくても読めるようになる実践ガイド。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">「前任者が作ったマクロが動かなくなった。でもコードを見ても、何が書いてあるかさっぱり分からない」——引き継ぎ業務でこんな場面に遭遇していませんか。</p>



<p class="wp-block-paragraph">VBAの知識がないまま担当が回ってきた事務系の方にとって、Excelマクロのコード解読は本当に頭の痛い問題です。修正しようにも、どこから手をつければよいか見当もつきません。</p>



<p class="wp-block-paragraph">しかし、ご安心ください。<strong>VBAコードは「書ける」ようになる前に「読める」ようになれば十分</strong>です。読めれば原因がわかり、原因がわかれば外注や同僚に相談する糸口になります。</p>



<p class="wp-block-paragraph">この記事では、引き継いだExcelマクロを読み解くための実践的な5ステップを解説します。VBEの開き方から、変数名の読み方、ループや条件分岐の構文パターン早見表、F8ステップ実行まで網羅。コードを1行も書いたことがない方でも、前任者のVBAの意図がつかめるようになる内容です。</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">引き継いだマクロが読めない理由と解決策</a></li><li><a href="#toc2" tabindex="0">【準備】VBEを開いてコードを確認する</a><ol><li><a href="#toc3" tabindex="0">VBEの画面構成を5分で把握する</a></li><li><a href="#toc4" tabindex="0">どのモジュールに何が書いてある？</a></li></ol></li><li><a href="#toc5" tabindex="0">【5ステップ】前任者のVBAコードを読み解く手順</a><ol><li><a href="#toc6" tabindex="0">ステップ1：全体構造を鳥瞰する</a></li><li><a href="#toc7" tabindex="0">ステップ2：変数名から処理の意図を読む</a></li><li><a href="#toc8" tabindex="0">ステップ3：ループと条件分岐のパターンを認識する</a></li><li><a href="#toc9" tabindex="0">ステップ4：エラー処理の有無を確認する</a></li><li><a href="#toc10" tabindex="0">ステップ5：F8ステップ実行で実際の動きを追う</a></li></ol></li><li><a href="#toc11" tabindex="0">【早見表】よく出るコードパターンの読み方</a></li><li><a href="#toc12" tabindex="0">小改修にチャレンジ：コードを触ってみる</a></li><li><a href="#toc13" tabindex="0">まとめ：「書けなくても読める」から始める</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">引き継いだマクロが読めない理由と解決策</span></h2>



<p class="wp-block-paragraph">前任者のVBAコードが読めない理由は、大きく3つに整理できます。</p>



<p class="wp-block-paragraph">1つ目は「VBE（コード編集画面）の開き方すら分からない」という入口の問題。2つ目は「変数名やキーワードの意味が分からない」という語彙の問題。3つ目は「F8キーで動きを追う」というデバッグ手法を知らないという技術の問題です。</p>



<p class="wp-block-paragraph">これらは順番に解消できます。VBEを開く方法はキーボードショートカット1つ。変数名のルールは早見表で覚えられます。F8ステップ実行は、コードの動きを1行ずつ目で追えるVBAの最強の武器です。</p>



<p class="wp-block-paragraph">本記事では「書けなくても読める」をゴールにしています。コードを自分で書けるようになるには数か月の学習が必要ですが、<strong>読んで意図をつかむだけなら半日で身につきます</strong>。完璧を目指さず、まずは前任者が何をしたかったのかを推測できるレベルを目指しましょう。</p>



<p class="wp-block-paragraph">そして、読めるようになれば次の選択肢が見えてきます。自分で軽微な修正をする、外注に正確な依頼内容を伝える、同僚に「ここのループが原因では」と相談する——これらは全て「読める」から始まります。</p>



<h2 class="wp-block-heading"><span id="toc2">【準備】VBEを開いてコードを確認する</span></h2>



<p class="wp-block-paragraph">VBAコードを読むには、まず編集画面である「VBE（Visual Basic Editor）」を開く必要があります。Excelとは別の専用画面で動作します。</p>



<h3 class="wp-block-heading"><span id="toc3">VBEの画面構成を5分で把握する</span></h3>



<p class="wp-block-paragraph">VBEを開く方法は2つあります。最も速いのは<strong>Alt+F11キーを押す</strong>方法です。Excelファイルを開いた状態でこのショートカットを押せば、瞬時にVBEが起動します。</p>



<p class="wp-block-paragraph">もう1つの方法は「開発」タブから「Visual Basic」をクリックする方法。「開発」タブが表示されていない場合は、Excelの「ファイル」→「オプション」→「リボンのユーザー設定」で「開発」にチェックを入れてください。</p>



<p class="wp-block-paragraph">VBEを開くと、いくつかのウィンドウが表示されます。それぞれの役割を押さえておきましょう。</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>Ctrl+Gで表示</td><td>デバッグ用の入出力</td></tr><tr><td>ローカルウィンドウ</td><td>「表示」メニューから</td><td>実行中の変数の現在値</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">まずは左上のプロジェクトエクスプローラーと中央のコードウィンドウを意識すれば十分です。VBEの画面構成をさらに詳しく知りたい方は、<a href="https://mashukabu.com/excel-vba-vbe-menu-explanation/">ExcelのVBE画面構成と各メニューの役割</a>も参考にしてください。</p>



<h3 class="wp-block-heading"><span id="toc4">どのモジュールに何が書いてある？</span></h3>



<p class="wp-block-paragraph">プロジェクトエクスプローラーを見ると、ブック名の下にいくつかの「モジュール」が並んでいます。モジュールとは、コードを格納する「引き出し」のようなものです。</p>



<p class="wp-block-paragraph">モジュールには5つの種類があり、それぞれ役割が違います。</p>



<ul class="wp-block-list"><li><strong>標準モジュール</strong>: 汎用的な処理を書く場所。最もよく使われる</li><li><strong>シートモジュール（Sheet1など）</strong>: そのシート専用のイベント処理</li><li><strong>ThisWorkbookモジュール</strong>: ブックを開く・閉じる時の処理</li><li><strong>ユーザーフォームモジュール</strong>: ダイアログ画面の処理</li><li><strong>クラスモジュール</strong>: カスタムオブジェクトの定義（上級者向け）</li></ul>



<p class="wp-block-paragraph">引き継いだマクロの場合、まずは<strong>標準モジュール</strong>を開いてみましょう。汎用的な処理の8〜9割はここに書かれています。</p>



<p class="wp-block-paragraph">プロジェクトエクスプローラーで「標準モジュール」フォルダを展開し、中にある「Module1」などをダブルクリック。中央のコードウィンドウにコードが表示されたら準備完了です。モジュールとプロシージャの関係性については、<a href="https://mashukabu.com/excel-vba-project-module-procedure/">VBAのプロジェクト・モジュール・プロシージャの違い</a>も参照してください。</p>



<h2 class="wp-block-heading"><span id="toc5">【5ステップ】前任者のVBAコードを読み解く手順</span></h2>



<p class="wp-block-paragraph">ここからが本題です。コードを開いたら、いきなり1行目から読み始めてはいけません。<strong>全体→細部の順</strong>で読むのが鉄則です。</p>



<h3 class="wp-block-heading"><span id="toc6">ステップ1：全体構造を鳥瞰する</span></h3>



<p class="wp-block-paragraph">まずはコード全体を眺めて、規模感と構造を把握します。具体的にチェックするのは次の3点です。</p>



<ol class="wp-block-list"><li><strong>Sub〜End Subの個数</strong>: 1つの「Sub」が1つの処理単位（プロシージャ）。数えれば全体の規模が分かる</li><li><strong>Option Explicitの有無</strong>: 1行目にあれば変数宣言が強制されており、型情報が読みやすい</li><li><strong>プロシージャ名</strong>: <code>Sub データ集計()</code> のように、Sub直後の名前を全部拾い読みする</li></ol>



<p class="wp-block-paragraph">例えば次のようなコードがあったとします。</p>



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

Sub データ取得()
    ' 処理...
End Sub

Sub データ集計()
    ' 処理...
End Sub

Sub レポート出力()
    ' 処理...
End Sub</code></pre>



<p class="wp-block-paragraph">このコードは「取得→集計→出力」の3段階の処理で構成されている、と一目で読み取れます。前任者の意図した処理の流れが、プロシージャ名から見えてくるはずです。</p>



<h3 class="wp-block-heading"><span id="toc7">ステップ2：変数名から処理の意図を読む</span></h3>



<p class="wp-block-paragraph">VBAでは、変数名に「型のヒント」を付ける慣習があります。これを<strong>ハンガリアン記法</strong>と呼びます。</p>



<p class="wp-block-paragraph">変数名の先頭にある2〜3文字のプレフィックス（接頭辞）を見れば、その変数が何を入れるためのものか即座に判断できます。早見表で覚えてしまいましょう。</p>



<figure class="wp-block-table"><table><thead><tr><th>プレフィックス</th><th>データ型</th><th>意味</th></tr></thead><tbody><tr><td><code>str</code></td><td>String</td><td>文字列</td></tr><tr><td><code>lng</code> / <code>i</code> / <code>j</code></td><td>Long / Integer</td><td>整数</td></tr><tr><td><code>dbl</code></td><td>Double</td><td>小数</td></tr><tr><td><code>bln</code></td><td>Boolean</td><td>真偽値（True / False）</td></tr><tr><td><code>rng</code></td><td>Range</td><td>セル範囲</td></tr><tr><td><code>ws</code></td><td>Worksheet</td><td>シート</td></tr><tr><td><code>wb</code></td><td>Workbook</td><td>ブック</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">例えば <code>Dim strName As String</code> を見れば「文字列を入れる変数」、<code>Dim wsTarget As Worksheet</code> なら「シートを入れる変数」だと推測できます。</p>



<p class="wp-block-paragraph">変数名は前任者が<strong>コードに残したコメント</strong>のようなものです。<code>lngRowCount</code> なら「行数を数える整数の変数」、<code>rngData</code> なら「データ範囲のセル」と読めれば、コードの意図がぐっと見えてきます。VBAの変数とデータ型の詳細は、<a href="https://mashukabu.com/excel-vba-variable-explanation/">VBAの変数と宣言を初心者向けに解説</a>で深掘りできます。</p>



<h3 class="wp-block-heading"><span id="toc8">ステップ3：ループと条件分岐のパターンを認識する</span></h3>



<p class="wp-block-paragraph">VBAコードの大半は「繰り返し（ループ）」と「分岐（If）」で構成されています。代表的なパターンを暗記すれば、コードの流れが追えるようになります。</p>



<p class="wp-block-paragraph">最頻出は <strong>For〜Next ループ</strong>です。「決まった回数を繰り返す」処理に使います。</p>



<pre class="wp-block-code"><code>For i = 1 To 10
    ' iが1から10まで、合計10回繰り返す処理
Next i</code></pre>



<p class="wp-block-paragraph"><code>i = 1 To 10</code> は「iを1から10まで変化させる」という意味。ループ内の処理が10回実行されます。<code>Step -1</code> で逆順、<code>Step 2</code> で2つ飛ばしになります。詳しくは<a href="https://mashukabu.com/excel-vba-howto-use-for/">VBAのFor〜Next構文の使い方</a>で解説しています。</p>



<p class="wp-block-paragraph">次に <strong>For Each〜Next</strong>。これは「集合の中の全要素」に対して処理を行うループです。</p>



<pre class="wp-block-code"><code>For Each ws In Worksheets
    ' 全シートに同じ処理。wsが各シートを順に指す
Next ws</code></pre>



<p class="wp-block-paragraph">「全シート」「全セル」「全ファイル」のように、要素の数を数えなくても全部を回したい時に使われます。</p>



<h3 class="wp-block-heading"><span id="toc9">ステップ4：エラー処理の有無を確認する</span></h3>



<p class="wp-block-paragraph">「On Error」で始まる行があるかどうかを確認します。これはエラー発生時の挙動を制御する命令です。</p>



<pre class="wp-block-code"><code>On Error GoTo ErrHandler   ' エラー時はErrHandlerラベルへジャンプ
On Error Resume Next       ' エラーを無視して次行へ進む
On Error GoTo 0            ' エラー処理をリセット</code></pre>



<p class="wp-block-paragraph">エラー処理が<strong>全くないコード</strong>は、何かトラブルがあると即座に止まります。一方、<code>On Error Resume Next</code> だらけのコードは、エラーが起きても気付かず誤った結果を出している可能性があります。</p>



<p class="wp-block-paragraph">「マクロが動かない」と言われている場合、<code>On Error GoTo</code> のラベル先（例：<code>ErrHandler:</code> の下）を読めば、想定エラーが何だったかが分かることも多いです。エラー処理の読み方は<a href="https://mashukabu.com/vba-error-handling-complete-guide/">VBAのエラー処理完全ガイド</a>も参考にしてください。</p>



<h3 class="wp-block-heading"><span id="toc10">ステップ5：F8ステップ実行で実際の動きを追う</span></h3>



<p class="wp-block-paragraph">ここまで来たら、コードを「実際に動かしながら」読みます。これがVBAデバッグの真骨頂です。</p>



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



<ol class="wp-block-list"><li>読みたい<code>Sub〜End Sub</code>の中にカーソルを置く</li><li><strong>F8キーを押す</strong> → 1行ずつ実行され、黄色いハイライトが移動する</li><li>「表示」→「ローカルウィンドウ」を開く → 変数の値がリアルタイムで表示される</li><li>F8を押し続けて、ループ条件・分岐・代入の流れを目で追う</li></ol>



<p class="wp-block-paragraph">特定の行から開始したい場合は、その行にカーソルを置いて<strong>F9キーを押し</strong>、ブレークポイント（赤い点）を設定します。F5で実行するとブレークポイント直前で自動停止し、そこからF8でステップ実行に切り替えられます。</p>



<p class="wp-block-paragraph">イミディエイトウィンドウ（Ctrl+G）に <code>? 変数名</code> と打てば、その場で変数の中身を確認できます。例えば <code>? rngData.Address</code> と打てば、<code>rngData</code> が指しているセル範囲のアドレスが表示されます。</p>



<h2 class="wp-block-heading"><span id="toc11">【早見表】よく出るコードパターンの読み方</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>For〜Next</td><td><code>For i = 1 To 10 ... Next i</code></td><td>iを1から10まで繰り返す</td></tr><tr><td>For Each〜Next</td><td><code>For Each ws In Worksheets</code></td><td>全シートに同じ処理</td></tr><tr><td>Do While〜Loop</td><td><code>Do While Cells(i,1) <> ""</code></td><td>セルが空でない間繰り返す</td></tr><tr><td>Do Until〜Loop</td><td><code>Do Until Cells(i,1) = ""</code></td><td>セルが空になるまで繰り返す</td></tr><tr><td>If〜Then〜Else</td><td><code>If x > 0 Then ... Else ...</code></td><td>xが正なら〜、それ以外は〜</td></tr><tr><td>Select Case</td><td><code>Select Case x ... Case 1 ...</code></td><td>xの値で複数分岐</td></tr><tr><td>With〜End With</td><td><code>With Range("A1") ... End With</code></td><td><code>.</code>から始まる行はそのオブジェクト</td></tr><tr><td>On Error GoTo</td><td><code>On Error GoTo ErrHandler</code></td><td>エラー時にラベルへジャンプ</td></tr><tr><td>Exit Sub</td><td><code>Exit Sub</code></td><td>プロシージャを途中で抜ける</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">特に注意したいのが <strong>Withブロック</strong>です。<code>.</code>（ドット）で始まる行は、Withで指定したオブジェクトに属します。</p>



<pre class="wp-block-code"><code>With Worksheets(&quot;Sheet1&quot;)
    .Range(&quot;A1&quot;).Value = &quot;hello&quot;   ' Sheet1のA1セルに代入
    .Range(&quot;A2&quot;).Font.Bold = True  ' Sheet1のA2を太字に
End With</code></pre>



<p class="wp-block-paragraph">上記の<code>.Range("A1")</code>は<code>Worksheets("Sheet1").Range("A1")</code>と同じ意味です。Withは記述を短くする省略記法ですが、慣れていないと「何のオブジェクトの操作か」が分かりにくくなる原因にもなります。</p>



<p class="wp-block-paragraph"><strong>Do While と Do Until の違い</strong>もよく混乱します。Whileは「条件が真の間ループ」、Untilは「条件が真になるまでループ」。意味が逆なので注意してください。</p>



<pre class="wp-block-code"><code>' データが入っている行を最後まで処理する例
Do While Cells(i, 1) &lt;&gt; &quot;&quot;
    ' A列のi行目が空でない間、繰り返す
    i = i + 1
Loop</code></pre>



<h2 class="wp-block-heading"><span id="toc12">小改修にチャレンジ：コードを触ってみる</span></h2>



<p class="wp-block-paragraph">読めるようになったら、ごく軽微な改修にチャレンジしてみましょう。「読める」と「直せる」の間には大きな壁がありますが、<strong>設定値の変更レベル</strong>なら初心者でも安全に行えます。</p>



<p class="wp-block-paragraph">例えば次のような改修は、リスクが低くて練習に最適です。</p>



<ul class="wp-block-list"><li>出力先のシート名を変える（<code>Worksheets("旧名")</code> を <code>Worksheets("新名")</code> に書き換える）</li><li>ループの繰り返し回数を変える（<code>For i = 1 To 10</code> を <code>For i = 1 To 20</code> に変える）</li><li>数値の閾値を変える（<code>If x > 100 Then</code> を <code>If x > 200 Then</code> に変える）</li><li>メッセージボックスの文言を変える（<code>MsgBox "完了"</code> を <code>MsgBox "処理が完了しました"</code> に変える）</li></ul>



<p class="wp-block-paragraph">改修前に必ず<strong>Excelファイルをコピーしてバックアップ</strong>を取ってください。VBAは「元に戻す（Ctrl+Z）」が効きにくいため、ファイル単位の保存が最も安全な保険になります。</p>



<p class="wp-block-paragraph">そして改修後は、必ずF8でステップ実行して動きを確認しましょう。いきなりF5で全実行すると、意図しない箇所でエラーが出ても原因が特定しづらくなります。</p>



<p class="wp-block-paragraph">逆に、ロジックそのものを変える改修（ループの構造を変える、分岐の条件を加えるなど）は、まだ無理をする必要はありません。<strong>読めるレベルで止めておいて、必要なら専門家に依頼する</strong>——これも立派な判断です。</p>



<h2 class="wp-block-heading"><span id="toc13">まとめ：「書けなくても読める」から始める</span></h2>



<p class="wp-block-paragraph">引き継いだVBAマクロを読み解く5ステップを振り返ります。</p>



<ol class="wp-block-list"><li><strong>全体構造を鳥瞰する</strong> — Subの数とプロシージャ名から処理の流れを把握</li><li><strong>変数名から意図を読む</strong> — ハンガリアン記法のプレフィックスで型を推測</li><li><strong>ループと分岐のパターンを認識する</strong> — For/Do/If/Select Caseの早見表で構文を判別</li><li><strong>エラー処理を確認する</strong> — On ErrorのラベルとResume Nextの場所をチェック</li><li><strong>F8ステップ実行で動きを追う</strong> — ローカルウィンドウで変数の値を目視確認</li></ol>



<p class="wp-block-paragraph">VBAは「自分で書けないと使えない」と思われがちですが、それは誤解です。<strong>読めるだけで、業務上の問題は8割解決します</strong>。原因の切り分け、外注への依頼、同僚への相談——これら全てに「読める力」が活きます。</p>



<p class="wp-block-paragraph">明日からの実践は、Alt+F11でVBEを開き、前任者のコードをコピー（バックアップ）した上で、Sub単位で1つずつF8ステップ実行してみることから始めてください。1日30分続ければ、1週間後には「だいたい何をやっているか」が見える状態になっているはずです。</p>



<p class="wp-block-paragraph">書けるようになるのはその先で構いません。まずは「読める」を目標に、引き継いだVBAコードと仲良くなっていきましょう。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/vba-macro-reading-guide/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ExcelマクロのVBAデバッグ方法｜ブレークポイントから変数確認まで</title>
		<link>https://mashukabu.com/excel-vba-debug-breakpoint-step-execution/</link>
					<comments>https://mashukabu.com/excel-vba-debug-breakpoint-step-execution/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Tue, 09 Jun 2026 01:45:55 +0000</pubDate>
				<category><![CDATA[VBA・マクロ]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[ウォッチウィンドウ]]></category>
		<category><![CDATA[ステップ実行]]></category>
		<category><![CDATA[デバッグ]]></category>
		<category><![CDATA[ブレークポイント]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=7888</guid>

					<description><![CDATA[VBAのマクロが動かないときに使うデバッグ方法を徹底解説。ブレークポイント（F9）でコードを一時停止し、ステップ実行（F8）で1行ずつ追う手順から、ローカル・ウォッチ・イミディエイトの3ウィンドウの使い分けまで、初心者でも迷わないフローチャート付きで説明します。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">VBAでマクロを書き始めると、誰もが必ず「実行したのに動かない」「エラーは出ないのに結果がおかしい」という壁にぶつかります。コードを何度見直しても原因がわからず、<code>MsgBox</code> をあちこちに仕込んでは消して、を繰り返した経験はありませんか。</p>



<p class="wp-block-paragraph">その「とりあえず MsgBox」のやり方は、実はとても効率が悪いんです。原因の見当がついていない段階で当てずっぽうに値を表示しても、たいていは見当違いの場所を見ているだけです。そうして時間ばかりが溶けていきます。終わったら表示用のコードを消し忘れて、本番でいきなりメッセージが出る、なんて事故も起きがちですよね。</p>



<p class="wp-block-paragraph">VBEには、こうした調査を専用にこなす「デバッグツール」が最初から備わっています。ブレークポイントでコードを途中で止め、1行ずつ実行し、変数の中身をその場で確認する。この一連の流れを覚えるだけで、「動かない」の原因特定は驚くほど速くなりますよ。</p>



<p class="wp-block-paragraph">この記事では、ブレークポイント（F9）とステップ実行（F8）を軸に解説します。さらに、ローカル・ウォッチ・イミディエイトの3ウィンドウの使い分けまでを通しで紹介します。「症状からツールを選ぶフローチャート」と「エラーは出ないのに結果がずれる論理エラーの実践シナリオ」も用意しました。毎回 MsgBox を仕込むやり方から、今日で卒業しましょう。</p>



<p class="wp-block-paragraph">なお、本記事は Microsoft 365 / Excel 2021 / 2019 の VBE を前提にしています。メニュー名は日本語版Excelの表記に合わせていますが、お使いの環境で多少異なる場合は読み替えてくださいね。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-3" checked><label class="toc-title" for="toc-checkbox-3">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">VBAデバッグとは何か｜なぜ必要なのか</a><ol><li><a href="#toc2" tabindex="0">デバッグが必要な2パターン（エラーで止まる／結果がおかしい）</a></li><li><a href="#toc3" tabindex="0">MsgBoxだけに頼るデバッグの限界</a></li></ol></li><li><a href="#toc4" tabindex="0">デバッグ4ステップ・フローチャート｜症状別ツール選択ガイド</a><ol><li><a href="#toc5" tabindex="0">症状1：実行時エラーで止まる場合</a></li><li><a href="#toc6" tabindex="0">症状2：エラーは出ないが結果がおかしい（論理エラー）の場合</a></li><li><a href="#toc7" tabindex="0">症状3：無限ループ・処理が終わらない場合</a></li></ol></li><li><a href="#toc8" tabindex="0">ブレークポイントの設定と解除方法（F9）</a><ol><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">ステップ実行で1行ずつ処理を追う（F8）</a><ol><li><a href="#toc13" tabindex="0">ステップイン・ステップオーバー・ステップアウトの違い</a></li><li><a href="#toc14" tabindex="0">ステップ実行とブレークポイントの組み合わせ方</a></li></ol></li><li><a href="#toc15" tabindex="0">変数の中身を確認する3つのウィンドウ</a><ol><li><a href="#toc16" tabindex="0">ローカルウィンドウ｜全変数を一覧で確認</a></li><li><a href="#toc17" tabindex="0">ウォッチウィンドウ｜条件付き中断で特定変数を監視</a></li><li><a href="#toc18" tabindex="0">イミディエイトウィンドウ｜Debug.Printでその場確認</a></li></ol></li><li><a href="#toc19" tabindex="0">デバッグツール使い分け早見表</a></li><li><a href="#toc20" tabindex="0">実践シナリオ｜論理エラーを追う手順（合計行スキップ問題）</a><ol><li><a href="#toc21" tabindex="0">Step1：ブレークポイントでループ前に止める</a></li><li><a href="#toc22" tabindex="0">Step2：F8ステップ実行で処理を1行ずつ追う</a></li><li><a href="#toc23" tabindex="0">Step3：ローカルウィンドウでカウンタ変数を確認</a></li><li><a href="#toc24" tabindex="0">Step4：問題箇所の特定と修正</a></li></ol></li><li><a href="#toc25" tabindex="0">まとめ｜デバッグを習慣にして「動かない」を素早く解決しよう</a><ol><li><a href="#toc26" tabindex="0">各ツールの詳細は専門記事へ</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">VBAデバッグとは何か｜なぜ必要なのか</span></h2>



<p class="wp-block-paragraph">デバッグとは、ひとことで言えば「バグ（不具合）の原因を突き止めて直す作業」です。VBAにおいては、書いたコードがなぜ意図どおりに動かないのかを調査し、修正するまでの一連のプロセスを指します。</p>



<p class="wp-block-paragraph">ここで大事なのは、VBAのエラーには種類があり、種類によって対処の入り口が変わるという点です。Microsoftの公式分類では、VBA（Visual Basic）のエラーは次の3種類に分かれます。</p>



<ol class="wp-block-list"><li><strong>構文エラー（コンパイルエラー）</strong>: コードの書き方そのものが間違っているエラーです。実行前にVBEが検出します。</li><li><strong>実行時エラー</strong>: マクロを動かした途中で発生するエラーです。「実行時エラー 1004」などがこれにあたります。</li><li><strong>論理エラー</strong>: エラーメッセージは出ないのに、処理結果が意図と違うバグです。</li></ol>



<p class="wp-block-paragraph">構文エラーは実行する前にVBEが指摘してくれるので、比較的気づきやすい部類です。やっかいなのは残りの2つ、つまり「実行時エラーで止まる」場合と「論理エラーで結果がずれる」場合です。この記事のデバッグツールは、まさにこの2パターンの原因調査に効きます。</p>



<h3 class="wp-block-heading"><span id="toc2">デバッグが必要な2パターン（エラーで止まる／結果がおかしい）</span></h3>



<p class="wp-block-paragraph">デバッグツールを使う場面は、大きく2パターンに分けられます。この区別を意識しておくと、後で紹介するツール選びがぐっと楽になりますよ。</p>



<p class="wp-block-paragraph">1つ目は「実行時エラーで止まる」パターンです。マクロを実行すると赤い画面が出て、特定の行が黄色くハイライトされた状態で止まります。この黄色い行が、エラーが起きた場所です。</p>



<p class="wp-block-paragraph">2つ目は「エラーは出ないが結果がおかしい」パターン、いわゆる論理エラーです。マクロは最後まで普通に動くのに、合計が合わない、転記先が1行ずれている、といった症状が出ます。エラーが出ない分、どこが悪いのか見当をつけにくく、デバッグツールの真価が問われる場面です。</p>



<p class="wp-block-paragraph">止まる場合は「止まった場所」が手がかりになります。止まらない場合は「処理を1行ずつ追って、おかしくなる瞬間を捕まえる」必要があります。アプローチが違うので、まずは自分がどちらの状況かを見極めてくださいね。</p>



<p class="wp-block-paragraph">なお、実行時エラーの番号別の直し方（エラー13・1004・9など）については、<a href="https://mashukabu.com/vba-error-guide/">VBAマクロのエラー解決ガイド</a>で原因と修正コードをセットでまとめています。本記事の「調査ツールの使い方」と、エラーガイドの「番号別の直し方」は補完関係にあるので、あわせて読むと対応力が上がりますよ。</p>



<h3 class="wp-block-heading"><span id="toc3">MsgBoxだけに頼るデバッグの限界</span></h3>



<p class="wp-block-paragraph">VBAを始めたばかりの頃は、変数の中身を確認したいときに <code>MsgBox</code> を使う人が多いと思います。たとえば次のように書くわけです。</p>



<pre class="wp-block-code"><code>Sub MsgBoxデバッグの例()
    Dim i As Long
    Dim 合計 As Long

    For i = 1 To 10
        合計 = 合計 + Cells(i, 1).Value
        MsgBox &quot;i=&quot; &amp; i &amp; &quot; / 合計=&quot; &amp; 合計  '確認用に値を表示
    Next i
End Sub</code></pre>



<p class="wp-block-paragraph">このやり方でも値は確認できます。ただ、ループが10回まわれば10回ダイアログが出るので、そのたびにOKを押す手間がかかります。確認したい変数が増えるたびに <code>MsgBox</code> を書き足すことになり、コードがどんどん汚れていきます。</p>



<p class="wp-block-paragraph">さらに困るのが、消し忘れです。デバッグが終わったあとに削除し忘れると、本番運用中にいきなりメッセージボックスが出て処理が止まります。共有ファイルなら、他の人を巻き込んだ事故にもなりかねません。</p>



<p class="wp-block-paragraph">VBE標準のデバッグツールなら、コード本体に手を加えずに値を確認できます。確認用のコードを書かないので、消し忘れの事故も起きません。MsgBox方式から卒業する価値は十分にありますよ。</p>



<h2 class="wp-block-heading"><span id="toc4">デバッグ4ステップ・フローチャート｜症状別ツール選択ガイド</span></h2>



<p class="wp-block-paragraph">「ツールがたくさんあるのはわかったけど、結局どれから使えばいいの？」というのが、最初のつまずきポイントだと思います。そこで、症状からツールを選ぶ判断の流れを整理しました。</p>



<pre class="wp-block-code"><code>【デバッグ・ツール選択フローチャート】

(1) 症状を確認する
     │
     ├─ 赤い画面で止まる（実行時エラー）
     │        ↓
     │   止まった行と変数を見る
     │   → ローカルウィンドウで変数一覧を確認
     │   → エラー番号で原因を特定
     │
     ├─ エラーは出ないが結果がおかしい（論理エラー）
     │        ↓
     │   ブレークポイント(F9)で処理の手前に止める
     │   → ステップ実行(F8)で1行ずつ追う
     │   → ローカル/ウォッチで変数の変化を監視
     │
     └─ 処理が終わらない（無限ループ）
              ↓
          Ctrl+Break で強制中断
          → ステップ実行(F8)でループ条件を確認</code></pre>



<p class="wp-block-paragraph">このフローの肝は、「症状で入り口が決まる」という点です。止まるならまず止まった場所を見る、止まらないならブレークポイントで自分から止める。まずはこの大枠を頭に入れてくださいね。</p>



<p class="wp-block-paragraph">それぞれの症状について、もう少し具体的に見ていきましょう。</p>



<h3 class="wp-block-heading"><span id="toc5">症状1：実行時エラーで止まる場合</span></h3>



<p class="wp-block-paragraph">実行時エラーが出ると、エラーメッセージのダイアログが表示され、「デバッグ」ボタンを押すと該当行が黄色くハイライトされます。この黄色い行が、エラーが起きた場所です。</p>



<p class="wp-block-paragraph">まずやるべきは、止まった行の周辺で使われている変数の中身を確認することです。ここで活躍するのがローカルウィンドウです。現在のプロシージャの全変数とその値が一覧で表示されるので、「想定外の値が入っている変数」を探します。</p>



<p class="wp-block-paragraph">たとえば、シート名を変数で指定していて「インデックスが有効範囲にありません（実行時エラー 9）」で止まったとします。このときローカルウィンドウを見れば、変数に想定と違うシート名が入っていた、というケースがすぐ見つかります。</p>



<p class="wp-block-paragraph">止まった場所と変数の中身、この2つがそろえば原因の大半は特定できます。エラー番号ごとの代表的な原因は<a href="https://mashukabu.com/vba-error-guide/">エラー解決ガイド</a>で確認してみてくださいね。</p>



<h3 class="wp-block-heading"><span id="toc6">症状2：エラーは出ないが結果がおかしい（論理エラー）の場合</span></h3>



<p class="wp-block-paragraph">論理エラーは、エラーが出ない分だけ手強い相手です。マクロは正常終了するのに、合計が1件分足りない、転記先が1行ずれる、といった「結果のずれ」だけが残ります。</p>



<p class="wp-block-paragraph">この場合、エラーで止まってくれないので、自分から処理を止めにいく必要があります。手順はこうです。まずブレークポイント（F9）で怪しい処理の手前に止めます。次にステップ実行（F8）で1行ずつ進めながら、変数の値がおかしくなる瞬間を捕まえます。</p>



<p class="wp-block-paragraph">「どこで値がおかしくなるか」を一発で見つけたいときは、ウォッチウィンドウの条件付き中断も使えます。特定の変数が想定外の値になった瞬間に自動で止める、という芸当が可能です。詳しくは後半の実践シナリオで実演しますね。</p>



<p class="wp-block-paragraph">論理エラーは、エラーガイドのようなエラー番号別の対処では拾えない領域です。だからこそ、ステップ実行と変数確認の組み合わせが武器になりますよ。</p>



<h3 class="wp-block-heading"><span id="toc7">症状3：無限ループ・処理が終わらない場合</span></h3>



<p class="wp-block-paragraph">「実行ボタンを押したまま、いつまでも処理が終わらない」という症状もよくあります。多くの場合、<code>Do ～ Loop</code> や <code>For</code> の終了条件が満たされず、ループが回り続けているのが原因です。</p>



<p class="wp-block-paragraph">このときは、まず実行を止めなければ調査できません。<code>Ctrl + Break</code> を押すと、実行中のマクロを手動でブレークモードに切り替えられます。止まったら、ループのカウンタ変数や終了条件の変数をローカルウィンドウで確認します。</p>



<p class="wp-block-paragraph">たとえば、カウンタを増やすはずの行が抜けていて、条件が永遠に満たされないというパターンです。止めて変数を見れば、「カウンタがずっと同じ値のままだ」とすぐわかります。</p>



<p class="wp-block-paragraph">無限ループは「まず Ctrl+Break で止める」が合言葉です。止めてからステップ実行でループ条件を追えば、抜け出せない理由が見えてきますよ。</p>



<h2 class="wp-block-heading"><span id="toc8">ブレークポイントの設定と解除方法（F9）</span></h2>



<p class="wp-block-paragraph">ブレークポイントは、デバッグの出発点とも言える機能です。指定した行でコードの実行を一時停止させ、その時点の変数や状態をじっくり確認できるようにします。</p>



<h3 class="wp-block-heading"><span id="toc9">ブレークポイントの設定手順</span></h3>



<p class="wp-block-paragraph">ブレークポイントの設定方法は、公式に3通りあります。どれを使っても結果は同じなので、好きな方法で構いません。</p>



<ol class="wp-block-list"><li><strong>F9キー</strong>: 止めたい行にカーソルを置いて <code>F9</code> を押します（メニューでは「デバッグ」→「ブレークポイントの設定/解除」）。</li><li><strong>マージンバーをクリック</strong>: コードウィンドウ左端のグレーの帯（マージンインジケーターバー）をクリックします。</li><li><strong>ツールバーボタン</strong>: デバッグツールバーのボタンから設定します。</li></ol>



<p class="wp-block-paragraph">設定すると、その行が赤茶色にハイライトされ、左端に丸い印が表示されます。この状態でマクロを実行すると、ブレークポイントの行に到達した瞬間に処理が止まります。</p>



<pre class="wp-block-code"><code>Sub ブレークポイントの例()
    Dim i As Long
    Dim 合計 As Long

    For i = 1 To 10
        合計 = 合計 + Cells(i, 1).Value  ' ←この行にF9でブレークポイントを設定
    Next i

    MsgBox &quot;合計は &quot; &amp; 合計
End Sub</code></pre>



<p class="wp-block-paragraph">上の例では、合計を加算する行にブレークポイントを置いています。実行するとループの1回目でこの行の直前で止まり、変数の中身を確認できる状態になります。</p>



<h3 class="wp-block-heading"><span id="toc10">複数箇所への設定と一括クリアの方法</span></h3>



<p class="wp-block-paragraph">ブレークポイントは複数の行に同時に設定できます。処理の分岐ごとに置いておけば、「どのルートを通ったか」を確認するのに便利です。</p>



<p class="wp-block-paragraph">1行だけ解除したいときは、その行で再度 <code>F9</code> を押すか、マージンバーの丸印をもう一度クリックします。設定と解除が同じ操作なので、迷わないと思います。</p>



<p class="wp-block-paragraph">すべてのブレークポイントを一括で消したいときは、<code>Ctrl + Shift + F9</code> を押します（メニューでは「デバッグ」→「すべてのブレークポイントの解除」）。あちこちに設定して散らかったときは、これでまとめてリセットできますよ。</p>



<p class="wp-block-paragraph">なお、ブレークポイントは1つ知っておくべき仕様があります。<strong>ファイルを保存しても保持されません</strong>。Excelを閉じて次回起動すると、ブレークポイントはすべて消えています。「保存したのに次の日には消えていた」と驚かないようにしてくださいね。</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">もう1つ、コード中に書き込むタイプの停止方法として <code>Stop</code> ステートメントもあります。これはブレークポイントと同じくブレークモードに切り替わりますが、コードに書いた文字なので保存後も残ります。便利な反面、デバッグが終わったら必ず削除しないと本番で止まってしまうので、扱いには注意してくださいね。</p>



<h2 class="wp-block-heading"><span id="toc12">ステップ実行で1行ずつ処理を追う（F8）</span></h2>



<p class="wp-block-paragraph">ブレークポイントで処理を止めたら、次はステップ実行の出番です。ステップ実行とは、コードを1行ずつ実行しながら、各行で何が起きているかを目で追っていく操作のことです。</p>



<p class="wp-block-paragraph">ブレークモードで <code>F8</code> を押すと、ハイライトされている行が1行だけ実行され、次の行に黄色いハイライトが移ります。これを繰り返すことで、処理の流れと変数の変化を1行単位で観察できます。</p>



<h3 class="wp-block-heading"><span id="toc13">ステップイン・ステップオーバー・ステップアウトの違い</span></h3>



<p class="wp-block-paragraph">ステップ実行には、似たような名前のコマンドが3つあります。違いを押さえておくと、調査がぐっと速くなりますよ。</p>



<ul class="wp-block-list"><li><strong>ステップイン（F8）</strong>: 最も基本のステップ実行です。1行ずつ実行し、別のプロシージャを呼び出している行ではその中にも入っていきます。最も細かく追える反面、呼び出し先が長いと時間がかかります。</li><li><strong>ステップオーバー（Shift+F8）</strong>: 呼び出し先のプロシージャを1ステップとしてまとめて実行し、中には入りません。「このサブプロシージャは正しく動くと確信している」ときに使います。</li><li><strong>ステップアウト（Ctrl+Shift+F8）</strong>: 今いるプロシージャの残りを一気に実行し、呼び出し元の次の行に戻ります。「中に入りすぎたので、ここはもう抜けたい」ときに便利です。</li></ul>



<p class="wp-block-paragraph">さらに、<code>Ctrl + F8</code>（カーソル行の前まで実行）も覚えておくと役立ちます。大きなループを途中まで飛ばしたいとき、見たい行にカーソルを置いてこれを押せば、そこまで一気に進めますよ。</p>



<pre class="wp-block-code"><code>Sub ステップ実行の親プロシージャ()
    Dim 結果 As Long
    結果 = 二乗を計算(5)    ' ←F8でこの行に来たとき、F8なら関数の中へ／Shift+F8なら入らない
    MsgBox 結果
End Sub

Function 二乗を計算(n As Long) As Long
    二乗を計算 = n * n      ' 呼び出し先の中身
End Function</code></pre>



<p class="wp-block-paragraph">上の例で、<code>結果 = 二乗を計算(5)</code> の行で <code>F8</code>（ステップイン）を押すと <code>二乗を計算</code> 関数の中に入ります。<code>Shift + F8</code>（ステップオーバー）を押すと、関数の中身を一気に実行して <code>MsgBox</code> の行に進みます。</p>



<h3 class="wp-block-heading"><span id="toc14">ステップ実行とブレークポイントの組み合わせ方</span></h3>



<p class="wp-block-paragraph">ステップ実行とブレークポイントは、セットで使うと真価を発揮します。基本の流れは、「ブレークポイントで怪しい場所まで一気に進み、そこからステップ実行で細かく追う」というものです。</p>



<p class="wp-block-paragraph">たとえば、500行のデータを処理するマクロで、300行目あたりから結果がずれているとします。最初の1行目からF8で追っていたら、300回もF8を押さなければなりません。これは現実的ではないですよね。</p>



<p class="wp-block-paragraph">そこで、怪しい処理の手前にブレークポイントを置き、<code>F5</code>（実行/継続）で一気にそこまで進めます。到達したらF8に切り替えて、1行ずつ慎重に追っていきます。「ざっくり飛ばして、肝心な部分だけ細かく見る」という緩急が、効率的なデバッグのコツですよ。</p>



<p class="wp-block-paragraph">なお、調査の途中でもう最後まで実行してよいと判断したら、<code>F5</code> を押せばブレークモードから通常実行に戻ります。止めて、追って、再開して、という操作をテンポよく切り替えてみてくださいね。</p>



<h2 class="wp-block-heading"><span id="toc15">変数の中身を確認する3つのウィンドウ</span></h2>



<p class="wp-block-paragraph">処理を止めたり1行ずつ追ったりできるようになったら、次は「変数の中身をどう見るか」です。VBEには変数を確認するためのウィンドウが3つあり、それぞれ得意分野が違います。</p>



<p class="wp-block-paragraph">どのウィンドウもメニューの「表示」から開けます。VBEの画面構成そのものに不安がある方は、<a href="https://mashukabu.com/excel-vba-vbe-menu-explanation/">VBEの画面の見方を図解で解説した記事</a>で各ウィンドウの位置を先に確認しておくと、この先の説明が頭に入りやすいですよ。</p>



<h3 class="wp-block-heading"><span id="toc16">ローカルウィンドウ｜全変数を一覧で確認</span></h3>



<p class="wp-block-paragraph">ローカルウィンドウは、現在実行中のプロシージャ内のすべての変数とその値を、一覧で表示してくれるウィンドウです。「表示」→「ローカルウィンドウ」で開けます。</p>



<p class="wp-block-paragraph">最大の強みは、何も設定しなくても全変数がまとめて見える点です。ブレークモードで開いておけば、ステップ実行で1行進むたびに、各変数の値が自動で更新されます。「どの変数がいつ変わったか」を俯瞰するのにうってつけです。</p>



<p class="wp-block-paragraph">別のプロシージャに処理が移ると、表示内容も自動でそのプロシージャの変数に切り替わります。配列やオブジェクト変数は左の「+」を展開すると、中身を階層で確認できます。</p>



<p class="wp-block-paragraph">「とりあえず変数の状況を把握したい」ときは、まずローカルウィンドウを開く。これが基本の動きになります。より詳しい使い方は<a href="https://mashukabu.com/excel-vbe-local-window-explanation/">ローカルウィンドウの解説記事</a>にまとめているので、あわせて読んでみてくださいね。</p>



<h3 class="wp-block-heading"><span id="toc17">ウォッチウィンドウ｜条件付き中断で特定変数を監視</span></h3>



<p class="wp-block-paragraph">ウォッチウィンドウは、「特定の変数や式」を狙い撃ちで監視するためのウィンドウです。ローカルウィンドウが全部を見せるのに対し、こちらは見たいものだけを登録して追えます。</p>



<p class="wp-block-paragraph">式を登録するには、コードウィンドウで式を選択してウォッチウィンドウにドラッグするか、メニューの「デバッグ」→「ウォッチ式の追加」ダイアログを使います。登録した式は、ブレークモードに入るたびに最新の値へ更新されます。</p>



<p class="wp-block-paragraph">ウォッチウィンドウの強力なところは、「ウォッチの種類」を3つから選べる点です。</p>



<ol class="wp-block-list"><li><strong>ウォッチ式</strong>: 値を表示するだけのタイプです。指定した変数や式の現在値を見たいときに使います。</li><li><strong>値がTrueのときに中断</strong>: 式の結果がTrue（またはゼロ以外）になった瞬間に、自動でブレークモードに入ります。たとえば <code>i > 100</code> を登録すれば、iが100を超えた瞬間に止まります（文字列の式には指定できません）。</li><li><strong>値が変化したときに中断</strong>: 監視している式の値が変わった瞬間に止まります。「この変数が書き換わるのはどこだ」を探すのに最適です。</li></ol>



<p class="wp-block-paragraph">論理エラーで「特定の値になった瞬間を捕まえたい」ときは、この条件付き中断が圧倒的に速いです。1行ずつF8で追わなくても、条件が成立した瞬間だけVBAが止めてくれます。</p>



<p class="wp-block-paragraph">1つ注意点があります。ウォッチ式の監視範囲（コンテキスト）には「すべてのプロシージャ」「すべてのモジュール」も選べます。ただし範囲を広げると、全ステートメントの後で式が評価されるため、実行速度が大きく落ちます。なるべく特定のプロシージャを指定するのがコツです。3種類のウォッチの詳しい使い分けは<a href="https://mashukabu.com/excel-vbe-watch-window-explanation/">ウォッチウィンドウの解説記事</a>で掘り下げているので、条件付き中断を本格的に使いたい方は読んでみてくださいね。</p>



<h3 class="wp-block-heading"><span id="toc18">イミディエイトウィンドウ｜Debug.Printでその場確認</span></h3>



<p class="wp-block-paragraph">イミディエイトウィンドウは、その場でコードや式を実行したり、値を出力したりできる対話型のウィンドウです。「表示」→「イミディエイトウィンドウ」で開きます。</p>



<p class="wp-block-paragraph">使い方の中心は <code>Debug.Print</code> です。コードの中にこの命令を書いておくと、指定した内容がイミディエイトウィンドウに出力されます。<code>MsgBox</code> と違ってダイアログが出ないので、ループ内で何度呼んでも実行が止まりません。</p>



<pre class="wp-block-code"><code>Sub DebugPrintの例()
    Dim i As Long
    Dim 合計 As Long

    For i = 1 To 5
        合計 = 合計 + i
        Debug.Print &quot;i=&quot; &amp; i &amp; &quot; / 合計=&quot; &amp; 合計  'イミディエイトウィンドウに出力
    Next i
End Sub</code></pre>



<p class="wp-block-paragraph">このコードを実行すると、イミディエイトウィンドウに5行分のログが並びます。ループの各回でどう値が変化したかを、後からまとめて読み返せるのが利点です。MsgBoxのように毎回OKを押す必要もありません。</p>



<p class="wp-block-paragraph">さらに、ブレークモードで止まっているときは、ウィンドウに直接 <code>? 変数名</code> と打ち込めば、その変数の現在値をその場で表示できます。<code>Debug</code> オブジェクトにはもう1つ <code>Debug.Assert</code> があり、条件式がFalseのときだけ自動でブレークさせる、という使い方もできます。</p>



<p class="wp-block-paragraph">ログを残して後から追うならイミディエイトウィンドウ、というのが基本の役割です。<code>Debug.Print</code> の活用法は<a href="https://mashukabu.com/excel-vbe-immediate-window-explanation/">イミディエイトウィンドウの解説記事</a>でさらに詳しく紹介していますよ。</p>



<h2 class="wp-block-heading"><span id="toc19">デバッグツール使い分け早見表</span></h2>



<p class="wp-block-paragraph">ここまで紹介してきたツールを、1つの表にまとめました。「いつ使う」「何がわかる」「ショートカット」の3つの軸で並べています。迷ったときの早見表として使ってくださいね。</p>



<figure class="wp-block-table"><table><thead><tr><th>ツール</th><th>いつ使う</th><th>何がわかる／何ができる</th><th>ショートカット</th></tr></thead><tbody><tr><td>ブレークポイント</td><td>怪しい場所で実行を止めたいとき</td><td>指定行で停止し、その時点の状態を確認できる</td><td>F9（設定/解除）</td></tr><tr><td>ブレークポイント全解除</td><td>設定が散らかったとき</td><td>すべての停止点をまとめて消せる</td><td>Ctrl+Shift+F9</td></tr><tr><td>ステップイン</td><td>1行ずつ細かく追いたいとき</td><td>呼び出し先の中にも入って実行する</td><td>F8</td></tr><tr><td>ステップオーバー</td><td>呼び出し先を信頼して飛ばすとき</td><td>サブプロシージャを1単位として実行</td><td>Shift+F8</td></tr><tr><td>ステップアウト</td><td>入った関数から早く抜けたいとき</td><td>今の関数を一気に終え呼び出し元へ戻る</td><td>Ctrl+Shift+F8</td></tr><tr><td>カーソル行まで実行</td><td>途中まで一気に進めたいとき</td><td>カーソル位置まで実行して停止</td><td>Ctrl+F8</td></tr><tr><td>実行/継続</td><td>ブレークモードから再開するとき</td><td>次の停止点または最後まで実行</td><td>F5</td></tr><tr><td>手動中断</td><td>無限ループを止めたいとき</td><td>実行中のマクロをブレークモードへ</td><td>Ctrl+Break</td></tr><tr><td>ローカルウィンドウ</td><td>全変数をまとめて見たいとき</td><td>現在のプロシージャの全変数と値を一覧</td><td>（表示メニュー）</td></tr><tr><td>ウォッチウィンドウ</td><td>特定の変数を監視・条件で止めたいとき</td><td>指定式の値表示と条件付き自動中断</td><td>（表示メニュー）</td></tr><tr><td>イミディエイトウィンドウ</td><td>ログ出力・その場で値を確認したいとき</td><td>Debug.Printの出力と式の即時実行</td><td>（表示メニュー）</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">ざっくりした覚え方としては、止めるのがブレークポイントとCtrl+Break、進めるのがF8系とF5、見るのが3つのウィンドウ、という3グループです。この3つの役割で頭の中を整理しておくと、実際の調査でも手が動きやすくなりますよ。</p>



<h2 class="wp-block-heading"><span id="toc20">実践シナリオ｜論理エラーを追う手順（合計行スキップ問題）</span></h2>



<p class="wp-block-paragraph">ここからは、実際の論理エラーをデバッグツールで追ってみましょう。題材は実務でも頻出する「合計が合わない」問題です。A1からA10に数値が入っていて、その合計を求めるマクロを想定します。</p>



<pre class="wp-block-code"><code>Sub 合計を計算する()
    Dim i As Long
    Dim 合計 As Long
    合計 = 0

    For i = 2 To 10           ' ←本当は 1 To 10 にすべきところを 2 から始めてしまった
        合計 = 合計 + Cells(i, 1).Value
    Next i

    Range(&quot;C1&quot;).Value = 合計
End Sub</code></pre>



<p class="wp-block-paragraph">このマクロ、エラーは一切出ません。ところが、A1の値が合計に含まれず、結果が1行分だけ少なくなります。ぱっと見ではコードも自然なので、原因に気づきにくい典型的な論理エラーです。これをデバッグツールで追っていきます。</p>



<h3 class="wp-block-heading"><span id="toc21">Step1：ブレークポイントでループ前に止める</span></h3>



<p class="wp-block-paragraph">まず、ループが始まる手前に止めます。<code>合計 = 0</code> の行か、<code>For</code> の行にカーソルを置いて <code>F9</code> を押し、ブレークポイントを設定します。</p>



<p class="wp-block-paragraph">ブレークポイントを置いたら、<code>F5</code> でマクロを実行します。すると、設定した行の直前で処理が止まり、ブレークモードに入ります。これでループに入る前の状態を、落ち着いて観察できる準備が整いました。</p>



<p class="wp-block-paragraph">論理エラーは「処理が進むにつれて値がずれていく」ことが多いので、ずれる前のスタート地点から見るのが鉄則です。いきなり結果を見ても原因はわからないので、手前で止めるところから始めてくださいね。</p>



<h3 class="wp-block-heading"><span id="toc22">Step2：F8ステップ実行で処理を1行ずつ追う</span></h3>



<p class="wp-block-paragraph">止まったら、<code>F8</code>（ステップイン）に切り替えて1行ずつ進めます。<code>For i = 2 To 10</code> の行を実行した瞬間に、変数 <code>i</code> に初期値が入ります。ここが今回の調査の山場です。</p>



<p class="wp-block-paragraph">F8でループの中に入ると、<code>合計 = 合計 + Cells(i, 1).Value</code> が実行されます。ここで <code>Cells(i, 1)</code> がどのセルを指しているかを意識しながら進めます。1回目のループで参照しているのはA1なのか、それともA2なのか。これを次のステップで確認します。</p>



<p class="wp-block-paragraph">ステップ実行のいいところは、頭の中の「こう動くはず」と、実際の動きを照らし合わせられる点です。思い込みと現実のズレが見えた瞬間が、バグ発見の瞬間ですよ。</p>



<h3 class="wp-block-heading"><span id="toc23">Step3：ローカルウィンドウでカウンタ変数を確認</span></h3>



<p class="wp-block-paragraph">ステップ実行と並行して、ローカルウィンドウを開いておきます。「表示」→「ローカルウィンドウ」で表示できます。ここに変数 <code>i</code> と <code>合計</code> の現在値が出ています。</p>



<p class="wp-block-paragraph"><code>For</code> の行を実行した直後にローカルウィンドウを見ると、<code>i</code> の値が <code>2</code> になっているはずです。ここで「あれ、1回目なのに i が 2 から始まっている」と気づけます。本来1行目（A1）から足したいのに、ループが2行目から始まっているわけです。</p>



<p class="wp-block-paragraph">さらにF8を進めて、<code>合計</code> がどう増えていくかも追えます。最終的に合計がA2からA10までの和になっており、A1の分だけ足りていないことが確認できます。これで「ループの開始位置が原因だ」とはっきりしました。</p>



<p class="wp-block-paragraph">変数の一覧をリアルタイムで見られるのがローカルウィンドウの強みです。<code>i</code> が想定と違う値だったこの瞬間こそ、デバッグの当たりですよ。</p>



<h3 class="wp-block-heading"><span id="toc24">Step4：問題箇所の特定と修正</span></h3>



<p class="wp-block-paragraph">原因が特定できたら、修正は簡単です。ループの開始値を <code>2</code> から <code>1</code> に直すだけです。</p>



<pre class="wp-block-code"><code>Sub 合計を計算する()
    Dim i As Long
    Dim 合計 As Long
    合計 = 0

    For i = 1 To 10           ' 開始値を 1 に修正してA1から合計する
        合計 = 合計 + Cells(i, 1).Value
    Next i

    Range(&quot;C1&quot;).Value = 合計
End Sub</code></pre>



<p class="wp-block-paragraph">修正したら、ブレークポイントを <code>F9</code> で解除（または <code>Ctrl + Shift + F9</code> で全解除）して、もう一度実行します。今度はA1からA10まで正しく合計され、結果が合うはずです。</p>



<p class="wp-block-paragraph">この一連の流れ、ポイントは「ブレークポイントで止める→F8で追う→ローカルウィンドウで変数を見る」の3点セットです。論理エラーは原因が見えにくいですが、この手順なら確実に「おかしくなる瞬間」を捕まえられます。最初は時間がかかっても、慣れれば数分で終わるようになりますよ。</p>



<p class="wp-block-paragraph">なお、今回はループの開始位置という単純なミスでしたが、もっと複雑なケースで「特定の値になった瞬間に止めたい」ときは、Step2のF8連打の代わりにウォッチウィンドウの条件付き中断を使うと一気に楽になります。あわせて覚えておいてくださいね。</p>



<h2 class="wp-block-heading"><span id="toc25">まとめ｜デバッグを習慣にして「動かない」を素早く解決しよう</span></h2>



<p class="wp-block-paragraph">VBAのデバッグツールについて、ブレークポイントとステップ実行を軸に、3つのウィンドウの使い分けまで解説してきました。最後に要点を振り返っておきます。</p>



<ul class="wp-block-list"><li><strong>症状でアプローチが決まる</strong>: エラーで止まるなら止まった場所を見る、結果がおかしいならブレークポイントで自分から止めて追う。</li><li><strong>止める・進める・見るの3グループ</strong>: 止めるのがブレークポイント（F9）とCtrl+Break、進めるのがF8系とF5、見るのが3ウィンドウ。</li><li><strong>論理エラーは3点セットで追う</strong>: ブレークポイントで止め、F8で1行ずつ進め、ローカルウィンドウで変数を確認する。</li></ul>



<p class="wp-block-paragraph">このやり方が身につけば、これまで <code>MsgBox</code> を仕込んで消してを繰り返していた時間が、まるごと節約できます。「動かない」に出くわしたとき、慌てずに原因を特定できるようになりますよ。</p>



<h3 class="wp-block-heading"><span id="toc26">各ツールの詳細は専門記事へ</span></h3>



<p class="wp-block-paragraph">この記事は、デバッグツール全体の地図のような位置づけです。それぞれのツールには、ここで触れきれなかった便利な機能がまだあります。深く使いこなしたいときは、次の専門記事も読んでみてくださいね。</p>



<ul class="wp-block-list"><li><a href="https://mashukabu.com/excel-vbe-local-window-explanation/">VBAローカルウィンドウの使い方</a>: 全変数を一覧で確認する基本ツールの詳細</li><li><a href="https://mashukabu.com/excel-vbe-watch-window-explanation/">VBAウォッチウィンドウの使い方</a>: 3種類のウォッチと条件付き中断を深掘り</li><li><a href="https://mashukabu.com/excel-vbe-immediate-window-explanation/">VBAイミディエイトウィンドウの使い方</a>: Debug.Printを使ったログ出力デバッグ</li><li><a href="https://mashukabu.com/excel-vba-vbe-menu-explanation/">VBEの画面の見方を図解で解説</a>: 各ウィンドウの位置と役割の基礎</li></ul>



<p class="wp-block-paragraph">また、実行時エラーで止まったときは<a href="https://mashukabu.com/vba-error-guide/">VBAマクロのエラー解決ガイド</a>でエラー番号別の直し方を確認できます。そもそもエラーで止まらないようにコードを設計したい場合は、<a href="https://mashukabu.com/vba-error-handling-complete-guide/">VBAのエラーハンドリング完全ガイド</a>で <code>On Error</code> 構文の使い分けを学べますよ。</p>



<p class="wp-block-paragraph">デバッグは、最初こそ面倒に感じるかもしれません。ですが一度フローが身につくと、「動かない」が「すぐ直せる」に変わります。今日紹介した手順を、次にマクロが動かなかったときにぜひ試してみてくださいね。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/excel-vba-debug-breakpoint-step-execution/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>VBAマクロのエラー解決ガイド｜実行時エラー13・1004・9など頻出エラー別の直し方</title>
		<link>https://mashukabu.com/vba-error-guide/</link>
					<comments>https://mashukabu.com/vba-error-guide/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Mon, 13 Apr 2026 12:42:37 +0000</pubDate>
				<category><![CDATA[VBA・マクロ]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[エラー]]></category>
		<category><![CDATA[デバッグ]]></category>
		<category><![CDATA[トラブルシューティング]]></category>
		<category><![CDATA[マクロ]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=5981</guid>

					<description><![CDATA[VBAマクロで頻出する実行時エラー（13・1004・9・91・438など）を番号別に解説。原因・発生パターン・修正コードをセットで紹介し、On Error構文やデバッグ手順までまとめました。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">VBAでマクロを書いていると、いきなり赤い画面で「実行時エラー」と表示されて慌てた経験、誰にでもあると思います。しかも番号だけ出て意味がわからない、英語で説明されても何を直せばいいか見当がつかない、というケースが多いですよね。</p>



<p class="wp-block-paragraph">この記事では、VBAマクロで特に頻出する実行時エラーを <strong>番号ごとに原因・発生パターン・修正コード</strong> の3点セットで整理しました。併せて、エラーが出たときの定番の調べ方（ステップ実行・イミディエイトウィンドウ）や、<code>On Error</code> 構文を使ったエラーハンドリングの基本もまとめています。</p>



<p class="wp-block-paragraph">エラー番号で検索してたどり着いた方は、目次から該当箇所にジャンプしてください。「とりあえず一通り押さえたい」という方は、最初から順に読んでいただくとVBAの例外対処の勘所がつかめる内容になっています。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">VBAの実行時エラーとは｜まずは全体像を押さえる</a></li><li><a href="#toc2" tabindex="0">実行時エラー 13｜型の不一致（Type mismatch）</a><ol><li><a href="#toc3" tabindex="0">原因と典型パターン</a></li><li><a href="#toc4" tabindex="0">直し方</a></li></ol></li><li><a href="#toc5" tabindex="0">実行時エラー 1004｜アプリケーション定義またはオブジェクト定義のエラー</a><ol><li><a href="#toc6" tabindex="0">典型パターン 1: シート名が間違っている</a></li><li><a href="#toc7" tabindex="0">典型パターン 2: Range の引数が不正</a></li><li><a href="#toc8" tabindex="0">典型パターン 3: 保護されたシートに書き込み</a></li><li><a href="#toc9" tabindex="0">典型パターン 4: Cells の引数が範囲外</a></li></ol></li><li><a href="#toc10" tabindex="0">実行時エラー 9｜インデックスが有効範囲にありません</a><ol><li><a href="#toc11" tabindex="0">典型パターン</a></li><li><a href="#toc12" tabindex="0">直し方</a></li></ol></li><li><a href="#toc13" tabindex="0">実行時エラー 91｜オブジェクト変数または With ブロック変数が設定されていません</a><ol><li><a href="#toc14" tabindex="0">典型パターン</a></li><li><a href="#toc15" tabindex="0">直し方</a></li></ol></li><li><a href="#toc16" tabindex="0">実行時エラー 438｜オブジェクトはこのプロパティまたはメソッドをサポートしていません</a><ol><li><a href="#toc17" tabindex="0">典型パターン</a></li><li><a href="#toc18" tabindex="0">直し方</a></li></ol></li><li><a href="#toc19" tabindex="0">実行時エラー 424｜オブジェクトが必要です</a></li><li><a href="#toc20" tabindex="0">実行時エラー 6｜オーバーフロー</a></li><li><a href="#toc21" tabindex="0">エラーが出たときのデバッグ手順</a><ol><li><a href="#toc22" tabindex="0">1. ステップ実行（F8キー）</a></li><li><a href="#toc23" tabindex="0">2. イミディエイトウィンドウ（Ctrl + G）</a></li><li><a href="#toc24" tabindex="0">3. ブレークポイント（F9キー）</a></li></ol></li><li><a href="#toc25" tabindex="0">On Error 構文によるエラーハンドリング</a><ol><li><a href="#toc26" tabindex="0">On Error GoTo ラベル</a></li><li><a href="#toc27" tabindex="0">On Error Resume Next</a></li></ol></li><li><a href="#toc28" tabindex="0">エラーを減らすための予防策</a></li><li><a href="#toc29" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">VBAの実行時エラーとは｜まずは全体像を押さえる</span></h2>



<p class="wp-block-paragraph">VBAのエラーは大きく3種類あります。</p>



<ol class="wp-block-list"><li><strong>コンパイルエラー</strong>: マクロを実行する前、VBEが構文を解析した時点で出るエラー。「構文エラー」「変数が定義されていません」など。</li><li><strong>実行時エラー</strong>: マクロを実行した途中で発生するエラー。この記事で主に扱う「実行時エラー 13」などがこれです。</li><li><strong>論理エラー</strong>: エラーメッセージは出ないが結果が想定と違うバグ。</li></ol>



<p class="wp-block-paragraph">実行時エラーが厄介なのは、「コードの書き方」ではなく「実行時のデータ・環境」によって発生するため、書いたときには気づけないという点です。たとえば、開発中は問題なくても、他の人がシートを編集した瞬間に壊れることがあります。</p>



<p class="wp-block-paragraph">実行時エラーが出たときは、<strong>黄色くハイライトされた行</strong> が原因箇所です。「デバッグ」ボタンを押すとその行で一時停止するので、まずはその行で何が起きているかを確認するのが第一歩になります。</p>



<h2 class="wp-block-heading"><span id="toc2">実行時エラー 13｜型の不一致（Type mismatch）</span></h2>



<p class="wp-block-paragraph">VBAで最も頻繁に目にするエラーが、この「型の不一致」です。ある型を期待している場所に別の型の値を渡そうとしたときに発生します。</p>



<h3 class="wp-block-heading"><span id="toc3">原因と典型パターン</span></h3>



<pre class="wp-block-code"><code>Dim i As Long
i = Range(&quot;A1&quot;).Value  ' A1に &quot;りんご&quot; と入っているとエラー13</code></pre>



<p class="wp-block-paragraph">数値型の変数に文字列を入れようとした、というのがもっとも典型的なパターンです。他にも次のような状況で発生します。</p>



<ul class="wp-block-list"><li>セルにエラー値（<code>#N/A</code>、<code>#VALUE!</code> など）が入っている状態で、そのセルを数値変数に代入した</li><li><code>CInt</code> / <code>CLng</code> / <code>CDbl</code> に変換不可能な文字列を渡した（例: <code>CInt("abc")</code>）</li><li>配列が必要な場所にスカラー値を渡した</li></ul>



<h3 class="wp-block-heading"><span id="toc4">直し方</span></h3>



<p class="wp-block-paragraph">セルの値を数値として扱いたい場合は、事前に <strong>IsNumeric で検査</strong> してから代入するのが定石です。</p>



<pre class="wp-block-code"><code>Dim v As Variant
v = Range(&quot;A1&quot;).Value
If IsNumeric(v) Then
    Dim i As Long
    i = CLng(v)
Else
    MsgBox &quot;A1が数値ではありません: &quot; &amp; v
End If</code></pre>



<p class="wp-block-paragraph">また、エラー値が混ざる可能性があるセルは <code>IsError</code> で事前チェックしましょう。</p>



<pre class="wp-block-code"><code>If Not IsError(Range(&quot;A1&quot;).Value) Then
    i = Range(&quot;A1&quot;).Value
End If</code></pre>



<p class="wp-block-paragraph">ポイントは、<strong>Variantでいったん受けてから判定 → 変換</strong> という流れです。直接 Long 型に代入しようとすると、そこで処理が止まってしまいます。</p>



<h2 class="wp-block-heading"><span id="toc5">実行時エラー 1004｜アプリケーション定義またはオブジェクト定義のエラー</span></h2>



<p class="wp-block-paragraph">エラー1004は「Excelに何かを頼んだけど、その頼み方が正しくない」ときに出ます。メッセージが曖昧なので原因の特定が難しい、VBAでもトップクラスに悩まされるエラーです。</p>



<h3 class="wp-block-heading"><span id="toc6">典型パターン 1: シート名が間違っている</span></h3>



<pre class="wp-block-code"><code>Worksheets(&quot;売上&quot;).Range(&quot;A1&quot;).Value = 100  ' &quot;売上&quot;シートが存在しないとエラー1004</code></pre>



<p class="wp-block-paragraph">シートをリネームしたのにコード側を直し忘れた、というよくあるパターンです。<code>Worksheets("名前")</code> は該当シートがないと即座に1004になります。</p>



<p class="wp-block-paragraph"><strong>直し方</strong>: シート存在チェックを関数化しておくと安全です。</p>



<pre class="wp-block-code"><code>Function SheetExists(name As String) As Boolean
    Dim ws As Worksheet
    On Error Resume Next
    Set ws = ThisWorkbook.Worksheets(name)
    On Error GoTo 0
    SheetExists = Not ws Is Nothing
End Function</code></pre>



<h3 class="wp-block-heading"><span id="toc7">典型パターン 2: Range の引数が不正</span></h3>



<pre class="wp-block-code"><code>Range(&quot;A1:Z0&quot;).Select  ' 行番号 0 は存在しない → 1004
Range(&quot;&quot;).Value = 1    ' 空文字 → 1004</code></pre>



<p class="wp-block-paragraph"><code>Range</code> に渡す文字列が不正（存在しないアドレス・空文字）だと1004になります。変数から動的に組み立てた文字列を <code>Range</code> に渡す場合は要注意です。</p>



<h3 class="wp-block-heading"><span id="toc8">典型パターン 3: 保護されたシートに書き込み</span></h3>



<pre class="wp-block-code"><code>ActiveSheet.Range(&quot;A1&quot;).Value = 100  ' シートが保護されているとエラー1004</code></pre>



<p class="wp-block-paragraph"><strong>直し方</strong>: 保護を一時的に解除してから書き込み、終わったら戻します。</p>



<pre class="wp-block-code"><code>ActiveSheet.Unprotect
ActiveSheet.Range(&quot;A1&quot;).Value = 100
ActiveSheet.Protect</code></pre>



<h3 class="wp-block-heading"><span id="toc9">典型パターン 4: Cells の引数が範囲外</span></h3>



<pre class="wp-block-code"><code>Cells(1048577, 1).Value = 1  ' Excel 2007以降でも行の上限は 1048576</code></pre>



<p class="wp-block-paragraph">Excelの行列の上限を超えた値を <code>Cells</code> や <code>Range</code> に渡すと1004です。ループで <code>i</code> を増やしていく処理でありがちなミスです。</p>



<h2 class="wp-block-heading"><span id="toc10">実行時エラー 9｜インデックスが有効範囲にありません</span></h2>



<p class="wp-block-paragraph">配列やコレクションの範囲外にアクセスしたときに出るエラーです。</p>



<h3 class="wp-block-heading"><span id="toc11">典型パターン</span></h3>



<pre class="wp-block-code"><code>Dim arr(1 To 3) As String
arr(4) = &quot;aaa&quot;  ' エラー9

Workbooks(&quot;存在しないブック.xlsx&quot;).Activate  ' エラー9
Worksheets(5).Select  ' シートが4枚しかなければエラー9</code></pre>



<p class="wp-block-paragraph">配列の添字、ブック名、シート名・シート番号の指定ミスで発生します。1004 と混同しがちですが、「<strong>コレクションに対するアクセス</strong>」がキーワードです。</p>



<h3 class="wp-block-heading"><span id="toc12">直し方</span></h3>



<p class="wp-block-paragraph"><strong>配列の場合</strong> は <code>LBound</code> と <code>UBound</code> で範囲を確認します。</p>



<pre class="wp-block-code"><code>Dim i As Long
For i = LBound(arr) To UBound(arr)
    Debug.Print arr(i)
Next i</code></pre>



<p class="wp-block-paragraph"><strong>ブック・シートの場合</strong> は名前で存在チェックしてからアクセスします。先ほどの <code>SheetExists</code> 関数のように、<code>On Error Resume Next</code> で一時的にエラーを抑制して判定する方法が定番です。</p>



<p class="wp-block-paragraph">動的配列で <code>ReDim</code> を忘れた場合もエラー9になります。<code>ReDim Preserve arr(1 To n)</code> を先に実行してから添字に代入しましょう。</p>



<h2 class="wp-block-heading"><span id="toc13">実行時エラー 91｜オブジェクト変数または With ブロック変数が設定されていません</span></h2>



<p class="wp-block-paragraph">「Nothing が入っているオブジェクト変数を使おうとした」というエラーです。<code>Set</code> を書き忘れたときに出ます。</p>



<h3 class="wp-block-heading"><span id="toc14">典型パターン</span></h3>



<pre class="wp-block-code"><code>Dim ws As Worksheet
ws.Range(&quot;A1&quot;).Value = 1  ' Set していない → エラー91

Dim r As Range
Set r = Range(&quot;A:A&quot;).Find(&quot;検索語&quot;)
MsgBox r.Address  ' Find で見つからないと Nothing → エラー91</code></pre>



<p class="wp-block-paragraph">特に <strong>Find メソッドは「見つからないとき Nothing を返す」</strong> ので、そのまま <code>r.Address</code> などにアクセスすると91になります。Findは実務で多用するので、ここは鉄則として覚えておきましょう。</p>



<h3 class="wp-block-heading"><span id="toc15">直し方</span></h3>



<p class="wp-block-paragraph">Set が必要なオブジェクト（<code>Worksheet</code>、<code>Range</code>、<code>Workbook</code> など）は、<strong>必ず Set で代入してから使う</strong>。Find などの結果は <strong>Nothing 判定を挟む</strong>。</p>



<pre class="wp-block-code"><code>Dim r As Range
Set r = Range(&quot;A:A&quot;).Find(&quot;検索語&quot;)
If r Is Nothing Then
    MsgBox &quot;見つかりませんでした&quot;
    Exit Sub
End If
MsgBox r.Address</code></pre>



<p class="wp-block-paragraph"><code>Is Nothing</code> は VBA における null チェックの作法です。Findと組み合わせて使う流れは必ず身につけてください。</p>



<h2 class="wp-block-heading"><span id="toc16">実行時エラー 438｜オブジェクトはこのプロパティまたはメソッドをサポートしていません</span></h2>



<p class="wp-block-paragraph">そのオブジェクトに存在しないプロパティやメソッドを呼び出したときのエラーです。</p>



<h3 class="wp-block-heading"><span id="toc17">典型パターン</span></h3>



<pre class="wp-block-code"><code>Dim ws As Worksheet
Set ws = ActiveSheet
ws.Rows.Count  ' OK
ws.Count       ' Worksheet に Count プロパティはない → エラー438</code></pre>



<p class="wp-block-paragraph">よくあるのは、<strong>変数の型を間違えている</strong> ケースです。「<code>Range</code> と思って書いていたけど実際は <code>Worksheet</code> だった」など、オブジェクト型の取り違えで発生します。</p>



<h3 class="wp-block-heading"><span id="toc18">直し方</span></h3>



<p class="wp-block-paragraph">まずは <code>Dim</code> で型をきちんと宣言すること。<code>Variant</code> や <code>Object</code> 型で受けてしまうと、VBEの入力補完が効かず、存在しないメソッドを気づかずに書けてしまいます。</p>



<pre class="wp-block-code"><code>Dim ws As Worksheet   ' OK: 入力補完が効く
Dim obj As Object     ' NG: 何でも書けてしまう</code></pre>



<p class="wp-block-paragraph">また <code>.</code> を打ったときに候補が出ないメンバは存在しないので、<strong>入力補完に頼る</strong> のも有効な予防策です。</p>



<h2 class="wp-block-heading"><span id="toc19">実行時エラー 424｜オブジェクトが必要です</span></h2>



<p class="wp-block-paragraph">オブジェクトを要求する場所に、オブジェクトではない値を渡したときのエラーです。</p>



<pre class="wp-block-code"><code>Dim ws As Worksheet
ws = Worksheets(&quot;Sheet1&quot;)      ' Set を忘れた → エラー424
Set ws = Worksheets(&quot;Sheet1&quot;)  ' 正解</code></pre>



<p class="wp-block-paragraph"><code>Set</code> キーワードを忘れたパターンがほぼ全てです。オブジェクト変数への代入には必ず <code>Set</code> を付ける、というルールを徹底しましょう。VBAは他言語にない独特な作法なので、初学者ほどハマりやすいポイントです。</p>



<h2 class="wp-block-heading"><span id="toc20">実行時エラー 6｜オーバーフロー</span></h2>



<p class="wp-block-paragraph">変数の型の最大値を超えたときに発生します。</p>



<pre class="wp-block-code"><code>Dim i As Integer
i = 40000  ' Integer の上限は 32767 → エラー6</code></pre>



<p class="wp-block-paragraph">Integer（-32768〜32767）の上限を超えると即座にオーバーフローします。行数をカウンタにするなど、<strong>大きな値が入る可能性のある変数は必ず <code>Long</code> 型</strong> にしましょう。</p>



<pre class="wp-block-code"><code>Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row</code></pre>



<p class="wp-block-paragraph">VBAでは Integer を使うメリットはほぼないため、整数は基本 Long と覚えてしまって構いません。</p>



<h2 class="wp-block-heading"><span id="toc21">エラーが出たときのデバッグ手順</span></h2>



<p class="wp-block-paragraph">エラー番号を検索しても原因がわからないときは、次の手順で調査します。</p>



<h3 class="wp-block-heading"><span id="toc22">1. ステップ実行（F8キー）</span></h3>



<p class="wp-block-paragraph">VBEで調査したいプロシージャの先頭にカーソルを置き、<code>F8</code> キーを押すと <strong>1行ずつ実行</strong> できます。1行進めるたびに変数の中身を確認できるので、「どの行でおかしくなったか」を特定できます。</p>



<h3 class="wp-block-heading"><span id="toc23">2. イミディエイトウィンドウ（Ctrl + G）</span></h3>



<p class="wp-block-paragraph">イミディエイトウィンドウは、VBEで <code>Ctrl + G</code> を押すと開く対話的な実行窓です。ここに次のように打ち込むと、その場で値を確認できます。</p>



<pre class="wp-block-code"><code>? Range(&quot;A1&quot;).Value
? TypeName(Range(&quot;A1&quot;).Value)
? ActiveSheet.Name</code></pre>



<p class="wp-block-paragraph"><code>TypeName</code> は変数やセルの値の型を調べられる関数で、エラー13（型の不一致）のデバッグに絶大な効果を発揮します。</p>



<p class="wp-block-paragraph">コードの途中に <code>Debug.Print</code> を仕込むのも定番です。</p>



<pre class="wp-block-code"><code>Debug.Print &quot;i=&quot; &amp; i, &quot;値=&quot; &amp; arr(i)</code></pre>



<h3 class="wp-block-heading"><span id="toc24">3. ブレークポイント（F9キー）</span></h3>



<p class="wp-block-paragraph">気になる行を選択して <code>F9</code> を押すと、その行に赤い丸（ブレークポイント）が付きます。実行するとその行で自動的に一時停止するので、ステップ実行と組み合わせて原因箇所を絞り込めます。</p>



<p class="wp-block-paragraph">ステップ実行・イミディエイト・ブレークポイントの3つを使いこなせると、VBAのデバッグ効率は劇的に上がります。VBEの使い方を体系的に押さえたい方は <a href="https://mashukabu.com/excel-vba-vbe-menu-explanation/">Excel VBAのVBE（Visual Basic Editor）のメニュー解説</a> も併せてご覧ください。</p>



<h2 class="wp-block-heading"><span id="toc25">On Error 構文によるエラーハンドリング</span></h2>



<p class="wp-block-paragraph">想定外のエラーでマクロが止まるのを防ぐには、<code>On Error</code> 構文でハンドリングを書きます。</p>



<h3 class="wp-block-heading"><span id="toc26">On Error GoTo ラベル</span></h3>



<p class="wp-block-paragraph">エラー発生時に指定したラベルへジャンプする、もっとも基本的な形です。</p>



<pre class="wp-block-code"><code>Sub Sample()
    On Error GoTo ErrHandler

    ' 本体処理
    Range(&quot;A1&quot;).Value = 1 / 0

    Exit Sub  ' ← エラーなく終わったらここで抜ける（重要）

ErrHandler:
    MsgBox &quot;エラー番号: &quot; &amp; Err.Number &amp; vbCrLf &amp; _
           &quot;内容: &quot; &amp; Err.Description
End Sub</code></pre>



<p class="wp-block-paragraph">ポイントは、<strong>エラーがなく正常終了した場合にラベルの下に処理が流れ込まないよう <code>Exit Sub</code> を置く</strong> ことです。これを忘れると、正常終了時にもエラーメッセージが表示されてしまいます。</p>



<p class="wp-block-paragraph"><code>Err.Number</code> でエラー番号、<code>Err.Description</code> でメッセージを取得できるので、ログ出力やユーザー向けメッセージに活用しましょう。</p>



<h3 class="wp-block-heading"><span id="toc27">On Error Resume Next</span></h3>



<p class="wp-block-paragraph">エラーが起きても止めずに次の行へ進む、というモードです。前述のシート存在チェックのように、「エラーが出ること自体を期待している」局面で使います。</p>



<pre class="wp-block-code"><code>On Error Resume Next
Set ws = ThisWorkbook.Worksheets(&quot;売上&quot;)
On Error GoTo 0  ' エラー抑制を解除

If ws Is Nothing Then
    MsgBox &quot;売上シートがありません&quot;
End If</code></pre>



<p class="wp-block-paragraph"><strong>使い終わったら必ず <code>On Error GoTo 0</code> で解除</strong> してください。付けっぱなしにすると、本来気づくべきエラーまで無視されてしまい、バグの発見が遅れます。</p>



<p class="wp-block-paragraph"><code>On Error Resume Next</code> は強力な一方で、<strong>乱用するとエラーが全部握りつぶされる危険な構文</strong> でもあります。「ここで発生するエラーは想定内だ」と言い切れる狭い範囲に限定して使いましょう。</p>



<h2 class="wp-block-heading"><span id="toc28">エラーを減らすための予防策</span></h2>



<p class="wp-block-paragraph">そもそもエラーを出さないコードを書く、というのが最も効率的な対策です。VBAで押さえておきたい基本作法をまとめておきます。</p>



<ul class="wp-block-list"><li><strong><code>Option Explicit</code> を必ず宣言する</strong>: 変数の宣言漏れを防ぎ、タイプミスをコンパイル時に検出できます。詳しくは <a href="https://mashukabu.com/excel-vba-option-explicit/">Excel VBA の Option Explicit とは</a> を参照してください。</li><li><strong>適切な型で宣言する</strong>: <code>Variant</code> や <code>Object</code> の乱用を避け、<code>Long</code> / <code>String</code> / <code>Worksheet</code> など具体的な型を指定する。入力補完が効き、エラー438・424の予防になります。型の基本は <a href="https://mashukabu.com/excel-vba-variable-explanation/">Excel VBA の変数について</a> でまとめています。</li><li><strong>シート・ブックは名前ではなく変数で保持</strong>: <code>Worksheets("売上")</code> を何度も書かず、先頭で <code>Set ws = Worksheets("売上")</code> しておく。リネーム時の修正箇所も減ります。</li><li><strong>マジックナンバーを避ける</strong>: <code>Cells(Rows.Count, 1).End(xlUp).Row</code> のように、最終行を動的に取る。固定で <code>Range("A1:A1000")</code> と書くと、1000行を超えたときに破綻します。最終行取得の定石は <a href="https://mashukabu.com/excel-vba-howto-get-lastrow/">Excel VBAで最終行を取得する方法</a> を参照してください。</li><li><strong>Find の結果は必ず Nothing チェック</strong>: 前述の通りエラー91の温床です。</li></ul>



<p class="wp-block-paragraph">こうした基本を押さえたうえで、<code>On Error</code> で想定外だけ拾う、という二段構えが理想です。VBAマクロの基礎から学び直したい方は <a href="https://mashukabu.com/excel-vba-macro-beginners-guide/">Excel VBAマクロ入門ガイド</a> や <a href="https://mashukabu.com/excel-vba-automation-guide/">Excel VBA自動化ガイド</a> に体系的にまとめていますので、併せてどうぞ。</p>



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



<p class="wp-block-paragraph">VBAの実行時エラーは、番号ごとに原因のパターンがかなり決まっています。</p>



<ul class="wp-block-list"><li><strong>エラー13（型の不一致）</strong>: 数値変数に文字列やエラー値を入れていないか。<code>IsNumeric</code> / <code>IsError</code> で事前チェック。</li><li><strong>エラー1004</strong>: シート名・Range引数・シート保護・セル範囲超過のいずれか。シート存在チェック関数を用意しておく。</li><li><strong>エラー9（インデックス範囲外）</strong>: 配列・ブック・シートへのアクセスを確認。<code>LBound</code> / <code>UBound</code> や名前検査で防ぐ。</li><li><strong>エラー91（オブジェクト未設定）</strong>: <code>Set</code> の書き忘れ、Findの結果 Nothing。<code>Is Nothing</code> 判定を徹底。</li><li><strong>エラー438</strong>: 存在しないメソッド呼び出し。型を正しく宣言する。</li><li><strong>エラー424</strong>: <code>Set</code> 忘れ。</li><li><strong>エラー6（オーバーフロー）</strong>: Integer ではなく Long を使う。</li></ul>



<p class="wp-block-paragraph">そして、エラーが出たときは慌てずに <strong>ステップ実行 → イミディエイトで型を確認 → <code>Debug.Print</code> でログを仕込む</strong> という順番で追いかけましょう。ハンドリングが必要な場面では <code>On Error GoTo</code> と <code>On Error Resume Next</code> を適切に使い分け、<strong>使ったら必ず <code>On Error GoTo 0</code> で解除する</strong> ことも忘れずに。</p>



<p class="wp-block-paragraph">エラーと上手に付き合えるようになると、VBAの開発スピードは一段階上がります。この記事をブックマークしておいて、エラーが出たときに番号で逆引きしていただければ幸いです。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/vba-error-guide/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<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-5" checked><label class="toc-title" for="toc-checkbox-5">目次</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>
		<item>
		<title>VBAウォッチウィンドウの使い方｜3種類のウォッチで条件付きデバッグ</title>
		<link>https://mashukabu.com/excel-vbe-watch-window-explanation/</link>
					<comments>https://mashukabu.com/excel-vbe-watch-window-explanation/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Fri, 28 Jan 2022 13:17:05 +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>
		<category><![CDATA[条件付き中断]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=821</guid>

					<description><![CDATA[VBAウォッチウィンドウの使い方を初心者向けに解説。表示方法からウォッチ式の追加、3種類のウォッチ（式ウォッチ・Trueで中断・値変更で中断）、ローカルウィンドウとの違い、実務で役立つ活用テクニックまで紹介します。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">VBAでマクロを作っていて「この変数、いつ値が変わったんだろう？」と悩んだことはありませんか。</p>



<p class="wp-block-paragraph">Debug.Printで確認するのもいいけれど、ループが何百回もまわる処理では追いきれないですよね。ブレークポイントで止めても、毎回同じ場所で止まるだけで「特定の条件のときだけ見たい」には対応できません。</p>



<p class="wp-block-paragraph">そんなときに頼りになるのが<strong>ウォッチウィンドウ</strong>です。この記事では、ウォッチウィンドウの表示方法から3種類のウォッチの使い分け、実務で役立つテクニックまで解説します。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">VBAのウォッチウィンドウとは</a><ol><li><a href="#toc2" tabindex="0">デバッグウィンドウ3種の比較</a></li></ol></li><li><a href="#toc3" tabindex="0">VBEの起動とウォッチウィンドウの表示方法</a><ol><li><a href="#toc4" tabindex="0">VBE（Visual Basic Editor）の開き方</a></li><li><a href="#toc5" tabindex="0">ウォッチウィンドウの表示手順</a></li></ol></li><li><a href="#toc6" tabindex="0">ウォッチ式の追加方法</a><ol><li><a href="#toc7" tabindex="0">メニューから追加する</a></li><li><a href="#toc8" tabindex="0">ドラッグで追加する</a></li><li><a href="#toc9" tabindex="0">右クリックメニューから追加する</a></li></ol></li><li><a href="#toc10" tabindex="0">ウォッチウィンドウの3種類のウォッチ</a><ol><li><a href="#toc11" tabindex="0">式ウォッチ（デフォルト）</a></li><li><a href="#toc12" tabindex="0">式がTrueのときに中断</a></li><li><a href="#toc13" tabindex="0">値が変更されたときに中断</a></li><li><a href="#toc14" tabindex="0">3種類の使い分け早見表</a></li></ol></li><li><a href="#toc15" tabindex="0">実務で役立つ活用テクニック</a><ol><li><a href="#toc16" tabindex="0">オブジェクトのプロパティを展開して確認する</a></li><li><a href="#toc17" tabindex="0">配列変数をウォッチウィンドウで確認する</a></li><li><a href="#toc18" tabindex="0">式を使った高度な監視</a></li><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">ウォッチウィンドウのよくあるトラブルと対処法</a></li><li><a href="#toc23" tabindex="0">まとめ</a><ol><li><a href="#toc24" tabindex="0">あわせて読みたい</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">VBAのウォッチウィンドウとは</span></h2>



<p class="wp-block-paragraph">ウォッチウィンドウは、VBE（Visual Basic Editor）に搭載されたデバッグ用のウィンドウです。指定した<a href="https://mashukabu.com/excel-vba-variable-explanation/">変数</a>やプロパティの値をリアルタイムで監視できます。</p>



<p class="wp-block-paragraph">「ウォッチ（Watch）」は英語で「監視する」という意味です。名前のとおり、マクロの実行中に変数の動きを見張ってくれます。</p>



<p class="wp-block-paragraph">主にできることをまとめると、次のとおりです。</p>



<figure class="wp-block-table"><table><thead><tr><th>できること</th><th>使う場面</th></tr></thead><tbody><tr><td>変数やプロパティの値をリアルタイム表示</td><td>ループ中に値の変化を追いたいとき</td></tr><tr><td>条件を満たしたら自動で一時停止</td><td>特定の値になった瞬間を捉えたいとき</td></tr><tr><td>値が変わった瞬間に自動で一時停止</td><td>いつ値が変わるか分からないとき</td></tr><tr><td>オブジェクトのプロパティを展開表示</td><td>RangeやWorksheetの中身を確認したいとき</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">最大の特徴は「<strong>条件を指定して自動停止</strong>」ができる点です。これはVBEのデバッグツールの中でウォッチウィンドウだけが持つ機能です。VBEの画面全体の構成については、<a href="https://mashukabu.com/excel-vba-vbe-menu-explanation/">VBEの画面の見方を図解で解説</a>をあわせてご覧ください。</p>



<h3 class="wp-block-heading"><span id="toc2">デバッグウィンドウ3種の比較</span></h3>



<p class="wp-block-paragraph">VBEには3つのデバッグウィンドウがあります。それぞれの特徴を比較表で整理しておきましょう。</p>



<figure class="wp-block-table"><table><thead><tr><th>比較項目</th><th>ウォッチウィンドウ</th><th><a href="https://mashukabu.com/excel-vbe-local-window-explanation/">ローカルウィンドウ</a></th><th><a href="https://mashukabu.com/excel-vbe-immediate-window-explanation/">イミディエイトウィンドウ</a></th></tr></thead><tbody><tr><td>監視対象</td><td>自分で指定した変数のみ</td><td>プロシージャ内のすべての変数</td><td>手動で入力した式</td></tr><tr><td>条件付き停止</td><td>できる</td><td>できない</td><td>できない</td></tr><tr><td>値の変更検知</td><td>できる</td><td>できない</td><td>できない</td></tr><tr><td>リアルタイム更新</td><td>ステップ実行ごとに更新</td><td>ステップ実行ごとに更新</td><td>手動で入力が必要</td></tr><tr><td>向いている場面</td><td>特定の変数を条件付きで監視</td><td>全変数を一覧で確認</td><td>値の確認や式のテスト</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">ローカルウィンドウは「全部見せてくれるけど、指定できない」タイプです。一方、ウォッチウィンドウは「見たいものだけを条件付きで監視できる」のが強みです。</p>



<h2 class="wp-block-heading"><span id="toc3">VBEの起動とウォッチウィンドウの表示方法</span></h2>



<p class="wp-block-paragraph">ウォッチウィンドウを使うには、まずVBEを開く必要があります。</p>



<h3 class="wp-block-heading"><span id="toc4">VBE（Visual Basic Editor）の開き方</span></h3>



<p class="wp-block-paragraph">VBEを開く方法は2つあります。</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>右側の一覧で「開発」にチェックを入れます</li><li>「OK」をクリックします</li></ol>



<h3 class="wp-block-heading"><span id="toc5">ウォッチウィンドウの表示手順</span></h3>



<p class="wp-block-paragraph">ウォッチウィンドウはデフォルトでは表示されていません。次の手順で表示します。</p>



<p class="wp-block-paragraph">VBEの画面上部にある「<strong>表示</strong>」メニューをクリックし、「<strong>ウォッチ ウィンドウ</strong>」を選択します。VBE画面の下部にウォッチウィンドウが表示されます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP</strong></p><p>一度表示すれば、VBEを閉じるまでウォッチウィンドウは表示されたままです。毎回メニューから開く必要はありません。</p></blockquote>



<p class="wp-block-paragraph">なお、イミディエイトウィンドウにはCtrl + Gというショートカットがあります。しかしウォッチウィンドウにはデフォルトのショートカットキーが割り当てられていません。メニューからの表示方法を覚えておきましょう。</p>



<h2 class="wp-block-heading"><span id="toc6">ウォッチ式の追加方法</span></h2>



<p class="wp-block-paragraph">ウォッチウィンドウを表示しただけでは、中身は空の状態です。監視したい変数やプロパティを「ウォッチ式」として追加しましょう。追加する方法は3つあります。</p>



<h3 class="wp-block-heading"><span id="toc7">メニューから追加する</span></h3>



<ol class="wp-block-list"><li>VBEのメニューバーから「<strong>デバッグ</strong>」をクリックします</li><li>「<strong>ウォッチ式の追加</strong>」を選択します</li><li>ダイアログが表示されるので「<strong>式</strong>」欄に監視したい変数名を入力します</li><li>「OK」をクリックすると、ウォッチウィンドウに追加されます</li></ol>



<p class="wp-block-paragraph">たとえば、変数 <code>i</code> を監視したいなら「式」欄に <code>i</code> と入力するだけでOKです。</p>



<h3 class="wp-block-heading"><span id="toc8">ドラッグで追加する</span></h3>



<p class="wp-block-paragraph">コード上の変数名をマウスで選択して、ウォッチウィンドウにドラッグ&#038;ドロップする方法です。ダイアログを開かなくていいので、複数の変数をまとめて追加したいときに便利です。</p>



<h3 class="wp-block-heading"><span id="toc9">右クリックメニューから追加する</span></h3>



<p class="wp-block-paragraph">コード上で監視したい変数名にカーソルを置いて右クリックします。「<strong>ウォッチ式の追加</strong>」を選択すると、変数名が「式」欄に入った状態でダイアログが開きます。そのままOKを押すだけなので手軽です。</p>



<h2 class="wp-block-heading"><span id="toc10">ウォッチウィンドウの3種類のウォッチ</span></h2>



<p class="wp-block-paragraph">ウォッチ式を追加するとき、「ウォッチの種類」を選べます。この設定がウォッチウィンドウの真価を発揮するポイントです。</p>



<h3 class="wp-block-heading"><span id="toc11">式ウォッチ（デフォルト）</span></h3>



<p class="wp-block-paragraph">「<strong>式ウォッチ</strong>」は、指定した変数やプロパティの現在値をリアルタイムで表示するモードです。ウォッチ式を追加すると、デフォルトでこの設定になります。</p>



<p class="wp-block-paragraph">マクロをステップ実行（F8）しながら、値がどう変化するかを確認するのに使います。</p>



<pre class="wp-block-code"><code>Sub SampleWatch()
    Dim i As Long       '--- カウンター ---
    Dim total As Long   '--- 合計値 ---
    total = 0
    For i = 1 To 10
        total = total + i
    Next i
    MsgBox total
End Sub</code></pre>



<p class="wp-block-paragraph">変数 <code>i</code> と <code>total</code> をウォッチ式に追加してみましょう。F8でステップ実行するたびに、値が更新されていく様子を確認できます。</p>



<h3 class="wp-block-heading"><span id="toc12">式がTrueのときに中断</span></h3>



<p class="wp-block-paragraph">「<strong>式がTrueのときに中断</strong>」は、指定した条件が成立した瞬間に自動でマクロを一時停止するモードです。</p>



<p class="wp-block-paragraph">たとえば「<code>i = 50</code>」という条件を設定しておきます。<a href="https://mashukabu.com/how-to-use-do-loop/">Do Loopなどのループ処理</a>が100回まわる中で、50回目だけを確認したいときに最適です。</p>



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



<ol class="wp-block-list"><li>「ウォッチ式の追加」ダイアログを開きます</li><li>「式」欄に条件式を入力します（例: <code>i = 50</code>）</li><li>「ウォッチの種類」で「<strong>式がTrueのときに中断</strong>」を選択します</li><li>「OK」をクリックします</li></ol>



<p class="wp-block-paragraph">ブレークポイントだと「毎回そこで止まる」のが難点です。このモードなら「条件を満たしたときだけ止まる」ので効率的です。</p>



<h3 class="wp-block-heading"><span id="toc13">値が変更されたときに中断</span></h3>



<p class="wp-block-paragraph">「<strong>値が変更されたときに中断</strong>」は、監視している変数の値が変わった瞬間に自動で一時停止するモードです。</p>



<p class="wp-block-paragraph">どのタイミングで値が書き換わるか分からないバグの追跡に重宝します。「この変数、いつの間にか0になってる&#8230;&#8230;」というケースですね。</p>



<p class="wp-block-paragraph">設定方法は「式がTrueのときに中断」と同じです。ウォッチの種類を「<strong>値が変更されたときに中断</strong>」に変えるだけです。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>「式がTrueのときに中断」と「値が変更されたときに中断」は、マクロの実行速度にわずかに影響します。VBAがステップごとに条件を評価するためです。大量のウォッチ式を設定するとパフォーマンスが落ちることがあるので、必要最低限に絞りましょう。</p></blockquote>



<h3 class="wp-block-heading"><span id="toc14">3種類の使い分け早見表</span></h3>



<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><code>total</code></td></tr><tr><td>特定の条件で止めたい</td><td>式がTrueのときに中断</td><td><code>i = 50</code></td></tr><tr><td>エラーになる値を捉えたい</td><td>式がTrueのときに中断</td><td><code>price < 0</code></td></tr><tr><td>いつ値が変わるか調べたい</td><td>値が変更されたときに中断</td><td><code>flag</code></td></tr><tr><td>配列の要素数を追いたい</td><td>式ウォッチ</td><td><code>UBound(arr)</code></td></tr></tbody></table></figure>



<h2 class="wp-block-heading"><span id="toc15">実務で役立つ活用テクニック</span></h2>



<p class="wp-block-paragraph">基本的な使い方がわかったところで、実務で使える便利なテクニックを紹介します。</p>



<h3 class="wp-block-heading"><span id="toc16">オブジェクトのプロパティを展開して確認する</span></h3>



<p class="wp-block-paragraph">ウォッチウィンドウでは、Range型やWorksheet型などのオブジェクト変数も追加できます。追加すると、中身を<strong>ツリー形式で展開</strong>して確認できます。</p>



<p class="wp-block-paragraph">たとえば <code>Range("A1")</code> をウォッチ式に追加してみましょう。Value、Row、Column、Font、Interiorなど、セルのプロパティが一覧で表示されます。</p>



<p class="wp-block-paragraph">「フォントサイズって今いくつだっけ？」というとき、イミディエイトウィンドウに打ち込まなくても展開するだけで確認できます。</p>



<h3 class="wp-block-heading"><span id="toc17">配列変数をウォッチウィンドウで確認する</span></h3>



<p class="wp-block-paragraph">ウォッチウィンドウには、配列変数も追加できます。たとえば <code>Dim arr(99) As Long</code> のような配列を「式」欄に <code>arr</code> と入力して追加します。</p>



<p class="wp-block-paragraph">すると、ウォッチウィンドウに <code>arr</code> の行が追加され、左側に「+」ボタンが表示されます。この「+」をクリックすると、<code>arr(0)</code> から <code>arr(99)</code> まで全要素を展開して一覧で確認できます。</p>



<p class="wp-block-paragraph">特定のインデックスだけを監視したいときは、<code>arr(50)</code> のようにインデックスを指定してウォッチ式に追加します。注目したい要素だけをピンポイントで見張れるので、画面がすっきりします。</p>



<p class="wp-block-paragraph">大量要素の配列で「特定インデックスの値だけが壊れている」というバグを追うとき、この使い分けが効いてきます。</p>



<h3 class="wp-block-heading"><span id="toc18">式を使った高度な監視</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><code>i</code></td><td>変数iの値を表示</td></tr><tr><td><code>i > 100</code></td><td>iが100を超えたらTrue</td></tr><tr><td><code>Len(myStr)</code></td><td>文字列の長さを表示</td></tr><tr><td><code>Range("A" & i).Value</code></td><td>動的なセル参照の値を表示</td></tr><tr><td><code>UBound(arr) - LBound(arr) + 1</code></td><td>配列の要素数を表示</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">計算結果や関数の戻り値もリアルタイムで監視できます。複雑な処理のデバッグに役立ちます。</p>



<h3 class="wp-block-heading"><span id="toc19">ウォッチ式の編集と削除</span></h3>



<p class="wp-block-paragraph">追加したウォッチ式を変更したいときは、ウォッチウィンドウ内の式をダブルクリックします。「ウォッチ式の編集」ダイアログが開きます。</p>



<p class="wp-block-paragraph">不要になったウォッチ式を削除するには、対象の行を右クリックして「<strong>ウォッチ式の削除</strong>」を選択します。行を選択してDeleteキーを押してもOKです。</p>



<h3 class="wp-block-heading"><span id="toc20">イミディエイトウィンドウと組み合わせる</span></h3>



<p class="wp-block-paragraph">ウォッチウィンドウで値の変化を監視しつつ、<a href="https://mashukabu.com/excel-vbe-immediate-window-explanation/">イミディエイトウィンドウ</a>で値を直接書き換える使い方が強力です。</p>



<p class="wp-block-paragraph">たとえば、ウォッチウィンドウで <code>total</code> を監視中にしておきます。イミディエイトウィンドウで <code>total = 0</code> と入力してEnterを押します。すると、ウォッチウィンドウの値もリアルタイムで更新されます。</p>



<p class="wp-block-paragraph">「変数を0にリセットしたら処理はどう動く？」というシミュレーションが手軽にできます。</p>



<h3 class="wp-block-heading"><span id="toc21">実務シナリオ別：ウォッチウィンドウが威力を発揮する場面</span></h3>



<p class="wp-block-paragraph">3種類のウォッチを実務でどう使うか、具体的なシナリオで見てみましょう。</p>



<p class="wp-block-paragraph"><strong>シナリオA: 1万行ループの特定行でバグが出る</strong></p>



<p class="wp-block-paragraph">1万行を処理するループで、なぜか途中の1行だけ結果がおかしいとします。毎回ブレークポイントで止めていては日が暮れますよね。こんなときは、カウンター変数に <code>i = 9999</code> という条件を設定し、「式がTrueのときに中断」を選びます。9999行目に到達した瞬間だけマクロが止まるので、その時点の各変数の状態をじっくり調べられます。</p>



<p class="wp-block-paragraph"><strong>シナリオB: オブジェクト変数がいつNothingになるか分からない</strong></p>



<p class="wp-block-paragraph">セットしたはずのオブジェクト変数が、処理の途中でいつの間にか Nothing になっているケースです。<code>obj Is Nothing</code> という式を「式がTrueのときに中断」で設定しておけば、Nothingになった瞬間にマクロが止まります。「どこで参照が切れたのか」を一発で特定できます。</p>



<p class="wp-block-paragraph">どちらも<a href="https://mashukabu.com/how-to-use-do-loop/">Do Loopなどのループ処理</a>と組み合わせると、デバッグの手間が大幅に減ります。</p>



<h2 class="wp-block-heading"><span id="toc22">ウォッチウィンドウのよくあるトラブルと対処法</span></h2>



<p class="wp-block-paragraph">使っていて「あれ？」となることがあるかもしれません。よくあるトラブルをまとめました。</p>



<p class="wp-block-paragraph">[faq q="ウォッチウィンドウに「範囲外」と表示されます。" a="マクロが実行中でないか、監視している変数のスコープ外で止まっています。F8キーでステップ実行中に確認してください。"]<br>[faq q="ウォッチウィンドウの値が更新されません。" a="マクロが一時停止していない状態です。ブレークポイントまたはStop文でマクロを一時停止してから確認してください。"]<br>[faq q="ウォッチウィンドウが消えてしまいました。" a="誤って閉じたか、VBEを再起動したためです。VBEの「表示」メニューから「ウォッチ ウィンドウ」を選択して再表示してください。"]<br>[faq q="ウォッチ式でエラーが表示されます。" a="変数名のスペルミスか、スコープの違いが原因です。ウォッチ式をダブルクリックして式を編集・修正してください。"]<br>[faq q="ウォッチ式を追加したらマクロが遅くなりました。" a="ウォッチ式を大量に設定すると処理速度に影響します。デバッグが終わったら不要なウォッチ式を削除して数を絞ってください。"]</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP</strong></p><p>ウォッチウィンドウに追加した式は、<strong>VBEを閉じるとリセットされます</strong>。次回VBEを開いたときは再度追加が必要です。頻繁に使うウォッチ式がある場合は、コード内にコメントとしてメモしておくと便利です。</p></blockquote>



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



<p class="wp-block-paragraph">ウォッチウィンドウは、VBAのデバッグ作業を効率化してくれる強力なツールです。</p>



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



<ul class="wp-block-list"><li><strong>表示方法</strong>: VBEの「表示」メニューから「ウォッチ ウィンドウ」を選択</li><li><strong>ウォッチ式の追加</strong>: メニュー・ドラッグ・右クリックの3つの方法</li><li><strong>式ウォッチ</strong>: 変数の値をリアルタイムで監視</li><li><strong>Trueのときに中断</strong>: 条件を満たしたら自動停止</li><li><strong>値変更時に中断</strong>: 値が変わった瞬間に自動停止</li><li><strong>オブジェクト展開</strong>: Rangeなどのプロパティをツリー形式で確認</li></ul>



<p class="wp-block-paragraph">Debug.Printだけでデバッグしていた方は、「条件付き中断」を試してみてください。ループ処理のデバッグがかなり快適になるはずです。</p>



<p class="wp-block-paragraph">VBEにはウォッチウィンドウ以外にもデバッグに役立つウィンドウがあります。あわせてチェックしてみてくださいね。</p>



<h3 class="wp-block-heading"><span id="toc24">あわせて読みたい</span></h3>



<ul class="wp-block-list"><li><a href="https://mashukabu.com/excel-vbe-local-window-explanation/">VBAローカルウィンドウの使い方</a></li><li><a href="https://mashukabu.com/excel-vbe-immediate-window-explanation/">VBAイミディエイトウィンドウの使い方</a></li><li><a href="https://mashukabu.com/excel-vba-vbe-menu-explanation/">VBEの画面の見方を図解で解説</a></li><li><a href="https://mashukabu.com/how-to-use-do-loop/">VBA Do Loopの使い方</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/excel-vbe-watch-window-explanation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>VBAローカルウィンドウの使い方｜変数の値を一覧で確認してデバッグを効率化</title>
		<link>https://mashukabu.com/excel-vbe-local-window-explanation/</link>
					<comments>https://mashukabu.com/excel-vbe-local-window-explanation/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Mon, 03 Jan 2022 13:19:16 +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>
		<category><![CDATA[変数確認]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=703</guid>

					<description><![CDATA[VBAローカルウィンドウの使い方を解説。ステップ実行（F8）との組み合わせ、配列変数の展開確認、型の不一致エラー特定など5つのデバッグ術をサンプルコード付きで紹介します。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">VBAでマクロを作っていて「この変数、今どんな値が入ってるの？」と確認したくなること、よくありますよね。</p>



<p class="wp-block-paragraph">MsgBoxで1つずつ表示させる方法だと、変数が増えるたびにコードが煩雑になります。Debug.Printも便利ですが、変数が10個も20個もあると追いきれません。</p>



<p class="wp-block-paragraph">そんなときに頼りになるのが <strong>ローカルウィンドウ</strong> です。表示するだけで、プロシージャ内のすべての変数と値が一覧で見えます。この記事では、表示方法からステップ実行との組み合わせ、他のデバッグウィンドウとの使い分けまで解説していきますね。</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を起動し、「挿入」→「標準モジュール」でコードを書く準備ができます。対象環境はExcel 2016以降（Microsoft 365含む）です。</p></blockquote>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-7" checked><label class="toc-title" for="toc-checkbox-7">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">VBAのローカルウィンドウとは？</a><ol><li><a href="#toc2" tabindex="0">ローカルウィンドウで確認できること</a></li><li><a href="#toc3" tabindex="0">ローカルウィンドウが特に役立つ場面</a></li></ol></li><li><a href="#toc4" tabindex="0">ローカルウィンドウの表示方法</a><ol><li><a href="#toc5" tabindex="0">メニューから表示する</a></li><li><a href="#toc6" tabindex="0">ショートカットキーはある？</a></li></ol></li><li><a href="#toc7" tabindex="0">ローカルウィンドウの基本的な使い方</a><ol><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">ステップ実行との組み合わせが最強</a><ol><li><a href="#toc13" tabindex="0">ステップ実行とは</a></li><li><a href="#toc14" tabindex="0">ステップ実行 + ローカルウィンドウの手順</a></li><li><a href="#toc15" tabindex="0">ブレークポイントと組み合わせる</a></li></ol></li><li><a href="#toc16" tabindex="0">ローカルウィンドウの実践活用パターン</a><ol><li><a href="#toc17" tabindex="0">型の不一致エラーを特定する</a></li><li><a href="#toc18" tabindex="0">ループの途中経過をモニタリングする</a></li><li><a href="#toc19" tabindex="0">オブジェクト変数のプロパティを一覧確認する</a></li></ol></li><li><a href="#toc20" tabindex="0">デバッグウィンドウ3種の使い分け</a><ol><li><a href="#toc21" tabindex="0">3種類のデバッグウィンドウ比較</a></li><li><a href="#toc22" tabindex="0">場面別おすすめの使い方</a></li></ol></li><li><a href="#toc23" tabindex="0">ローカルウィンドウのよくあるトラブルと対処法</a></li><li><a href="#toc24" tabindex="0">Dictionary オブジェクトの中身をローカルウィンドウで確認する</a></li><li><a href="#toc25" tabindex="0">値を直接編集して「仮の値」でデバッグする</a></li><li><a href="#toc26" tabindex="0">コールスタックを使ってプロシージャ間のデバッグをする</a></li><li><a href="#toc27" tabindex="0">For Each ループでオブジェクトを繰り返すときの変数追跡</a></li><li><a href="#toc28" tabindex="0">ユーザー定義型（Type）の中身をローカルウィンドウで展開する</a></li><li><a href="#toc29" tabindex="0">クラスモジュールのインスタンス変数を確認する</a></li><li><a href="#toc30" tabindex="0">ローカルウィンドウで「変数が見えない」ときの原因チェックリスト</a><ol><li><a href="#toc31" tabindex="0">マクロが実行中か、完全に止まっているかを確認する</a></li><li><a href="#toc32" tabindex="0">値が「Empty」と表示されるとき</a></li><li><a href="#toc33" tabindex="0">オブジェクト変数が「Nothing」と表示されるとき</a></li><li><a href="#toc34" tabindex="0">モジュールレベル変数が見当たらないとき</a></li><li><a href="#toc35" tabindex="0">Option Explicit を入れていない場合の落とし穴</a></li><li><a href="#toc36" tabindex="0">ByRef 引数は呼び出し元の変数と連動する</a></li></ol></li><li><a href="#toc37" tabindex="0">まとめ</a><ol><li><a href="#toc38" tabindex="0">この記事で紹介したVBA関連記事</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">VBAのローカルウィンドウとは？</span></h2>



<p class="wp-block-paragraph">ローカルウィンドウは、VBE（Visual Basic Editor）に搭載されている <strong>デバッグ用のウィンドウ</strong> です。実行中のプロシージャ（Sub〜End Sub）に含まれる <strong>すべての変数の名前・値・データ型</strong> を自動的に一覧表示してくれます。<a href="https://mashukabu.com/excel-vba-variable-explanation/">VBAの変数の使い方</a>がまだ不安な方は、先にそちらを確認しておくと理解がスムーズです。</p>



<p class="wp-block-paragraph">難しい設定は一切不要です。ウィンドウを表示しておくだけで、マクロが一時停止したタイミングで変数の状態がズラッと並びます。</p>



<h3 class="wp-block-heading"><span id="toc2">ローカルウィンドウで確認できること</span></h3>



<p class="wp-block-paragraph">ローカルウィンドウには3つの列があり、変数の状態をひと目で把握できます。</p>



<figure class="wp-block-table"><table><thead><tr><th>列名</th><th>表示される内容</th><th>確認できること</th></tr></thead><tbody><tr><td><strong>式</strong></td><td>変数名</td><td>どんな変数が宣言されているか</td></tr><tr><td><strong>値</strong></td><td>変数に入っている値</td><td>想定どおりの値が入っているか（クリックで直接編集可。Enterで確定、Escで取消）</td></tr><tr><td><strong>型</strong></td><td>データ型（Integer, String など）</td><td>型の不一致がないか</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">たとえば「数値のつもりで計算しているのに、実は文字列型だった」というバグは、型の列を見れば一発で分かります。VBAを始めたばかりの頃、この手の型ミスで何時間も悩んだ経験がある方は多いのではないでしょうか。</p>



<h3 class="wp-block-heading"><span id="toc3">ローカルウィンドウが特に役立つ場面</span></h3>



<p class="wp-block-paragraph">ローカルウィンドウは、次のようなケースで威力を発揮します。</p>



<ul class="wp-block-list"><li><strong>変数が多いプロシージャのデバッグ</strong>: 5個以上の変数があると、Debug.Printで全部追うのは大変です</li><li><strong>配列やオブジェクトの中身確認</strong>: 展開表示で要素を1つずつ確認できます</li><li><strong>型の不一致によるエラー調査</strong>: 「型が一致しません」エラーの原因特定に最適です</li><li><strong>ループ中の値の変化を追跡</strong>: ステップ実行と組み合わせて1行ずつ確認できます</li></ul>



<h2 class="wp-block-heading"><span id="toc4">ローカルウィンドウの表示方法</span></h2>



<p class="wp-block-paragraph">ローカルウィンドウはデフォルトでは非表示になっていることが多いです。表示する方法を確認しましょう。</p>



<h3 class="wp-block-heading"><span id="toc5">メニューから表示する</span></h3>



<p class="wp-block-paragraph">VBE画面の上部にあるメニューバーから <strong>「表示」→「ローカル ウィンドウ」</strong> を選択します。VBE画面の下部にローカルウィンドウが表示されます。</p>



<h3 class="wp-block-heading"><span id="toc6">ショートカットキーはある？</span></h3>



<p class="wp-block-paragraph">残念ながら、ローカルウィンドウにはデフォルトのショートカットキーが割り当てられていません。<a href="https://mashukabu.com/excel-vbe-immediate-window-explanation/">イミディエイトウィンドウ</a>（<code>Ctrl + G</code>）のように一発では開けないので、メニューから表示する方法を覚えておきましょう。</p>



<p class="wp-block-paragraph">一度表示すれば、VBEを閉じるまでローカルウィンドウは表示されたままです。毎回メニューから開く必要はありませんよ。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP</strong></p><p>会社の共有PCでは、前に使った人がウィンドウのレイアウトを変えていることがあります。ローカルウィンドウが見つからないときは、画面の端に小さく畳まれていないか確認してみてください。メニューの「表示」から再表示すれば元通りになります。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc7">ローカルウィンドウの基本的な使い方</span></h2>



<p class="wp-block-paragraph">ここからが本題です。実際にサンプルコードを使って、ローカルウィンドウの使い方を体験してみましょう。</p>



<h3 class="wp-block-heading"><span id="toc8">サンプルコードで動作を確認する</span></h3>



<p class="wp-block-paragraph">まずは以下のコードをVBEの標準モジュールに貼り付けてください。</p>



<pre class="wp-block-code"><code>Sub LocalWindowSample()
    Dim i As Integer      '--- カウンター変数 ---
    i = 4

    Dim sCategory As String  '--- カテゴリ名 ---
    sCategory = &quot;食べ物&quot;

    Dim vFruits As Variant   '--- 果物リスト（配列） ---
    vFruits = Array(&quot;りんご&quot;, &quot;いちご&quot;, &quot;ばなな&quot;)

    Stop  '--- ここでマクロが一時停止する ---
End Sub</code></pre>



<p class="wp-block-paragraph">最後の <code>Stop</code> はプログラムを一時停止させるステートメントです。この行に到達した時点でマクロの実行が止まり、ローカルウィンドウに変数の状態が表示されます。</p>



<h3 class="wp-block-heading"><span id="toc9">表示される内容を読み解く</span></h3>



<p class="wp-block-paragraph">ローカルウィンドウを表示した状態でこのマクロを実行（<code>F5</code>）すると、<code>Stop</code> の行で一時停止します。このとき、ローカルウィンドウには以下のような内容が表示されます。</p>



<figure class="wp-block-table"><table><thead><tr><th>式</th><th>値</th><th>型</th></tr></thead><tbody><tr><td>i</td><td>4</td><td>Integer</td></tr><tr><td>sCategory</td><td>食べ物</td><td>String</td></tr><tr><td>vFruits</td><td>&nbsp;</td><td>Variant()</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">ウィンドウの左上には実行中のプロシージャ名が表示されます。たとえば <strong>「VBAProject.Module1.LocalWindowSample」</strong> のような並びです。「プロジェクト名.モジュール名.プロシージャ名」の順番で読めます。</p>



<h3 class="wp-block-heading"><span id="toc10">配列の中身を展開して確認する</span></h3>



<p class="wp-block-paragraph">配列変数（上の例では <code>vFruits</code>）は、変数名の左に表示される <strong>「+」マーク</strong> をクリックすると中身を展開できます。</p>



<p class="wp-block-paragraph">展開すると、このように要素が1つずつ表示されます。</p>



<figure class="wp-block-table"><table><thead><tr><th>式</th><th>値</th><th>型</th></tr></thead><tbody><tr><td>vFruits(0)</td><td>りんご</td><td>String</td></tr><tr><td>vFruits(1)</td><td>いちご</td><td>String</td></tr><tr><td>vFruits(2)</td><td>ばなな</td><td>String</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">配列の中身を確認するのに <code>For</code> ループで <code>Debug.Print</code> を書く必要がありません。展開するだけで全要素が見えるのはとても便利ですよね。</p>



<p class="wp-block-paragraph">オブジェクト変数（<code>Range</code> 型や <code>Worksheet</code> 型など）も同じように展開できます。<code>Value</code> や <code>Row</code>、<code>Column</code> といったプロパティが一覧で見えます。「このRangeオブジェクト、何行目を指してるんだっけ？」というときにサッと確認できますよ。</p>



<p class="wp-block-paragraph">なお、モジュールレベル変数（<code>Dim</code> や <code>Private</code> でモジュール先頭に宣言した変数）は、ローカルウィンドウ先頭の展開可能なエントリの中に表示されます。</p>



<h3 class="wp-block-heading"><span id="toc11">列幅の調整</span></h3>



<p class="wp-block-paragraph">環境によっては、値や型の表示が列に収まりきらず途中で切れてしまうことがあります。そんなときは、列見出しの境界線（「式」と「値」の間など）をマウスでドラッグすると列幅を調整できますよ。</p>



<h2 class="wp-block-heading"><span id="toc12">ステップ実行との組み合わせが最強</span></h2>



<p class="wp-block-paragraph">ローカルウィンドウが最も威力を発揮するのは <strong>ステップ実行（F8）</strong> との組み合わせです。</p>



<h3 class="wp-block-heading"><span id="toc13">ステップ実行とは</span></h3>



<p class="wp-block-paragraph">ステップ実行とは、コードを <strong>1行ずつ</strong> 実行していくデバッグ方法です。VBEで <code>F8</code> キーを押すたびに1行ずつ処理が進みます。</p>



<p class="wp-block-paragraph">通常の実行（<code>F5</code>）ではマクロが一瞬で完了してしまうので、途中経過を確認できません。ステップ実行なら「この行を実行したら変数はどう変わるか」を1行ごとに追跡できます。</p>



<h3 class="wp-block-heading"><span id="toc14">ステップ実行 + ローカルウィンドウの手順</span></h3>



<p class="wp-block-paragraph">実際の使い方を見てみましょう。以下のコードで試してみてください。</p>



<pre class="wp-block-code"><code>Sub StepExecutionSample()
    Dim total As Long   '--- 合計値 ---
    Dim i As Long       '--- カウンター ---

    total = 0

    For i = 1 To 5
        total = total + i * 100
    Next i

    MsgBox &quot;合計: &quot; &amp; total
End Sub</code></pre>



<p class="wp-block-paragraph"><strong>手順:</strong></p>



<ol class="wp-block-list"><li>ローカルウィンドウを表示しておく（メニュー「表示」→「ローカル ウィンドウ」）</li><li>コード内の任意の行にカーソルを置く</li><li><code>F8</code> キーを押してステップ実行を開始する</li><li><code>F8</code> を押すたびに1行ずつ進み、ローカルウィンドウの値がリアルタイムで更新される</li></ol>



<p class="wp-block-paragraph">値が変化した変数は赤くハイライト表示されるので、どこが変わったか一目で分かります。</p>



<p class="wp-block-paragraph">ループの1周目で <code>i = 1</code>、<code>total = 100</code> に変わり、2周目で <code>i = 2</code>、<code>total = 300</code> になる。この変化の流れがローカルウィンドウに表示されるので、処理の動きが手に取るように分かります。</p>



<p class="wp-block-paragraph">「ループの3周目で値がおかしくなる」といったバグも、ステップ実行 + ローカルウィンドウなら発見が簡単です。</p>



<h3 class="wp-block-heading"><span id="toc15">ブレークポイントと組み合わせる</span></h3>



<p class="wp-block-paragraph">ステップ実行だと最初から1行ずつ進めることになります。「100行目あたりから確認したい」という場合は、<strong>ブレークポイント</strong> を設定しましょう。</p>



<p class="wp-block-paragraph">コードの行番号の左余白をクリックするか、確認したい行にカーソルを置いて <code>F9</code> を押します。ブレークポイントが設定された行は赤く強調表示されるのが目印です。</p>



<p class="wp-block-paragraph">マクロを <code>F5</code> で実行すると、ブレークポイントの行で自動的に一時停止します。そこからは <code>F8</code> でステップ実行に切り替えて、ローカルウィンドウで変数の変化を追えます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP</strong></p><p>ブレークポイントは複数設定できます。もう一度 <code>F9</code> を押すと解除されます。すべてのブレークポイントを一括解除したいときは、メニューの <strong>「デバッグ」→「すべてのブレークポイントの解除」</strong> を選択してください。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc16">ローカルウィンドウの実践活用パターン</span></h2>



<p class="wp-block-paragraph">基本的な使い方がわかったところで、実務で役立つ活用パターンを紹介します。</p>



<h3 class="wp-block-heading"><span id="toc17">型の不一致エラーを特定する</span></h3>



<p class="wp-block-paragraph">VBAを書いていてよく遭遇する <strong>「実行時エラー &#8217;13&#8217;: 型が一致しません」</strong> というエラー。ローカルウィンドウを使えば原因の特定がスムーズです。</p>



<pre class="wp-block-code"><code>Sub TypeMismatchSample()
    Dim price As Long      '--- 単価 ---
    Dim quantity As Variant '--- 数量（セルから取得） ---
    Dim total As Long       '--- 合計 ---

    price = 1000
    quantity = Range(&quot;A1&quot;).Value  '--- セルの値を取得 ---

    total = price * quantity  '--- ここでエラーが出るかも ---
End Sub</code></pre>



<p class="wp-block-paragraph">セルA1に文字列（たとえば「未入力」）が入っていると、掛け算の行で型エラーが発生します。エラーが出たらローカルウィンドウを確認してみてください。</p>



<ul class="wp-block-list"><li><code>quantity</code> の <strong>値</strong> の列に「未入力」と表示される</li><li><code>quantity</code> の <strong>型</strong> の列に「String」と表示される</li></ul>



<p class="wp-block-paragraph">「数値のつもりが文字列だった」ことが一目瞭然です。原因が分かれば、<a href="https://mashukabu.com/excel-vba-conditional-branch-explanation/">If文</a>と <code>IsNumeric</code> を組み合わせて事前チェックを入れるなどの対策がすぐに打てますよね。</p>



<h3 class="wp-block-heading"><span id="toc18">ループの途中経過をモニタリングする</span></h3>



<p class="wp-block-paragraph">ループ処理で「途中から値がおかしくなる」というケースは、ブレークポイント + ローカルウィンドウが最適です。</p>



<pre class="wp-block-code"><code>Sub LoopMonitorSample()
    Dim i As Long        '--- 行カウンター ---
    Dim lastRow As Long  '--- 最終行 ---
    Dim sName As String  '--- 取得した名前 ---

    lastRow = Cells(Rows.Count, 1).End(xlUp).Row

    For i = 2 To lastRow
        sName = Cells(i, 1).Value

        '--- 名前が空のセルがあるとここで問題が起きる ---
        Cells(i, 2).Value = Left(sName, 3)
    Next i
End Sub</code></pre>



<p class="wp-block-paragraph">ブレークポイントをループ内に設定してステップ実行すれば、<code>i</code> が何行目のときに <code>sName</code> が空になるか、ローカルウィンドウですぐに分かります。</p>



<h3 class="wp-block-heading"><span id="toc19">オブジェクト変数のプロパティを一覧確認する</span></h3>



<p class="wp-block-paragraph"><code>Range</code> 型や <code>Worksheet</code> 型のオブジェクト変数も、ローカルウィンドウで展開して中身を確認できます。</p>



<pre class="wp-block-code"><code>Sub ObjectInspectSample()
    Dim rng As Range '--- 対象セル範囲 ---
    Set rng = Range(&quot;A1:C10&quot;)

    Stop  '--- ここで一時停止 ---
End Sub</code></pre>



<p class="wp-block-paragraph"><code>Stop</code> で停止した状態で、ローカルウィンドウの <code>rng</code> の左にある「+」をクリックしてみてください。<code>Rows.Count</code>（10）、<code>Columns.Count</code>（3）、<code>Address</code>（$A$1:$C$10）といったプロパティが一覧で見えます。</p>



<p class="wp-block-paragraph"><a href="https://mashukabu.com/excel-vbe-immediate-window-explanation/">イミディエイトウィンドウ</a>で <code>?rng.Address</code> のように1つずつ打ち込む方法もあります。ただ、複数のプロパティをまとめて確認したいときはローカルウィンドウのほうが効率的です。</p>



<h2 class="wp-block-heading"><span id="toc20">デバッグウィンドウ3種の使い分け</span></h2>



<p class="wp-block-paragraph">VBEにはローカルウィンドウ以外にもデバッグ用のウィンドウがあります。それぞれ得意分野が異なるので、場面に応じて使い分けましょう。</p>



<h3 class="wp-block-heading"><span id="toc21">3種類のデバッグウィンドウ比較</span></h3>



<figure class="wp-block-table"><table><thead><tr><th>比較項目</th><th>ローカルウィンドウ</th><th><a href="https://mashukabu.com/excel-vbe-immediate-window-explanation/">イミディエイトウィンドウ</a></th><th><a href="https://mashukabu.com/excel-vbe-watch-window-explanation/">ウォッチウィンドウ</a></th></tr></thead><tbody><tr><td>表示対象</td><td>すべての変数（自動）</td><td>手動で指定した値</td><td>手動で指定した変数</td></tr><tr><td>設定の手間</td><td>なし（表示するだけ）</td><td>都度コマンド入力</td><td>ウォッチ式の追加が必要</td></tr><tr><td>条件指定</td><td>できない</td><td>できない</td><td>条件に合致したら自動停止が可能</td></tr><tr><td>値の変更</td><td>一部可能（値の列を直接編集）</td><td>自由に変更可能</td><td>できない</td></tr><tr><td>向いている場面</td><td>全変数をまとめて確認</td><td>ちょい試し・値の書き換え</td><td>特定の変数を条件付きで監視</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><span id="toc22">場面別おすすめの使い方</span></h3>



<p class="wp-block-paragraph">使い分けに迷ったら、次の基準で選んでみてください。</p>



<ul class="wp-block-list"><li><strong>「全部の変数をざっと確認したい」</strong> → <strong>ローカルウィンドウ</strong>。設定不要で一覧が出るので、最初に見るウィンドウとして最適です</li><li><strong>「1つの値をサッと確認したい」「コードの断片を試したい」</strong> → <strong><a href="https://mashukabu.com/excel-vbe-immediate-window-explanation/">イミディエイトウィンドウ</a></strong>。<code>?変数名</code> と打つだけでOKです</li><li><strong>「この変数が特定の値になった瞬間を捉えたい」</strong> → <strong><a href="https://mashukabu.com/excel-vbe-watch-window-explanation/">ウォッチウィンドウ</a></strong>。条件付き中断機能が強力です</li></ul>



<p class="wp-block-paragraph">実際のデバッグでは、ローカルウィンドウで全体を俯瞰するのがおすすめです。怪しい変数はウォッチウィンドウに登録して重点監視すると効率的ですよ。</p>



<h2 class="wp-block-heading"><span id="toc23">ローカルウィンドウのよくあるトラブルと対処法</span></h2>



<p class="wp-block-paragraph">使っていて「あれ？」となるケースをまとめました。</p>



<p class="wp-block-paragraph">[faq q=&#8221;ローカルウィンドウに変数が何も表示されません。&#8221; a=&#8221;マクロが一時停止中でないと表示されません。StopステートメントやF8キーのステップ実行でマクロを一時停止してから確認してください。&#8221;]<br>[faq q=&#8221;変数の値が「Empty」と表示されます。&#8221; a=&#8221;変数に値が代入される前の行で止まっているためです。F8キーで代入行を実行してから確認してください。&#8221;]<br>[faq q=&#8221;ローカルウィンドウが見当たりません。&#8221; a=&#8221;非表示になっているか、画面端に畳まれています。VBEのメニュー「表示」→「ローカル ウィンドウ」で再表示できます。&#8221;]<br>[faq q=&#8221;文字列の値が途中で切れています。&#8221; a=&#8221;Value列は先頭255文字まで表示されます。全文を確認するにはイミディエイトウィンドウで「?変数名」と入力してEnterを押してください。&#8221;]<br>[faq q=&#8221;配列の中身が表示されません。&#8221; a=&#8221;配列が初期化されていない可能性があります。配列への代入後に一時停止して確認してください。&#8221;]<br>[faq q=&#8221;ローカルウィンドウを表示するとマクロが遅くなりますか？&#8221; a=&#8221;ほとんど影響しません。VBAを書くときは常にローカルウィンドウを表示しておくことをおすすめします。&#8221;]</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>ローカルウィンドウの表示はマクロの実行速度にはほとんど影響しません。表示しっぱなしにしておいても問題ないので、VBAを書くときは常に表示しておくのがおすすめです。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc24">Dictionary オブジェクトの中身をローカルウィンドウで確認する</span></h2>



<p class="wp-block-paragraph">業務でデータの集計や重複チェックに使われる <strong>Dictionary オブジェクト</strong> も、ローカルウィンドウで中身を確認できます。キーと値のペアを保持するため「今どんなデータが溜まっているのか」が見えにくいのですが、展開表示を使えば一気に把握できますよ。</p>



<p class="wp-block-paragraph">以下のサンプルコードを標準モジュールに貼り付けて実行（<code>F5</code>）してみてください。</p>



<pre class="wp-block-code"><code>Sub DictionarySample()
    Dim d As Object
    Set d = CreateObject(&quot;Scripting.Dictionary&quot;)

    d.Add &quot;りんご&quot;, 120   '--- キー:商品名 / 値:単価 ---
    d.Add &quot;いちご&quot;, 300
    d.Add &quot;ばなな&quot;, 90

    Stop  '--- ここで一時停止 ---
End Sub</code></pre>



<p class="wp-block-paragraph"><code>Stop</code> で停止したら、ローカルウィンドウの <code>d</code> の左にある「+」マークをクリックして展開してみましょう。次のような項目が確認できます。</p>



<ul class="wp-block-list"><li><strong><code>d.Count</code></strong>: 登録されている件数（この例では <code>3</code>）</li><li><strong><code>d.Keys</code></strong>: キーの配列。さらに展開すると「りんご」「いちご」「ばなな」が並びます</li><li><strong><code>d.Items</code></strong>: 値の配列。展開すると「120」「300」「90」が見えます</li></ul>



<p class="wp-block-paragraph">ただし、<code>Keys</code> と <code>Items</code> は別々の配列として展開されるため、「どのキーにどの値が対応しているか」を一覧で突き合わせるのは少し手間です。キーと値のペアをまとめて確認したいときは、<code>For Each</code> で回しながら <a href="https://mashukabu.com/excel-vbe-immediate-window-explanation/">イミディエイトウィンドウ</a> に <code>Debug.Print</code> する方法のほうが向いているケースもあります。状況に応じて使い分けてみてくださいね。</p>



<h2 class="wp-block-heading"><span id="toc25">値を直接編集して「仮の値」でデバッグする</span></h2>



<p class="wp-block-paragraph">ローカルウィンドウの <strong>「値」列はクリックして直接編集できます</strong>。停止中に値の上をクリックして入力し、<code>Enter</code> で確定、<code>Esc</code> でキャンセルです。</p>



<pre class="wp-block-code"><code>Sub EditValueSample()
    Dim n As Integer
    n = 5

    Stop  '--- ここで n の値を書き換えてみる ---

    If n = 0 Then
        MsgBox &quot;ゼロ除算を回避しました&quot;
    Else
        MsgBox 100 / n
    End If
End Sub</code></pre>



<p class="wp-block-paragraph"><code>Stop</code> で止めたあと <code>n</code> の値を <code>0</code> に書き換えれば、「特定の値が来たときだけ起きるエラー」をその場で再現できます。逆に、エラー状態の変数を正常値に書き換えてその先のコードを動かす、といった使い方も便利です。なお編集できるのは Integer・String・Boolean などのプリミティブ型のみで、オブジェクト型の値は変更できません。</p>



<h2 class="wp-block-heading"><span id="toc26">コールスタックを使ってプロシージャ間のデバッグをする</span></h2>



<p class="wp-block-paragraph">マクロが大きくなると、あるSubが別のSubを呼び出す「入れ子」の構造になります。こうしたケースでは「今どの関数から呼ばれているのか」を把握することがデバッグの鍵になります。</p>



<pre class="wp-block-code"><code>Sub CalcTotal()
    Dim total As Long
    total = CalcRow(3) + CalcRow(5)
    MsgBox total
End Sub

Function CalcRow(ByVal price As Long) As Long
    Dim qty As Long
    qty = 10
    Stop  '--- ここで一時停止 ---
    CalcRow = price * qty
End Function</code></pre>



<p class="wp-block-paragraph"><code>CalcRow</code> の中で停止したとき、ローカルウィンドウ上部左側の <strong>プロシージャ名のドロップダウン</strong> を開くと、呼び出し階層（コールスタック）を切り替えられます。呼び出し元の <code>CalcTotal</code> を選べば、その時点での <code>CalcTotal</code> 側の変数を確認できます。</p>



<p class="wp-block-paragraph">より明示的に階層を見たいときは、メニューの <strong>「デバッグ」→「コール スタック」（<code>Ctrl + L</code>）</strong> で呼び出し順を一覧表示できます。「どの関数から、どんな引数で呼ばれたか」が分かるため、引数の渡し方ミスを発見しやすくなりますよ。変数の宣言や引数の扱いに不安がある方は、<a href="https://mashukabu.com/excel-vba-variable-explanation/">VBAの変数の使い方</a> もあわせて確認しておくと安心です。</p>



<h2 class="wp-block-heading"><span id="toc27">For Each ループでオブジェクトを繰り返すときの変数追跡</span></h2>



<p class="wp-block-paragraph"><a href="https://mashukabu.com/vba-howto-use-for-each-next/">For Each〜Next ループ</a> でセル範囲やシートを繰り返す場合も、ローカルウィンドウで各イテレーションの変数の状態を追えます。</p>



<pre class="wp-block-code"><code>Sub ForEachSample()
    Dim ws As Worksheet   '--- ループ変数（ワークシート）---
    Dim total As Long     '--- 合計行数 ---

    total = 0

    For Each ws In ThisWorkbook.Worksheets
        total = total + ws.UsedRange.Rows.Count
        Stop  '--- 各シートを処理後に一時停止 ---
    Next ws

    MsgBox &quot;全シートの合計行数: &quot; &amp; total
End Sub</code></pre>



<p class="wp-block-paragraph"><code>Stop</code> で止まるたびにローカルウィンドウの <code>ws</code> を展開すると、その周で処理しているシートの <code>Name</code>（シート名）・<code>Index</code>（シート番号）・<code>UsedRange.Address</code>（使用範囲）が確認できます。数値カウンターの <code>i</code> と違い、<strong>オブジェクトのプロパティ単位で状態を把握できる</strong>のが For Each × ローカルウィンドウの強みです。</p>



<p class="wp-block-paragraph">デバッグが終わったら <code>Stop</code> を削除してください。「3周目だけ止まってほしい」という場合は Stop を書かず、<a href="https://mashukabu.com/excel-vbe-watch-window-explanation/">ウォッチウィンドウ</a> の条件付き中断（<code>total >= 300</code> など）を使うほうが効率的です。</p>



<h2 class="wp-block-heading"><span id="toc28">ユーザー定義型（Type）の中身をローカルウィンドウで展開する</span></h2>



<p class="wp-block-paragraph">業務VBAで「商品マスタの1行ぶんをひとまとめにして扱いたい」というときに便利なのが <strong>ユーザー定義型（Type）</strong> です。配列やDictionaryと違ってフィールド名で値を取り出せるので、可読性が高くなります。ローカルウィンドウは、このユーザー定義型の中身も配列と同じように展開して確認できますよ。</p>



<p class="wp-block-paragraph">以下のサンプルコードを標準モジュールに貼り付けてみてください。</p>



<pre class="wp-block-code"><code>'--- 商品データ用のユーザー定義型 ---
Type ProductInfo
    Code As String      '--- 商品コード ---
    ProdName As String  '--- 商品名 ---
    Price As Long       '--- 単価 ---
    InStock As Boolean  '--- 在庫有無 ---
End Type

Sub UserDefinedTypeSample()
    Dim p As ProductInfo
    p.Code = &quot;A001&quot;
    p.ProdName = &quot;りんごジュース&quot;
    p.Price = 180
    p.InStock = True

    Stop  '--- ここで一時停止 ---
End Sub</code></pre>



<p class="wp-block-paragraph"><code>Stop</code> で停止したらローカルウィンドウの <code>p</code> の左にある「+」をクリックしてください。次のように展開されます。</p>



<figure class="wp-block-table"><table><thead><tr><th>式</th><th>値</th><th>型</th></tr></thead><tbody><tr><td>p.Code</td><td>A001</td><td>String</td></tr><tr><td>p.ProdName</td><td>りんごジュース</td><td>String</td></tr><tr><td>p.Price</td><td>180</td><td>Long</td></tr><tr><td>p.InStock</td><td>True</td><td>Boolean</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">フィールド名と値・型がきれいに並ぶので、<code>Debug.Print p.Code & "/" & p.ProdName & "/" & p.Price</code> のように1つずつ書き出す必要がありません。フィールドが10個あっても、ワンクリックで全部見えますよ。</p>



<p class="wp-block-paragraph">ユーザー定義型を配列にまとめた場合（<code>Dim arr(1 To 100) As ProductInfo</code> など）も同じように展開できます。<code>arr(1)</code> を展開すれば1番目の商品の全フィールドが、<code>arr(2)</code> を展開すれば2番目の商品の全フィールドが見えます。マスタ系の処理を作るときは、Typeとローカルウィンドウの組み合わせを覚えておくとデバッグがかなり楽になります。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP</strong></p><p>ネストしたユーザー定義型（Typeの中にTypeを持つ構造）でも展開は階層的に動きます。たとえば <code>ProductInfo</code> の中に <code>SupplierInfo</code> 型のフィールドがあれば、<code>p.Supplier</code> をさらに「+」で開いてフィールドを確認できます。複雑なデータ構造ほどローカルウィンドウの威力が際立ちます。</p></blockquote>



<p class="wp-block-paragraph">なお、Typeのフィールド名は <code>Name</code> のようなVBA予約語や <code>Worksheet.Name</code> と衝突しやすい名前を避けるのがおすすめです。上のサンプルで <code>Name</code> を使わず <code>ProdName</code> にしているのも、トラブルを避けるためです。<a href="https://mashukabu.com/excel-vba-variable-explanation/">VBAの変数の使い方</a> の記事も合わせて読むと、Typeの宣言・代入の基本がより理解しやすくなりますよ。</p>



<h2 class="wp-block-heading"><span id="toc29">クラスモジュールのインスタンス変数を確認する</span></h2>



<p class="wp-block-paragraph">オブジェクト指向で書いたVBAでも、ローカルウィンドウは活躍します。クラスモジュールで作ったインスタンスは、Range や Worksheet と同じようにオブジェクト変数として「+」で展開できますよ。</p>



<p class="wp-block-paragraph">まずクラスモジュールを1つ追加します。VBEのプロジェクトエクスプローラーで右クリック→「挿入」→「クラスモジュール」を選び、プロパティウィンドウで <code>(オブジェクト名)</code> を <code>Employee</code> に変更してください。</p>



<pre class="wp-block-code"><code>'--- クラスモジュール: Employee ---
Public EmpID As String      '--- 社員ID ---
Public EmpName As String    '--- 氏名 ---
Public Salary As Long       '--- 月給 ---

Private mBonusRate As Double  '--- ボーナス係数（内部用） ---

Public Property Let BonusRate(ByVal v As Double)
    mBonusRate = v
End Property

Public Property Get BonusRate() As Double
    BonusRate = mBonusRate
End Property

Public Function AnnualIncome() As Long
    AnnualIncome = Salary * 12 + CLng(Salary * mBonusRate)
End Function</code></pre>



<p class="wp-block-paragraph">標準モジュール側で次のように呼び出します。</p>



<pre class="wp-block-code"><code>Sub ClassInspectSample()
    Dim emp As Employee
    Set emp = New Employee

    emp.EmpID = &quot;E001&quot;
    emp.EmpName = &quot;山田 太郎&quot;
    emp.Salary = 300000
    emp.BonusRate = 2.5

    Stop  '--- ここで一時停止 ---

    MsgBox emp.EmpName &amp; &quot; の年収: &quot; &amp; emp.AnnualIncome
End Sub</code></pre>



<p class="wp-block-paragraph"><code>Stop</code> で停止して <code>emp</code> の「+」をクリックすると、<code>EmpID</code>、<code>EmpName</code>、<code>Salary</code> といったPublicプロパティの値・型が一覧で見えます。<code>BonusRate</code> のように <code>Property Get/Let</code> で公開している項目も、Getプロパティの戻り値として表示されますよ。</p>



<p class="wp-block-paragraph">クラスのメソッド内部で停止した場合は、ローカルウィンドウに <strong><code>Me</code></strong> という特別な行が現れます。これは「自分自身のインスタンス」を表していて、<code>Me</code> を展開すれば自クラスの全プロパティが確認できます。デバッグ中に「あれ、今このメソッドはどのインスタンスから呼ばれてる？」と迷ったら、<code>Me</code> を見れば一発で分かります。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>Privateで宣言した内部変数（上の例の <code>mBonusRate</code>）は、外部のSubから停止した場合は直接見えないことがあります。クラス内部のメソッドで停止した場合は <code>Me</code> の階層に表示されるので、内部状態を確認したいときはクラスメソッド側でブレークするのがおすすめです。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc30">ローカルウィンドウで「変数が見えない」ときの原因チェックリスト</span></h2>



<p class="wp-block-paragraph">「ローカルウィンドウを表示したのに変数が出ない」「展開したらEmptyやNothingばかりで何も分からない」というケース、けっこうあります。原因のパターンと対処法をまとめておきますね。</p>



<h3 class="wp-block-heading"><span id="toc31">マクロが実行中か、完全に止まっているかを確認する</span></h3>



<p class="wp-block-paragraph">ローカルウィンドウは <strong>マクロが一時停止中</strong> のときだけ変数を表示します。F5で普通に実行している間や、すでに End Sub まで終わってしまった後は何も表示されません。</p>



<ul class="wp-block-list"><li><strong>対処</strong>: 確認したい行に <code>Stop</code> を書くか、<code>F9</code> でブレークポイントを設定してから実行する</li><li>一時停止中はVBEのタイトルバーに「[中断]」と表示されるのが目印です</li></ul>



<h3 class="wp-block-heading"><span id="toc32">値が「Empty」と表示されるとき</span></h3>



<p class="wp-block-paragraph"><code>Empty</code> は <strong>Variant型の変数に何も代入されていない状態</strong> を示します。</p>



<pre class="wp-block-code"><code>Sub EmptyCheckSample()
    Dim x As Variant
    Stop  '--- ここで x を見るとEmpty ---
    x = 100
End Sub</code></pre>



<p class="wp-block-paragraph"><code>Stop</code> を <code>x = 100</code> の <strong>後</strong> に移動すれば、<code>x</code> の値は <code>100</code> と表示されます。「代入前の行で止まっていないか」をまず疑ってみてください。</p>



<h3 class="wp-block-heading"><span id="toc33">オブジェクト変数が「Nothing」と表示されるとき</span></h3>



<p class="wp-block-paragraph">Range や Worksheet などのオブジェクト変数は、<code>Set</code> で値をセットしないと <code>Nothing</code> のまま表示されます。</p>



<pre class="wp-block-code"><code>Sub NothingCheckSample()
    Dim ws As Worksheet
    Stop  '--- ここで ws は Nothing ---
    Set ws = ThisWorkbook.Worksheets(1)
End Sub</code></pre>



<p class="wp-block-paragraph"><code>Set</code> の <strong>後</strong> で停止すれば、<code>ws</code> を展開してプロパティが見えます。逆に、処理途中で <code>Set ws = Nothing</code> を実行した後はもう中身が見えなくなる点にも注意してくださいね。</p>



<h3 class="wp-block-heading"><span id="toc34">モジュールレベル変数が見当たらないとき</span></h3>



<p class="wp-block-paragraph"><code>Dim</code> や <code>Public</code> をモジュールの先頭で宣言した変数（モジュールレベル変数）は、プロシージャ内の変数と <strong>別のエントリ</strong> に表示されます。ローカルウィンドウの先頭近くに、モジュール名の付いた展開可能な行があるはずです。「+」で開けばモジュールレベル変数の一覧が出ます。</p>



<pre class="wp-block-code"><code>'--- モジュール先頭で宣言（モジュールレベル変数） ---
Public gCounter As Long

Sub IncrementSample()
    Dim localVar As Long  '--- こちらはプロシージャ変数 ---
    gCounter = gCounter + 1
    localVar = gCounter * 10

    Stop  '--- localVar はすぐ見えるが gCounter はモジュール側エントリ ---
End Sub</code></pre>



<p class="wp-block-paragraph">「変数が見当たらない」と感じたら、まずモジュール側のエントリを開いてみる癖をつけておくと安心です。</p>



<h3 class="wp-block-heading"><span id="toc35">Option Explicit を入れていない場合の落とし穴</span></h3>



<p class="wp-block-paragraph">モジュールの先頭に <code>Option Explicit</code> を書いていないと、タイプミスした変数名が <strong>新しい変数として自動で作られてしまう</strong> ことがあります。ローカルウィンドウを見て「あれ、知らない変数が増えてる？」と思ったら、変数名のスペルミスが疑わしいです。</p>



<ul class="wp-block-list"><li><strong>対処</strong>: モジュール先頭に <code>Option Explicit</code> を必ず書く。VBEの「ツール」→「オプション」で「変数の宣言を強制する」にチェックを入れておくと、新しいモジュールには自動で挿入されます</li></ul>



<h3 class="wp-block-heading"><span id="toc36">ByRef 引数は呼び出し元の変数と連動する</span></h3>



<p class="wp-block-paragraph">ByRef（参照渡し）で受け取った引数は、ローカルウィンドウ上では <strong>呼び出し先の引数名</strong> で表示されます。値を書き換えると呼び出し元の変数も書き換わるので、「思っていた変数と中身が違う」というときは参照渡しを疑ってみてください。</p>



<pre class="wp-block-code"><code>Sub CallerSample()
    Dim n As Long
    n = 10
    Call AddTen(n)  '--- 参照渡しで n が呼び出される ---
    Stop            '--- ここで n は 20 になっている ---
End Sub

Sub AddTen(ByRef value As Long)
    value = value + 10  '--- 呼び出し元の n も書き換わる ---
End Sub</code></pre>



<p class="wp-block-paragraph">参照渡しと値渡しの違いに不安がある方は、ローカルウィンドウで実際の動きを確認してみると一気に理解が進みますよ。詳しい画面構成は <a href="https://mashukabu.com/excel-vba-vbe-menu-explanation/">VBE画面の見方</a> もあわせて参考にしてみてください。</p>



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



<p class="wp-block-paragraph">ローカルウィンドウは、VBAのデバッグ作業をぐっと効率化してくれる便利なツールです。</p>



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



<ul class="wp-block-list"><li><strong>表示方法</strong>: VBEのメニュー「表示」→「ローカル ウィンドウ」を選択</li><li><strong>自動表示</strong>: 設定不要でプロシージャ内のすべての変数を一覧表示</li><li><strong>3つの列</strong>: 「式」（変数名）・「値」（現在の値）・「型」（データ型）</li><li><strong>配列・オブジェクトの展開</strong>: 「+」マークで中身を展開して確認</li><li><strong>ステップ実行（F8）との組み合わせ</strong>: 1行ずつ実行しながら値の変化を追跡</li><li><strong>ブレークポイント（F9）</strong>: 確認したい箇所まで一気に実行して停止</li></ul>



<p class="wp-block-paragraph">MsgBoxで1つずつ確認していた方は、ローカルウィンドウに切り替えるだけでデバッグがかなり快適になるはずです。まずはこの記事のサンプルコードをコピーして、実際に動かしてみてくださいね。</p>



<h3 class="wp-block-heading"><span id="toc38">この記事で紹介したVBA関連記事</span></h3>



<ul class="wp-block-list"><li><a href="https://mashukabu.com/excel-vba-vbe-menu-explanation/">VBE画面の見方を図解で解説</a> &#8212; VBEの画面構成を「基本セット」と「デバッグ用」に分けて整理</li><li><a href="https://mashukabu.com/excel-vbe-immediate-window-explanation/">イミディエイトウィンドウの使い方</a> &#8212; Debug.Printとコマンド入力でサッとデバッグ</li><li><a href="https://mashukabu.com/excel-vbe-watch-window-explanation/">ウォッチウィンドウの使い方</a> &#8212; 条件付き中断で特定の変数を重点監視</li><li><a href="https://mashukabu.com/excel-vba-howto-use-range/">Rangeの使い方</a> &#8212; セルの指定・範囲操作を基本から解説</li><li><a href="https://mashukabu.com/how-to-use-do-loop/">Do Loopの使い方</a> &#8212; 条件付き繰り返し処理を基本から解説</li><li><a href="https://mashukabu.com/excel-vba-like-wildcard/">Like演算子の使い方</a> &#8212; ワイルドカードで文字列を曖昧比較</li><li><a href="https://mashukabu.com/excel-vba-howto-use-for/">For文の使い方</a> &#8212; 回数指定の繰り返し処理</li><li><a href="https://mashukabu.com/excel-vba-variable-explanation/">VBAの変数の使い方</a> &#8212; 変数の宣言・代入・データ型を基本から解説</li><li><a href="https://mashukabu.com/excel-vba-conditional-branch-explanation/">VBA If文の使い方</a> &#8212; 条件分岐の書き方を基本から解説</li><li><a href="https://mashukabu.com/excel-vba-learning-roadmap/">VBAの学習順番ロードマップ</a> &#8212; デバッグを含むVBA習得の全体像</li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/excel-vbe-local-window-explanation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>VBAイミディエイトウィンドウの使い方｜Debug.Printでデバッグ効率化</title>
		<link>https://mashukabu.com/excel-vbe-immediate-window-explanation/</link>
					<comments>https://mashukabu.com/excel-vbe-immediate-window-explanation/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Sun, 02 Jan 2022 12:31:26 +0000</pubDate>
				<category><![CDATA[VBA・マクロ]]></category>
		<category><![CDATA[Debug.Assert]]></category>
		<category><![CDATA[Debug.Print]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[VBE]]></category>
		<category><![CDATA[イミディエイトウィンドウ]]></category>
		<category><![CDATA[デバッグ]]></category>
		<category><![CDATA[ローカルウィンドウ]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=697</guid>

					<description><![CDATA[VBAのイミディエイトウィンドウの開き方からDebug.PrintとDebug.Assertの使い方、電卓として使う方法、ローカル・ウォッチウィンドウとの比較まで解説。MsgBoxより速く、止まらずにデバッグできるようになります。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">「変数の中身、今なんだっけ？」</p>



<p class="wp-block-paragraph">VBAでマクロを書いていると、こんな場面がしょっちゅうありますよね。MsgBoxを仕込んで確認→消して→またMsgBox&#8230;&#8230;。ループ処理が100回まわるマクロだと、OKボタンを100回押す羽目になります。</p>



<p class="wp-block-paragraph">その手間、<strong>イミディエイトウィンドウ</strong>を使えば一瞬で解決できます。この記事では、Debug.Printの基本から電卓的な使い方まで解説します。Debug.Assertによるエラー早期検出もあわせてまとめていきますね。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8" checked><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">VBAのイミディエイトウィンドウとは</a><ol><li><a href="#toc2" tabindex="0">できること3つ（出力・実行・電卓）</a></li><li><a href="#toc3" tabindex="0">MsgBoxとの決定的な違い</a></li></ol></li><li><a href="#toc4" tabindex="0">イミディエイトウィンドウの開き方</a><ol><li><a href="#toc5" tabindex="0">ショートカットキーで開く（Ctrl+G）</a></li><li><a href="#toc6" tabindex="0">VBE画面での位置と表示確認</a></li></ol></li><li><a href="#toc7" tabindex="0">Debug.Printの基本的な使い方</a><ol><li><a href="#toc8" tabindex="0">変数の値を出力する</a></li><li><a href="#toc9" tabindex="0">複数の値を1行に並べる（;と,の違い）</a></li><li><a href="#toc10" tabindex="0">ループ内で使う</a></li></ol></li><li><a href="#toc11" tabindex="0">イミディエイトウィンドウを電卓として使う</a><ol><li><a href="#toc12" tabindex="0">?（クエスチョン）で即計算・即確認</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">Debug.Assertでエラーを早期に検出する</a><ol><li><a href="#toc16" tabindex="0">Debug.Assertの書き方と動作</a></li><li><a href="#toc17" tabindex="0">Debug.PrintとAssertの使い分け</a></li></ol></li><li><a href="#toc18" tabindex="0">デバッグウィンドウ3種の比較と使い分け</a><ol><li><a href="#toc19" tabindex="0">イミディエイト・ローカル・ウォッチの違い一覧</a></li><li><a href="#toc20" tabindex="0">どのシーンでどれを使うか</a></li></ol></li><li><a href="#toc21" tabindex="0">実務シナリオ別の使い方</a><ol><li><a href="#toc22" tabindex="0">ループが途中で止まる原因を調べたい</a></li><li><a href="#toc23" tabindex="0">If文が想定通り分岐しているか確認したい</a></li></ol></li><li><a href="#toc24" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">VBAのイミディエイトウィンドウとは</span></h2>



<p class="wp-block-paragraph">イミディエイトウィンドウは、VBE（Visual Basic Editor）に組み込まれた<strong>デバッグ用の対話パネル</strong>です。英語では「Immediate Window」と呼ばれ、名前のとおり「即座に」結果を確認できるのが特長です。</p>



<h3 class="wp-block-heading"><span id="toc2">できること3つ（出力・実行・電卓）</span></h3>



<p class="wp-block-paragraph">主にできることは次の3つです。</p>



<ul class="wp-block-list"><li><strong>出力</strong>: <code>Debug.Print</code> で変数やプロパティの値を表示する</li><li><strong>実行</strong>: VBAのコードを1行ずつその場で実行する</li><li><strong>電卓</strong>: <code>?</code>（クエスチョンマーク）で計算結果を即確認する</li></ul>



<p class="wp-block-paragraph">マクロの実行を止めずに裏側で情報を確認できるのが最大のメリットです。MsgBoxのようにダイアログが出ないので、処理の流れを邪魔しません。</p>



<h3 class="wp-block-heading"><span id="toc3">MsgBoxとの決定的な違い</span></h3>



<p class="wp-block-paragraph">MsgBoxでも変数の値は確認できます。では何が違うのでしょうか。</p>



<figure class="wp-block-table"><table><thead><tr><th>比較項目</th><th>MsgBox</th><th>Debug.Print</th></tr></thead><tbody><tr><td>表示場所</td><td>ダイアログ（画面の前面）</td><td>イミディエイトウィンドウ</td></tr><tr><td>操作の中断</td><td>OKを押すまで止まる</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">ポイントは「<strong>マクロの動きを邪魔しない</strong>」ことです。Debug.Printはユーザーの画面には何も出ません。消し忘れても実害がないので、デバッグ用の出力として安心して使えます。</p>



<h2 class="wp-block-heading"><span id="toc4">イミディエイトウィンドウの開き方</span></h2>



<p class="wp-block-paragraph">本記事はWindows版Excelを対象としています。Excel 2010以降（Microsoft 365含む）であれば、同じ手順で操作できます。</p>



<p class="wp-block-paragraph">イミディエイトウィンドウを使うには、まずVBEを起動する必要があります。Excelで <strong>Alt + F11</strong> を押してVBEを開きましょう。</p>



<p class="wp-block-paragraph"><a href="https://mashukabu.com/excel-vba-vbe-menu-explanation/">VBE画面の見方</a>がまだよく分からないという方は、先にそちらの記事を読んでおくとスムーズです。</p>



<h3 class="wp-block-heading"><span id="toc5">ショートカットキーで開く（Ctrl+G）</span></h3>



<p class="wp-block-paragraph">VBEを開いたら、次のいずれかの方法でイミディエイトウィンドウを表示します。</p>



<ul class="wp-block-list"><li><strong>ショートカットキー</strong>: <strong>Ctrl + G</strong></li><li><strong>メニュー</strong>: 表示 → イミディエイトウィンドウ</li></ul>



<p class="wp-block-paragraph">Ctrl + Gが一番かんたんです。VBEが開いている状態で押せば、画面下部にパネルがすぐ現れます。</p>



<h3 class="wp-block-heading"><span id="toc6">VBE画面での位置と表示確認</span></h3>



<p class="wp-block-paragraph">イミディエイトウィンドウは、デフォルトではVBE画面の下部に表示されます。コードウィンドウの下にある横長のパネルがそれです。</p>



<p class="wp-block-paragraph">パネル上部に「イミディエイト」と書かれていれば正しく表示されています。表示位置を変えたい場合は、タイトルバーをドラッグすると自由に移動できます。フローティングウィンドウにもできますし、画面の端にドッキングさせることも可能です。</p>



<p class="wp-block-paragraph">もし閉じてしまっても、もう一度 Ctrl + G を押せばすぐ復活します。</p>



<h2 class="wp-block-heading"><span id="toc7">Debug.Printの基本的な使い方</span></h2>



<p class="wp-block-paragraph">イミディエイトウィンドウに値を出力するには、コード内に <code>Debug.Print</code> と書きます。これがデバッグ作業の基本中の基本です。</p>



<h3 class="wp-block-heading"><span id="toc8">変数の値を出力する</span></h3>



<p class="wp-block-paragraph">もっともシンプルな使い方から見ていきましょう。</p>



<pre class="wp-block-code"><code>Sub DebugPrintBasic()
    Dim total As Long '--- 合計値 ---
    total = 100 + 200
    Debug.Print total
End Sub</code></pre>



<p class="wp-block-paragraph">このコードを実行すると、イミディエイトウィンドウに <code>300</code> と表示されます。MsgBoxと違ってダイアログは出ないので、マクロはそのまま最後まで走ります。</p>



<p class="wp-block-paragraph">文字列と組み合わせると、さらに見やすくなります。</p>



<pre class="wp-block-code"><code>Sub DebugPrintWithLabel()
    Dim price As Long '--- 商品価格 ---
    Dim tax As Long   '--- 消費税額 ---
    price = 1000
    tax = price * 0.1
    Debug.Print &quot;税込価格: &quot; &amp; price + tax
End Sub</code></pre>



<p class="wp-block-paragraph">ラベルを付けておくと、何の値が出力されたのか一目で分かりますね。<a href="https://mashukabu.com/excel-vba-variable-explanation/">VBA変数の使い方</a>を復習したい方はそちらもチェックしてみてください。</p>



<h3 class="wp-block-heading"><span id="toc9">複数の値を1行に並べる（;と,の違い）</span></h3>



<p class="wp-block-paragraph">Debug.Printでは、セミコロン（<code>;</code>）やカンマ（<code>,</code>）で複数の値を1行にまとめて出力できます。ただし、それぞれ挙動が違います。</p>



<pre class="wp-block-code"><code>Sub DebugPrintSeparator()
    '--- セミコロン：直後に続けて出力 ---
    Debug.Print &quot;A&quot;; &quot;B&quot;; &quot;C&quot;
    '--- 出力結果: ABC

    '--- カンマ：タブ区切りで出力 ---
    Debug.Print &quot;A&quot;, &quot;B&quot;, &quot;C&quot;
    '--- 出力結果: A          B          C
End Sub</code></pre>



<p class="wp-block-paragraph">セミコロンは値を詰めて並べたいときに使います。カンマは14文字間隔のタブ位置に揃えるので、表のように整列させたいときに便利です。</p>



<p class="wp-block-paragraph">もう一つ覚えておきたいのが、<strong>行末のセミコロン</strong>です。</p>



<pre class="wp-block-code"><code>Sub DebugPrintNoBreak()
    Debug.Print &quot;合計: &quot;;
    Debug.Print 12345
    '--- 出力結果: 合計: 12345（1行にまとまる） ---
End Sub</code></pre>



<p class="wp-block-paragraph">行末にセミコロンを付けると改行されません。次のDebug.Printの出力が同じ行に続きます。</p>



<h3 class="wp-block-heading"><span id="toc10">ループ内で使う</span></h3>



<p class="wp-block-paragraph">Debug.Printが本領を発揮するのはループ処理です。MsgBoxだと繰り返しのたびにOKボタンを押さなければいけませんが、Debug.Printならまとめて確認できます。</p>



<pre class="wp-block-code"><code>Sub DebugPrintLoop()
    Dim i As Long      '--- ループカウンタ ---
    Dim ws As Worksheet '--- 対象シート ---
    Set ws = ActiveSheet

    For i = 2 To 10
        Debug.Print &quot;行&quot; &amp; i &amp; &quot;: &quot; &amp; ws.Cells(i, 1).Value
    Next i
End Sub</code></pre>



<p class="wp-block-paragraph">実行すると、イミディエイトウィンドウに以下のように出力されます。</p>



<pre class="wp-block-code"><code>行2: 田中
行3: 鈴木
行4: 佐藤
...</code></pre>



<p class="wp-block-paragraph">一覧で見られるので、「どの行にどんな値が入っているか」をすばやく把握できます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>イミディエイトウィンドウには約200行までしか保持されません。古い出力は上から順に消えていきます。大量のデータを確認したい場合はファイルへの書き出しも検討しましょう。また、1行あたりの最大文字数は1,023文字です。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc11">イミディエイトウィンドウを電卓として使う</span></h2>



<p class="wp-block-paragraph">Debug.Printはコード内に書くものですが、イミディエイトウィンドウには<strong>直接コマンドを打ち込む</strong>こともできます。これがとても便利なんです。</p>



<h3 class="wp-block-heading"><span id="toc12">?（クエスチョン）で即計算・即確認</span></h3>



<p class="wp-block-paragraph">イミディエイトウィンドウに <code>?</code> と入力してEnterを押すと、その場で式を評価して結果を返してくれます。<code>?</code> は <code>Debug.Print</code> の省略形です。</p>



<pre class="wp-block-code"><code>?1+2+3
 6

?Format(Now, &quot;yyyy/mm/dd&quot;)
2026/03/28

?Len(&quot;イミディエイトウィンドウ&quot;)
 12</code></pre>



<p class="wp-block-paragraph">VBAの関数をそのまま使えるので、ちょっとした計算や動作確認に最適です。電卓代わりに使っている方も多いですよ。</p>



<h3 class="wp-block-heading"><span id="toc13">マクロ実行中断後に変数値を調べる</span></h3>



<p class="wp-block-paragraph">ブレークポイントやStopでマクロを一時停止してみましょう。イミディエイトウィンドウから変数の中身を直接確認できます。</p>



<pre class="wp-block-code"><code>?myVariable
 256

?ws.Name
Sheet1</code></pre>



<p class="wp-block-paragraph">さらに、値を<strong>書き換える</strong>こともできます。</p>



<pre class="wp-block-code"><code>myVariable = 999</code></pre>



<p class="wp-block-paragraph">これを入力してEnterを押すと、変数の値がその場で変わります。「もしこの値だったらどうなるか」を試したいときに重宝します。そのまま F5 を押せば、書き換えた値で処理が再開されます。</p>



<h3 class="wp-block-heading"><span id="toc14">ワンライナーでシートを操作する</span></h3>



<p class="wp-block-paragraph">イミディエイトウィンドウからは、シートの操作もできます。わざわざマクロを書かなくても、1行で済む処理ならここで実行してしまいましょう。</p>



<pre class="wp-block-code"><code>Range(&quot;A1&quot;).Value = &quot;テスト&quot;

ActiveSheet.Name = &quot;集計結果&quot;

?Worksheets.Count
 3</code></pre>



<p class="wp-block-paragraph"><code>?</code> を付ければ戻り値が表示され、<code>?</code> なしならステートメントとして実行されます。プロシージャの呼び出しもできます。</p>



<pre class="wp-block-code"><code>Call MySub

MyFunction 100, 200</code></pre>



<p class="wp-block-paragraph">テスト用のプロシージャをサッと呼び出せるので、動作確認の効率がぐんと上がります。</p>



<h2 class="wp-block-heading"><span id="toc15">Debug.Assertでエラーを早期に検出する</span></h2>



<p class="wp-block-paragraph">Debugオブジェクトには、Printのほかにもう一つ <strong>Assert</strong> というメソッドがあります。Debug.Assertを使うと、「この条件は必ず成り立つはず」というチェックをコードに埋め込めます。</p>



<h3 class="wp-block-heading"><span id="toc16">Debug.Assertの書き方と動作</span></h3>



<p class="wp-block-paragraph">Debug.Assertには、True/Falseを返す式を渡します。</p>



<pre class="wp-block-code"><code>Sub AssertExample()
    Dim count As Long '--- 処理件数 ---
    count = WorksheetFunction.CountA(Range(&quot;A:A&quot;)) - 1

    '--- データが1件以上あることを保証 ---
    Debug.Assert count &gt; 0

    Debug.Print count &amp; &quot;件のデータを処理します&quot;
End Sub</code></pre>



<p class="wp-block-paragraph">渡した式が <strong>Trueのとき</strong> は何も起こりません。マクロはそのまま続行します。</p>



<p class="wp-block-paragraph"><strong>Falseのとき</strong> はマクロが一時停止し、ブレークモードに入ります。該当行が黄色くハイライトされるので、「ここで想定外の状態が起きた」とすぐ気づけます。</p>



<p class="wp-block-paragraph">注意点として、Debug.Assertは<strong>短絡評価をしません</strong>。たとえば以下の書き方は危険です。</p>



<pre class="wp-block-code"><code>'--- NG: objがNothingだとエラーになる ---
Debug.Assert Not obj Is Nothing And obj.Value &gt; 0

'--- OK: 条件を分けて書く ---
Debug.Assert Not obj Is Nothing
Debug.Assert obj.Value &gt; 0</code></pre>



<p class="wp-block-paragraph">条件が複数あるときは、1つずつ分けて書くのが安全です。</p>



<h3 class="wp-block-heading"><span id="toc17">Debug.PrintとAssertの使い分け</span></h3>



<figure class="wp-block-table"><table><thead><tr><th>用途</th><th>使うメソッド</th><th>具体例</th></tr></thead><tbody><tr><td>値を確認したい</td><td>Debug.Print</td><td>ループ中の変数をモニタリング</td></tr><tr><td>前提条件を保証したい</td><td>Debug.Assert</td><td>データが0件でないことを保証</td></tr><tr><td>エラーの原因を追跡したい</td><td>Debug.Print</td><td>If文の分岐をトレースする</td></tr><tr><td>想定外の状態を即座に止めたい</td><td>Debug.Assert</td><td>引数がマイナスでないことを保証</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Debug.Printは「観察するため」、Debug.Assertは「守るため」と覚えておくとよいでしょう。どちらもコンパイル済みのコードからは除去されるため、本番環境のパフォーマンスに影響しません。</p>



<h2 class="wp-block-heading"><span id="toc18">デバッグウィンドウ3種の比較と使い分け</span></h2>



<p class="wp-block-paragraph">VBEにはイミディエイトウィンドウ以外にも、<strong>ローカルウィンドウ</strong>と<strong>ウォッチウィンドウ</strong>があります。この3つを使い分けると、デバッグの効率が大きく変わります。</p>



<h3 class="wp-block-heading"><span id="toc19">イミディエイト・ローカル・ウォッチの違い一覧</span></h3>



<figure class="wp-block-table"><table><thead><tr><th>項目</th><th>イミディエイト</th><th>ローカル</th><th>ウォッチ</th></tr></thead><tbody><tr><td>表示する情報</td><td>Debug.Printの出力 / 手動入力の結果</td><td>現スコープの全変数</td><td>指定した変数・式</td></tr><tr><td>操作のタイミング</td><td>実行中・中断中・停止中</td><td>中断中のみ</td><td>中断中のみ</td></tr><tr><td>情報の更新</td><td>手動（コードまたは入力）</td><td>ブレーク時に自動</td><td>ブレーク時に自動</td></tr><tr><td>値の書き換え</td><td>可能（直接入力）</td><td>可能（ダブルクリック）</td><td>不可</td></tr><tr><td>コード実行</td><td>可能（1行コマンド）</td><td>不可</td><td>不可</td></tr><tr><td>スコープまたぎ</td><td>可能</td><td>現スコープのみ</td><td>可能（条件ブレーク設定も可）</td></tr><tr><td>ショートカット</td><td>Ctrl + G</td><td>表示メニューから</td><td>表示メニューから</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">それぞれ詳しく知りたい方は、<a href="https://mashukabu.com/excel-vbe-local-window-explanation/">ローカルウィンドウの使い方</a>と<a href="https://mashukabu.com/excel-vbe-watch-window-explanation/">ウォッチウィンドウの使い方</a>の記事も参考にしてくださいね。</p>



<h3 class="wp-block-heading"><span id="toc20">どのシーンでどれを使うか</span></h3>



<p class="wp-block-paragraph">迷ったときの目安をまとめます。</p>



<ul class="wp-block-list"><li><strong>「この変数、今いくつ？」をサッと調べたい</strong> → イミディエイトウィンドウで <code>?変数名</code></li><li><strong>プロシージャ内の変数を全部まとめて確認したい</strong> → ローカルウィンドウ</li><li><strong>特定の変数が条件を満たしたら自動停止させたい</strong> → ウォッチウィンドウ</li><li><strong>ループの中身を一覧で見たい</strong> → イミディエイトウィンドウで Debug.Print</li><li><strong>複数プロシージャにまたがる変数を追いかけたい</strong> → ウォッチウィンドウ</li></ul>



<p class="wp-block-paragraph">基本はイミディエイトウィンドウで十分です。「全変数を一覧したい」「条件ブレークを使いたい」など特別な目的があるときに、ローカルやウォッチを併用する考え方でOKです。</p>



<h2 class="wp-block-heading"><span id="toc21">実務シナリオ別の使い方</span></h2>



<p class="wp-block-paragraph">ここからは、実際の業務でよくある場面でのDebug.Print活用法を紹介します。</p>



<h3 class="wp-block-heading"><span id="toc22">ループが途中で止まる原因を調べたい</span></h3>



<p class="wp-block-paragraph">ループが途中で終了してしまう場合、各ステップの値を出力すれば原因を特定しやすくなります。</p>



<pre class="wp-block-code"><code>Sub DebugLoopIssue()
    Dim ws As Worksheet    '--- 対象シート ---
    Dim lastRow As Long    '--- 最終行 ---
    Dim i As Long          '--- ループカウンタ ---
    Dim cellValue As Variant '--- セルの値 ---

    Set ws = ActiveSheet
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    Debug.Print &quot;最終行: &quot; &amp; lastRow

    For i = 2 To lastRow
        cellValue = ws.Cells(i, 1).Value
        Debug.Print &quot;行&quot; &amp; i &amp; &quot; 値=&quot; &amp; cellValue &amp; _
                    &quot; 型=&quot; &amp; TypeName(cellValue)

        '--- 空白行で処理終了 ---
        If IsEmpty(cellValue) Then
            Debug.Print &quot;★ 行&quot; &amp; i &amp; &quot;が空白のため終了&quot;
            Exit For
        End If

        '--- ここに本来の処理を書く ---
    Next i
End Sub</code></pre>



<p class="wp-block-paragraph">出力結果を見れば「何行目でどんな値だったか」「なぜループが終わったのか」がすぐ分かります。TypeNameで型も一緒に出力しているのがポイントです。数値に見える文字列が原因だった、というケースも見逃しません。</p>



<h3 class="wp-block-heading"><span id="toc23">If文が想定通り分岐しているか確認したい</span></h3>



<p class="wp-block-paragraph">条件分岐が複雑になると、どのルートを通ったのか分からなくなりがちです。各分岐にDebug.Printを仕込んで、通過ルートを可視化しましょう。</p>



<pre class="wp-block-code"><code>Sub DebugIfBranch()
    Dim sales As Long   '--- 売上金額 ---
    Dim rank As String   '--- 評価ランク ---
    Dim ws As Worksheet  '--- 対象シート ---
    Dim i As Long        '--- ループカウンタ ---
    Dim lastRow As Long  '--- 最終行 ---

    Set ws = ActiveSheet
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    For i = 2 To lastRow
        sales = ws.Cells(i, 2).Value

        If sales &gt;= 1000000 Then
            rank = &quot;A&quot;
            Debug.Print &quot;行&quot; &amp; i &amp; &quot; → Aランク（売上: &quot; &amp; sales &amp; &quot;）&quot;
        ElseIf sales &gt;= 500000 Then
            rank = &quot;B&quot;
            Debug.Print &quot;行&quot; &amp; i &amp; &quot; → Bランク（売上: &quot; &amp; sales &amp; &quot;）&quot;
        Else
            rank = &quot;C&quot;
            Debug.Print &quot;行&quot; &amp; i &amp; &quot; → Cランク（売上: &quot; &amp; sales &amp; &quot;）&quot;
        End If

        ws.Cells(i, 3).Value = rank
    Next i
End Sub</code></pre>



<p class="wp-block-paragraph">イミディエイトウィンドウの出力を見れば、全行がどのランクに振り分けられたか一覧で確認できます。「100万以上なのにBランクになっている」といった不具合も、一目で発見できますよ。</p>



<p class="wp-block-paragraph"><a href="https://mashukabu.com/excel-vba-conditional-branch-explanation/">VBA If文の使い方</a>の記事も合わせて読むと、条件分岐の基本から復習できます。</p>



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



<p class="wp-block-paragraph">イミディエイトウィンドウの使い方を振り返ります。</p>



<ul class="wp-block-list"><li><strong>Ctrl + G</strong> でVBE上に表示できる</li><li><strong>Debug.Print</strong> で変数値やメッセージを出力する</li><li>セミコロン（<code>;</code>）で直後出力、カンマ（<code>,</code>）でタブ区切り</li><li><strong>?（クエスチョン）</strong> で電卓のように即計算できる</li><li>ブレーク中に変数の値を確認・書き換えもできる</li><li><strong>Debug.Assert</strong> で前提条件のチェックを埋め込める</li><li>ローカル・ウォッチウィンドウと併用するとさらに効率アップ</li></ul>



<p class="wp-block-paragraph">MsgBoxでの確認から卒業するだけで、デバッグのスピードは格段に上がります。まずは普段のコードに <code>Debug.Print</code> を1行追加するところから始めてみてくださいね。</p>



<p class="wp-block-paragraph">VBAのスキルをさらに伸ばしたい方は、<a href="https://mashukabu.com/excel-vba-learning-roadmap/">VBAの学習順番ロードマップ</a>もぜひ参考にしてみてください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/excel-vbe-immediate-window-explanation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
