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

<channel>
	<title>エラーハンドリング &#8211; biz-tactics</title>
	<atom:link href="https://mashukabu.com/tag/%e3%82%a8%e3%83%a9%e3%83%bc%e3%83%8f%e3%83%b3%e3%83%89%e3%83%aa%e3%83%b3%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.1</generator>

<image>
	<url>https://mashukabu.com/wp-content/uploads/2022/04/cropped-site-icon-32x32.png</url>
	<title>エラーハンドリング &#8211; biz-tactics</title>
	<link>https://mashukabu.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>VBAのエラーハンドリング完全ガイド｜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>
	</channel>
</rss>
