<?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%ab%e3%83%bc%e3%83%97/feed/" rel="self" type="application/rss+xml" />
	<link>https://mashukabu.com</link>
	<description></description>
	<lastBuildDate>Fri, 27 Mar 2026 22:49:45 +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 For Eachの使い方 &#8212; セル・シート・配列を1行でループ処理</title>
		<link>https://mashukabu.com/vba-howto-use-for-each-next/</link>
					<comments>https://mashukabu.com/vba-howto-use-for-each-next/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Sun, 26 Dec 2021 14:59:27 +0000</pubDate>
				<category><![CDATA[VBA・マクロ]]></category>
		<category><![CDATA[For Each]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[コレクション]]></category>
		<category><![CDATA[セル範囲]]></category>
		<category><![CDATA[マクロ]]></category>
		<category><![CDATA[ループ]]></category>
		<category><![CDATA[繰り返し処理]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=638</guid>

					<description><![CDATA[VBAのFor Each~Nextの書き方と実務での使い方を解説します。セル範囲の一括処理・全シートへの処理適用・配列のループという3パターンをサンプルコードつきで紹介。For~Nextとの違いや使い分け判断軸もわかります。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">「セル範囲を全部チェックしたいのに、番号の指定が面倒&#8230;&#8230;」</p>



<p class="wp-block-paragraph">そんな悩み、VBAを書いていると一度は感じますよね。<br>ループ回数を自分で管理するのは手間ですし、範囲が変わるたびにコードを直すのも大変です。</p>



<p class="wp-block-paragraph">For Each~Nextを使えば、対象のセルやシートをまるごとループできます。<br>番号の管理が不要になり、コードもすっきり書けますよ。</p>



<p class="wp-block-paragraph">この記事では、For Eachの基本構文から実務パターンまでまとめて解説します。</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 For Each~Nextとは？基本の書き方をおさらい</a><ol><li><a href="#toc2" tabindex="0">For~Nextとの違いはなに？</a></li></ol></li><li><a href="#toc3" tabindex="0">For Eachでセル範囲を一括処理する</a><ol><li><a href="#toc4" tabindex="0">Rangeに対してFor Eachを使う基本構文</a></li><li><a href="#toc5" tabindex="0">実務サンプル：指定範囲のセルに処理を一括適用</a></li></ol></li><li><a href="#toc6" tabindex="0">For Eachで全シートに同じ処理をする</a><ol><li><a href="#toc7" tabindex="0">WorksheetsコレクションとFor Eachの組み合わせ</a></li><li><a href="#toc8" tabindex="0">実務サンプル：全シートのA1セルをクリアする</a></li><li><a href="#toc9" tabindex="0">実務サンプル：全シートにヘッダーを一括設定する</a></li></ol></li><li><a href="#toc10" tabindex="0">For Eachで配列をループする</a><ol><li><a href="#toc11" tabindex="0">配列に対してFor Eachを使う書き方</a></li><li><a href="#toc12" tabindex="0">配列でのFor Each vs For~Nextの比較</a></li></ol></li><li><a href="#toc13" tabindex="0">VBA For Eachの使い分け判断チャート</a><ol><li><a href="#toc14" tabindex="0">3つのループ構文の使い分け</a></li></ol></li><li><a href="#toc15" tabindex="0">For Eachでよくあるエラーと対処法</a><ol><li><a href="#toc16" tabindex="0">ループ内でシートを削除したいときの対処</a></li></ol></li><li><a href="#toc17" tabindex="0">VBEの起動方法（はじめてマクロを使う方へ）</a><ol><li><a href="#toc18" tabindex="0">VBEの開き方</a></li><li><a href="#toc19" tabindex="0">標準モジュールの挿入と実行</a></li></ol></li><li><a href="#toc20" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">VBA For Each~Nextとは？基本の書き方をおさらい</span></h2>



<p class="wp-block-paragraph">For Each~Nextは、<strong>コレクション（まとまり）の中身を1つずつ取り出して処理する</strong>ループ構文です。</p>



<p class="wp-block-paragraph">「セル範囲のすべてのセル」「ブック内のすべてのシート」など、グループの要素をまとめて処理したいときに使います。</p>



<p class="wp-block-paragraph">基本の構文は次のとおりです。</p>



<pre class="wp-block-code"><code>For Each 変数 In コレクション
    '--- 繰り返したい処理 ---
Next 変数</code></pre>



<p class="wp-block-paragraph"><code>変数</code>にはコレクションの要素が1つずつ代入されます。<br>すべての要素を処理し終わると、自動的にループを抜けます。</p>



<p class="wp-block-paragraph">ポイントは、ループの回数を指定しなくてよいことです。<br>コレクションの要素数が変わっても、コードの修正は不要ですよ。</p>



<h3 class="wp-block-heading"><span id="toc2">For~Nextとの違いはなに？</span></h3>



<p class="wp-block-paragraph"><a href="https://mashukabu.com/excel-vba-howto-use-for/">For~Next</a>は、<strong>回数を指定して繰り返す</strong>ループ構文です。<br>一方、For Eachは<strong>対象のまとまりを順に処理する</strong>構文です。</p>



<p class="wp-block-paragraph">ざっくりまとめると、こんなイメージになります。</p>



<ul class="wp-block-list"><li><strong>For~Next</strong>: 「1番目から10番目まで処理して」</li><li><strong>For Each</strong>: 「この中の全部を処理して」</li></ul>



<p class="wp-block-paragraph">回数が決まっている処理にはFor~Nextが向いています。<br>「全部に同じ処理をしたい」ならFor Eachが便利です。</p>



<p class="wp-block-paragraph">使い分けの詳しい判断軸は、記事の後半で解説しますね。</p>



<h2 class="wp-block-heading"><span id="toc3">For Eachでセル範囲を一括処理する</span></h2>



<p class="wp-block-paragraph">For Eachでもっともよく使うのが、セル範囲のループです。<br>指定した範囲のすべてのセルに、同じ処理を適用できます。</p>



<h3 class="wp-block-heading"><span id="toc4">Rangeに対してFor Eachを使う基本構文</span></h3>



<p class="wp-block-paragraph">セル範囲をFor Eachで処理するときは、<a href="https://mashukabu.com/excel-vba-howto-use-range/">Range</a>オブジェクトをコレクションに指定します。</p>



<pre class="wp-block-code"><code>Sub セル範囲をループ()
    Dim cell As Range '--- 処理対象のセル ---

    For Each cell In Range(&quot;A1:A10&quot;)
        cell.Value = cell.Value * 2 '--- 値を2倍にする ---
    Next cell
End Sub</code></pre>



<p class="wp-block-paragraph"><code>cell</code>には、A1、A2、A3&#8230;&#8230;と順にセルが代入されます。<br>各セルの値を2倍にする、シンプルな処理ですね。</p>



<p class="wp-block-paragraph">なお、セルの処理順序は公式には保証されていません。<br>通常は左上から右下へ処理されますが、<strong>順序に依存するコードは避ける</strong>のがベターです。</p>



<h3 class="wp-block-heading"><span id="toc5">実務サンプル：指定範囲のセルに処理を一括適用</span></h3>



<p class="wp-block-paragraph">実務では、動的な範囲を対象にすることが多いです。<br><a href="https://mashukabu.com/excel-vba-howto-get-lastrow/">最終行の取得</a>と組み合わせたサンプルを見てみましょう。</p>



<pre class="wp-block-code"><code>Sub 空欄セルを強調表示()
    Dim lastRow As Long '--- 最終行 ---
    Dim cell As Range   '--- 処理対象のセル ---

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

    For Each cell In Range(&quot;A1:C&quot; &amp; lastRow)
        If cell.Value = &quot;&quot; Then
            cell.Interior.Color = RGB(255, 200, 200) '--- 薄い赤で塗る ---
        End If
    Next cell
End Sub</code></pre>



<p class="wp-block-paragraph">A列の最終行までの範囲で、空欄セルを薄い赤色にハイライトします。<br>データの入力漏れチェックに、そのまま使えますよ。</p>



<p class="wp-block-paragraph">ループの途中で処理を抜けたいときは、<code>Exit For</code>を使います。<br>最初の空欄が見つかった時点で止めるなら、こう書きます。</p>



<pre class="wp-block-code"><code>If cell.Value = &quot;&quot; Then
    MsgBox cell.Address &amp; &quot; が空欄です&quot;
    Exit For '--- 最初の空欄で停止 ---
End If</code></pre>



<p class="wp-block-paragraph">なお、ループ内で<a href="https://mashukabu.com/excel-vba-conditional-branch-explanation/">If文</a>を組み合わせるのは定番パターンです。<br>条件に合うセルだけを対象にしたいときに活用してくださいね。</p>



<h2 class="wp-block-heading"><span id="toc6">For Eachで全シートに同じ処理をする</span></h2>



<p class="wp-block-paragraph">ブック内の全シートにまとめて処理をかけたいとき、For Eachが活躍します。<br>シート数が増減しても、コードの変更は不要です。</p>



<h3 class="wp-block-heading"><span id="toc7">WorksheetsコレクションとFor Eachの組み合わせ</span></h3>



<p class="wp-block-paragraph"><code>Worksheets</code>コレクションをFor Eachに渡すと、全シートを順に処理できます。</p>



<pre class="wp-block-code"><code>Sub 全シート名を表示()
    Dim ws As Worksheet '--- 処理対象のシート ---

    For Each ws In Worksheets
        Debug.Print ws.Name '--- イミディエイトウィンドウに出力 ---
    Next ws
End Sub</code></pre>



<p class="wp-block-paragraph"><a href="https://mashukabu.com/excel-vba-variable-explanation/">変数</a><code>ws</code>は<code>Worksheet</code>型で宣言するのがポイントです。</p>



<p class="wp-block-paragraph">ひとつ注意があります。<br><code>Worksheets</code>は<strong>非表示のシートも含みます</strong>。<br><code>xlSheetVeryHidden</code>で隠したシートも対象になるので、気をつけてください。<br>表示シートだけ処理したいときは、条件を追加しましょう。</p>



<h3 class="wp-block-heading"><span id="toc8">実務サンプル：全シートのA1セルをクリアする</span></h3>



<pre class="wp-block-code"><code>Sub 全シートA1クリア()
    Dim ws As Worksheet '--- 処理対象のシート ---

    For Each ws In Worksheets
        If ws.Visible = xlSheetVisible Then '--- 表示シートのみ ---
            ws.Range(&quot;A1&quot;).ClearContents
        End If
    Next ws
End Sub</code></pre>



<p class="wp-block-paragraph"><code>ws.Visible = xlSheetVisible</code>の条件で、表示中のシートだけを対象にしています。</p>



<p class="wp-block-paragraph">特定のシートを除外したい場合もあるでしょう。<br>そのときは<code>If ws.Name <> "集計" Then</code>のように、シート名で判定してください。</p>



<h3 class="wp-block-heading"><span id="toc9">実務サンプル：全シートにヘッダーを一括設定する</span></h3>



<p class="wp-block-paragraph">月別シートを持つブックで、全シートに同じヘッダーを設定するコードです。</p>



<pre class="wp-block-code"><code>Sub 全シートにヘッダー設定()
    Dim ws As Worksheet '--- 処理対象のシート ---

    For Each ws In Worksheets
        If ws.Visible = xlSheetVisible Then '--- 表示シートのみ ---
            ws.Range(&quot;A1&quot;).Value = &quot;日付&quot;
            ws.Range(&quot;B1&quot;).Value = &quot;担当者&quot;
            ws.Range(&quot;C1&quot;).Value = &quot;金額&quot;
            ws.Range(&quot;A1:C1&quot;).Font.Bold = True '--- ヘッダーを太字 ---
        End If
    Next ws

    MsgBox &quot;全シートにヘッダーを設定しました&quot;
End Sub</code></pre>



<p class="wp-block-paragraph">毎月シートを追加するようなブックで、ヘッダーの設定漏れを防げます。<br>手動で1枚ずつ入力するよりも、ずっと確実ですよ。</p>



<h2 class="wp-block-heading"><span id="toc10">For Eachで配列をループする</span></h2>



<p class="wp-block-paragraph">For Eachは配列のループにも使えます。<br>ただし、注意点があるので確認しておきましょう。</p>



<h3 class="wp-block-heading"><span id="toc11">配列に対してFor Eachを使う書き方</span></h3>



<pre class="wp-block-code"><code>Sub 配列をループ()
    Dim arr As Variant  '--- 配列 ---
    Dim item As Variant '--- 配列の要素（Variant型が必須） ---

    arr = Array(&quot;東京&quot;, &quot;大阪&quot;, &quot;名古屋&quot;)

    For Each item In arr
        Debug.Print item
    Next item
End Sub</code></pre>



<p class="wp-block-paragraph">ここで大事なポイントがあります。<br><strong>配列をFor Eachで回すとき、変数は必ずVariant型にしてください。</strong><br><code>Dim item As String</code>のように宣言すると、型の不一致エラーになります。</p>



<p class="wp-block-paragraph">コレクション（Worksheetsなど）では専用の型が使えます。<br>しかし、配列はVariant限定です。<br>つまずきやすいので覚えておきましょう。</p>



<h3 class="wp-block-heading"><span id="toc12">配列でのFor Each vs For~Nextの比較</span></h3>



<p class="wp-block-paragraph">配列のループでは、<a href="https://mashukabu.com/excel-vba-howto-use-for/">For~Next</a>のほうが向いているケースもあります。</p>



<figure class="wp-block-table"><table><thead><tr><th>比較項目</th><th>For Each</th><th>For~Next</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>Variant限定</td><td>自由に指定可</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">配列の要素を<strong>読み取るだけ</strong>ならFor Eachが手軽です。<br>要素の<strong>書き換え</strong>や<strong>番号が必要</strong>な処理には、For~Nextを選びましょう。</p>



<h2 class="wp-block-heading"><span id="toc13">VBA For Eachの使い分け判断チャート</span></h2>



<p class="wp-block-paragraph">ここまで3つのパターンを見てきました。<br>「結局どのループを使えばいいの？」と迷ったときの判断軸をまとめます。</p>



<h3 class="wp-block-heading"><span id="toc14">3つのループ構文の使い分け</span></h3>



<figure class="wp-block-table"><table><thead><tr><th>やりたいこと</th><th>おすすめの構文</th></tr></thead><tbody><tr><td>セル範囲に同じ処理をしたい</td><td><strong>For Each</strong></td></tr><tr><td>全シートに同じ処理をしたい</td><td><strong>For Each</strong></td></tr><tr><td>配列を読み取りたい</td><td><strong>For Each</strong></td></tr><tr><td>ループ回数が決まっている</td><td><strong><a href="https://mashukabu.com/excel-vba-howto-use-for/">For~Next</a></strong></td></tr><tr><td>インデックス番号が必要</td><td><strong><a href="https://mashukabu.com/excel-vba-howto-use-for/">For~Next</a></strong></td></tr><tr><td>配列の要素を書き換えたい</td><td><strong><a href="https://mashukabu.com/excel-vba-howto-use-for/">For~Next</a></strong></td></tr><tr><td>条件で繰り返し回数が変わる</td><td><strong><a href="https://mashukabu.com/how-to-use-do-loop/">Do Loop</a></strong></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">迷ったら「対象のまとまりがあるか」で判断するのがコツです。<br>Range・WorksheetsなどのコレクションがあるならFor Eachです。<br>回数やインデックスが重要ならFor~Nextを選びましょう。</p>



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



<p class="wp-block-paragraph">For Eachを使っていて発生しやすいエラーをまとめました。</p>



<figure class="wp-block-table"><table><thead><tr><th>エラー</th><th>原因</th><th>対処法</th></tr></thead><tbody><tr><td>型が一致しません（エラー13）</td><td>配列のループ変数をVariant以外で宣言した</td><td><code>Dim item As Variant</code>に変更する</td></tr><tr><td>オブジェクト変数またはWithブロック変数が設定されていません（エラー91）</td><td>オブジェクト変数への<code>Set</code>忘れ</td><td><code>Set cell = Range("A1")</code>のように<code>Set</code>を付ける</td></tr><tr><td>コンパイルエラー: Next に対する For がありません</td><td><code>Next</code>の変数名がFor Eachと不一致</td><td><code>For Each cell</code>なら<code>Next cell</code>と揃える</td></tr><tr><td>実行時エラー: コレクションは変更できません</td><td>ループ内でコレクションの要素を追加・削除した</td><td>ループ外で削除対象を配列に格納し、後からまとめて削除する</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">特に「型が一致しません」は初心者がつまずきやすいエラーです。<br>配列のループでは、必ず<code>Variant</code>型を使ってください。</p>



<h3 class="wp-block-heading"><span id="toc16">ループ内でシートを削除したいときの対処</span></h3>



<p class="wp-block-paragraph">For Eachのループ中にコレクションを変更すると、エラーになります。<br>シートを削除したい場合は、逆順ループで対処しましょう。</p>



<pre class="wp-block-code"><code>Sub 空シートを削除()
    Dim i As Long '--- ループカウンター ---

    Application.DisplayAlerts = False '--- 確認ダイアログを非表示 ---

    For i = Worksheets.Count To 1 Step -1
        If WorksheetFunction.CountA(Worksheets(i).UsedRange) = 0 Then
            Worksheets(i).Delete
        End If
    Next i

    Application.DisplayAlerts = True '--- 確認ダイアログを復帰 ---
End Sub</code></pre>



<p class="wp-block-paragraph">逆順（<code>Step -1</code>）にするのがポイントです。<br>順方向だと削除後にインデックスがずれて、正しく処理できません。<br>このパターンは<a href="https://mashukabu.com/excel-vba-howto-use-for/">For~Next</a>の逆順ループが適しています。</p>



<h2 class="wp-block-heading"><span id="toc17">VBEの起動方法（はじめてマクロを使う方へ）</span></h2>



<p class="wp-block-paragraph">VBAのコードは、VBE（Visual Basic Editor）で入力して実行します。<br>はじめてマクロを使う方は、以下の手順で準備してくださいね。</p>



<h3 class="wp-block-heading"><span id="toc18">VBEの開き方</span></h3>



<p class="wp-block-paragraph">キーボードで <strong>Alt + F11</strong> を押すと、VBEが起動します。</p>



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



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



<h3 class="wp-block-heading"><span id="toc19">標準モジュールの挿入と実行</span></h3>



<p class="wp-block-paragraph">VBEを開いたら、コードを書く場所を用意します。</p>



<ol class="wp-block-list"><li>メニューの「挿入」→「標準モジュール」をクリック</li><li>表示されたコードウィンドウにコードを貼り付ける</li><li><strong>F5キー</strong>を押すか、メニューの「実行」→「Sub/ユーザーフォームの実行」で実行</li></ol>



<p class="wp-block-paragraph">VBAの基本から体系的に学びたい方は、<a href="https://mashukabu.com/excel-vba-learning-roadmap/">VBA学習ロードマップ</a>も参考にしてみてください。</p>



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



<p class="wp-block-paragraph">この記事では、VBAのFor Each~Nextについて解説しました。</p>



<ul class="wp-block-list"><li><strong>基本構文</strong>: <code>For Each 変数 In コレクション ... Next</code></li><li><strong>セル範囲</strong>: Rangeを指定して全セルを一括処理</li><li><strong>全シート</strong>: Worksheetsで全シートをまとめて処理</li><li><strong>配列</strong>: Variant型の変数で要素を読み取り</li><li><strong>使い分け</strong>: コレクションがあればFor Each、回数指定ならFor~Next</li></ul>



<p class="wp-block-paragraph">For Eachを使いこなすと、繰り返し処理がぐっとシンプルになります。<br>まずはセル範囲のループから、ぜひ試してみてくださいね。</p>



<p class="wp-block-paragraph">なお、作成したマクロは<code>.xlsm</code>（マクロ有効ブック）形式で保存してください。<br><code>.xlsx</code>で保存するとマクロが消えてしまうので注意です。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/vba-howto-use-for-each-next/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>VBA Do Loopの使い方｜Do While・Do Untilを4パターンで解説</title>
		<link>https://mashukabu.com/how-to-use-do-loop/</link>
					<comments>https://mashukabu.com/how-to-use-do-loop/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Sun, 12 Dec 2021 13:57:42 +0000</pubDate>
				<category><![CDATA[VBA・マクロ]]></category>
		<category><![CDATA[Do Loop]]></category>
		<category><![CDATA[Do Until]]></category>
		<category><![CDATA[Do While]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[マクロ]]></category>
		<category><![CDATA[ループ]]></category>
		<category><![CDATA[繰り返し処理]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=549</guid>

					<description><![CDATA[VBA Do Loopの使い方を4パターンの構文から実務サンプルまでわかりやすく解説。Do WhileとDo Untilの違い、前判定・後判定の使い分け、無限ループの回避策、For文との比較を図解で紹介。コピペで使えるサンプルコード付きで初心者でもすぐ実践できます。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">「条件を満たすまで処理を繰り返したい&#8230;&#8230;」</p>



<p class="wp-block-paragraph">VBAで繰り返し処理を書いていると、そんな場面に出くわしますよね。回数が決まっていればFor文で十分です。でも「空白セルが見つかるまで」「値が一定を超えるまで」のように、<strong>終了タイミングが条件次第</strong>のケースがあります。こうした場合、For文だとうまく書けません。</p>



<p class="wp-block-paragraph">そんなときに使うのが <strong>VBA Do Loop</strong> です。この記事では4パターンの構文から実務コードまで解説していきますね。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">VBA Do Loopとは？</a></li><li><a href="#toc2" tabindex="0">Do Loopの基本構文4パターン</a><ol><li><a href="#toc3" tabindex="0">パターン1: Do While &#8230; Loop（前判定・条件を満たす間）</a></li><li><a href="#toc4" tabindex="0">パターン2: Do &#8230; Loop While（後判定・条件を満たす間）</a></li><li><a href="#toc5" tabindex="0">パターン3: Do Until &#8230; Loop（前判定・条件を満たすまで）</a></li><li><a href="#toc6" tabindex="0">パターン4: Do &#8230; Loop Until（後判定・条件を満たすまで）</a></li><li><a href="#toc7" tabindex="0">4パターンの早見表</a></li></ol></li><li><a href="#toc8" tabindex="0">VBA Do Loopの基本コード</a><ol><li><a href="#toc9" tabindex="0">Do While &#8230; Loop の例</a></li><li><a href="#toc10" tabindex="0">Do Until ... Loop の例</a></li><li><a href="#toc11" tabindex="0">前判定と後判定の違いを確認する</a></li></ol></li><li><a href="#toc12" tabindex="0">VBA Do Loopの実践コード</a><ol><li><a href="#toc13" tabindex="0">パターン1: 空白セルまでデータを読み込む</a></li><li><a href="#toc14" tabindex="0">パターン2: 目標金額に達するまで加算する</a></li><li><a href="#toc15" tabindex="0">パターン3: ユーザー入力を繰り返し受け付ける</a></li><li><a href="#toc16" tabindex="0">パターン4: 条件に合うセルを検索する</a></li></ol></li><li><a href="#toc17" tabindex="0">無限ループの防止策</a><ol><li><a href="#toc18" tabindex="0">対策1: カウンター変数で上限を設ける</a></li><li><a href="#toc19" tabindex="0">対策2: DoEventsで中断可能にする</a></li><li><a href="#toc20" tabindex="0">対策3: Exit Do で途中脱出する</a></li></ol></li><li><a href="#toc21" tabindex="0">よくあるエラーと対処法</a></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 Do Loopとは？</span></h2>



<p class="wp-block-paragraph">Do Loopは、<strong>指定した条件にもとづいて処理を繰り返す</strong>VBAのステートメントです。</p>



<p class="wp-block-paragraph">たとえば「セルが空白になるまで1行ずつ読み込む」といった処理に使います。「合計金額が予算を超えるまで加算を続ける」といったケースにも対応できます。</p>



<p class="wp-block-paragraph">For文が「回数指定の繰り返し」なのに対して、Do Loopは「条件指定の繰り返し」と覚えるとわかりやすいですよ。</p>



<figure class="wp-block-table"><table><thead><tr><th>比較項目</th><th>For文</th><th>Do Loop</th></tr></thead><tbody><tr><td>繰り返しの基準</td><td>回数（開始値〜終了値）</td><td>条件（True / False）</td></tr><tr><td>主な用途</td><td>決まった回数のループ</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>VBE（Visual Basic Editor）は <code>Alt</code> + <code>F11</code> で起動します。「挿入」→「標準モジュール」でコードを書く場所を作ったら、Do Loopを試してみましょう。起動方法や画面構成がわからない方は、<a href="https://mashukabu.com/excel-vba-vbe-menu-explanation/">VBE画面の見方</a>の記事を先にチェックしてみてください。</p></blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>Do Loopは条件を満たすまで動き続けます。条件設定を間違えると無限ループになるので、初めのうちは必ず<strong>カウンター変数</strong>を入れて安全策を取りましょう。強制終了の方法は「<a href="https://mashukabu.com/how-to-stop-macro/">マクロを強制終了する方法</a>」で解説しています。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc2">Do Loopの基本構文4パターン</span></h2>



<p class="wp-block-paragraph">Do Loopには <strong>While</strong> と <strong>Until</strong> の2種類のキーワードがあります。さらに条件判定をループの<strong>先頭</strong>に置くか<strong>末尾</strong>に置くかで、計4パターンの構文になります。</p>



<h3 class="wp-block-heading"><span id="toc3">パターン1: Do While &#8230; Loop（前判定・条件を満たす間）</span></h3>



<p class="wp-block-paragraph">条件を<strong>満たしている間</strong>、処理を繰り返します。条件判定はループに入る<strong>前</strong>に行われます。</p>



<pre class="wp-block-code"><code>Do While 条件式
    '--- 繰り返す処理 ---
Loop</code></pre>



<p class="wp-block-paragraph">条件が最初からFalseの場合、処理は<strong>1回も実行されません</strong>。</p>



<h3 class="wp-block-heading"><span id="toc4">パターン2: Do &#8230; Loop While（後判定・条件を満たす間）</span></h3>



<p class="wp-block-paragraph">処理を<strong>1回実行したあと</strong>に条件を判定します。条件を満たしている間、繰り返します。</p>



<pre class="wp-block-code"><code>Do
    '--- 繰り返す処理 ---
Loop While 条件式</code></pre>



<p class="wp-block-paragraph">条件にかかわらず、<strong>必ず1回は処理が実行される</strong>のがポイントです。</p>



<h3 class="wp-block-heading"><span id="toc5">パターン3: Do Until &#8230; Loop（前判定・条件を満たすまで）</span></h3>



<p class="wp-block-paragraph">条件を<strong>満たすまで</strong>処理を繰り返します。条件判定はループに入る<strong>前</strong>に行われます。</p>



<pre class="wp-block-code"><code>Do Until 条件式
    '--- 繰り返す処理 ---
Loop</code></pre>



<p class="wp-block-paragraph">Whileとは条件の意味が逆になります。「〜になるまで回す」と読むとわかりやすいですよ。</p>



<h3 class="wp-block-heading"><span id="toc6">パターン4: Do &#8230; Loop Until（後判定・条件を満たすまで）</span></h3>



<p class="wp-block-paragraph">処理を<strong>1回実行したあと</strong>に条件を判定します。条件を満たすまで繰り返します。</p>



<pre class="wp-block-code"><code>Do
    '--- 繰り返す処理 ---
Loop Until 条件式</code></pre>



<p class="wp-block-paragraph">こちらも<strong>必ず1回は処理が実行される</strong>パターンです。</p>



<h3 class="wp-block-heading"><span id="toc7">4パターンの早見表</span></h3>



<figure class="wp-block-table"><table><thead><tr><th>パターン</th><th>キーワード</th><th>判定タイミング</th><th>意味</th><th>最低実行回数</th></tr></thead><tbody><tr><td>Do While &#8230; Loop</td><td>While</td><td>前判定</td><td>条件を満たす<strong>間</strong></td><td>0回</td></tr><tr><td>Do &#8230; Loop While</td><td>While</td><td>後判定</td><td>条件を満たす<strong>間</strong></td><td>1回</td></tr><tr><td>Do Until &#8230; Loop</td><td>Until</td><td>前判定</td><td>条件を満たす<strong>まで</strong></td><td>0回</td></tr><tr><td>Do &#8230; Loop Until</td><td>Until</td><td>後判定</td><td>条件を満たす<strong>まで</strong></td><td>1回</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>迷ったときは <strong>Do While &#8230; Loop（前判定・While）</strong> を使うのがおすすめです。最もよく使われるパターンで、条件を先にチェックするため安全です。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc8">VBA Do Loopの基本コード</span></h2>



<p class="wp-block-paragraph">4パターンそれぞれの動きを確認してみましょう。どれも「1から3まで数えてメッセージを表示する」コードです。</p>



<h3 class="wp-block-heading"><span id="toc9">Do While &#8230; Loop の例</span></h3>



<pre class="wp-block-code"><code>Sub DoWhileLoop_Basic()
    Dim i As Long 'カウンター
    i = 1

    Do While i &lt;= 3
        MsgBox i &amp; &quot;回目の処理です&quot;
        i = i + 1
    Loop

    MsgBox &quot;ループが終了しました&quot;
End Sub</code></pre>



<p class="wp-block-paragraph"><code>i</code> が4になった時点で <code>i <= 3</code> がFalseになり、ループを抜けます。</p>



<h3 class="wp-block-heading"><span id="toc10">Do Until ... Loop の例</span></h3>



<pre class="wp-block-code"><code>Sub DoUntilLoop_Basic()
    Dim i As Long 'カウンター
    i = 1

    Do Until i &gt; 3
        MsgBox i &amp; &quot;回目の処理です&quot;
        i = i + 1
    Loop

    MsgBox &quot;ループが終了しました&quot;
End Sub</code></pre>



<p class="wp-block-paragraph"><code>i</code> が4になった時点で <code>i > 3</code> がTrueになり、ループを抜けます。While版とは条件式が逆になっている点に注目です。</p>



<h3 class="wp-block-heading"><span id="toc11">前判定と後判定の違いを確認する</span></h3>



<p class="wp-block-paragraph">前判定と後判定の違いがよくわかるコードを見てみましょう。</p>



<pre class="wp-block-code"><code>Sub ComparePrePost()
    Dim i As Long 'カウンター

    '--- 前判定: 条件を満たさないので1回も実行されない ---
    i = 10
    Debug.Print &quot;前判定の開始&quot;
    Do While i &lt;= 3
        Debug.Print &quot;前判定: &quot; &amp; i
        i = i + 1
    Loop

    '--- 後判定: 条件を満たさなくても1回は実行される ---
    i = 10
    Debug.Print &quot;後判定の開始&quot;
    Do
        Debug.Print &quot;後判定: &quot; &amp; i
        i = i + 1
    Loop While i &lt;= 3
End Sub</code></pre>



<p class="wp-block-paragraph">イミディエイトウィンドウ（Ctrl + G で表示）に結果が出力されます。前判定では何も表示されません。後判定では「後判定: 10」が1回だけ表示されます。</p>



<h2 class="wp-block-heading"><span id="toc12">VBA Do Loopの実践コード</span></h2>



<p class="wp-block-paragraph">ここからは、実務で使えるパターンを紹介していきます。セル操作では<a href="https://mashukabu.com/excel-vba-range-cells/">Range・Cellsプロパティ</a>を使います。Cellsの行・列を数値で指定できるので、Do Loopとの相性がいいですよ。</p>



<h3 class="wp-block-heading"><span id="toc13">パターン1: 空白セルまでデータを読み込む</span></h3>



<p class="wp-block-paragraph">A列にデータが入力されていて、空白セルが見つかったら読み込みを止めるコードです。</p>



<pre class="wp-block-code"><code>Sub ReadUntilBlank()
    Dim ws As Worksheet '対象シート
    Dim i As Long '行カウンター
    Dim total As Double '合計値

    Set ws = ActiveSheet
    i = 2 'ヘッダー行をスキップ
    total = 0

    Do While ws.Cells(i, 1).Value &lt;&gt; &quot;&quot;
        total = total + ws.Cells(i, 2).Value
        i = i + 1
    Loop

    MsgBox &quot;合計: &quot; &amp; total &amp; vbCrLf &amp; _
           &quot;データ件数: &quot; &amp; (i - 2) &amp; &quot;件&quot;
End Sub</code></pre>



<p class="wp-block-paragraph">A列が空白になった時点でループを抜けます。データの最終行を事前に調べる必要がなく、行数が変動するデータに便利です。</p>



<h3 class="wp-block-heading"><span id="toc14">パターン2: 目標金額に達するまで加算する</span></h3>



<p class="wp-block-paragraph">売上データを上から順に加算して、目標金額に達した行を特定するコードです。</p>



<pre class="wp-block-code"><code>Sub FindTargetRow()
    Dim ws As Worksheet '対象シート
    Dim i As Long '行カウンター
    Dim cumulative As Double '累積金額
    Dim target As Double '目標金額

    Set ws = ActiveSheet
    i = 2
    cumulative = 0
    target = 1000000

    Do Until cumulative &gt;= target
        If ws.Cells(i, 1).Value = &quot;&quot; Then
            MsgBox &quot;目標に届きませんでした&quot;
            Exit Sub
        End If
        cumulative = cumulative + ws.Cells(i, 2).Value
        i = i + 1
    Loop

    MsgBox &quot;目標達成！&quot; &amp; vbCrLf &amp; _
           (i - 2) &amp; &quot;行目で累計&quot; &amp; Format(cumulative, &quot;#,##0&quot;) &amp; &quot;円&quot;
End Sub</code></pre>



<p class="wp-block-paragraph"><code>Exit Sub</code> で「データが尽きたのにまだ目標未達」のケースも安全に処理しています。ループ内の<a href="https://mashukabu.com/excel-vba-conditional-branch-explanation/">If文</a>で条件分岐し、空白セルに到達したら処理を中断する仕組みです。</p>



<h3 class="wp-block-heading"><span id="toc15">パターン3: ユーザー入力を繰り返し受け付ける</span></h3>



<p class="wp-block-paragraph">InputBoxで入力を受け付けて、「終了」と入力されるまで繰り返すコードです。後判定（Loop Until）の出番です。</p>



<pre class="wp-block-code"><code>Sub InputLoop()
    Dim userInput As String '入力値
    Dim items As String '入力リスト

    items = &quot;&quot;

    Do
        userInput = InputBox(&quot;品名を入力してください&quot; &amp; vbCrLf &amp; _
                             &quot;（「終了」で登録完了）&quot;, &quot;品名登録&quot;)

        If userInput = &quot;&quot; Then Exit Do
        If userInput &lt;&gt; &quot;終了&quot; Then
            items = items &amp; userInput &amp; vbCrLf
        End If
    Loop Until userInput = &quot;終了&quot;

    If items &lt;&gt; &quot;&quot; Then
        MsgBox &quot;登録された品名:&quot; &amp; vbCrLf &amp; items
    End If
End Sub</code></pre>



<p class="wp-block-paragraph">InputBoxは「最低1回は表示したい」ので、後判定がぴったりです。キャンセル（空文字）のときは <code>Exit Do</code> で抜けています。</p>



<h3 class="wp-block-heading"><span id="toc16">パターン4: 条件に合うセルを検索する</span></h3>



<p class="wp-block-paragraph">指定した値がA列のどこにあるか、上から順に探すコードです。<a href="https://mashukabu.com/excel-vba-howto-use-range/">Rangeプロパティ</a>の <code>End(xlUp)</code> で最終行を取得し、Do Loopで1行ずつ照合します。</p>



<pre class="wp-block-code"><code>Sub SearchValue()
    Dim ws As Worksheet '対象シート
    Dim i As Long '行カウンター
    Dim searchWord As String '検索値
    Dim lastRow As Long '最終行
    Dim found As Boolean '見つかったか

    Set ws = ActiveSheet
    searchWord = InputBox(&quot;検索する値を入力してください&quot;)
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    i = 2
    found = False

    Do While i &lt;= lastRow And Not found
        If ws.Cells(i, 1).Value = searchWord Then
            found = True
        Else
            i = i + 1
        End If
    Loop

    If found Then
        MsgBox searchWord &amp; &quot; は &quot; &amp; i &amp; &quot;行目にあります&quot;
        ws.Cells(i, 1).Select
    Else
        MsgBox searchWord &amp; &quot; は見つかりませんでした&quot;
    End If
End Sub</code></pre>



<p class="wp-block-paragraph"><code>And Not found</code> で「見つかったら即終了」にしています。Findメソッドでも検索できますが、Do Loopなら途中に追加処理を挟めるのがメリットです。</p>



<h2 class="wp-block-heading"><span id="toc17">無限ループの防止策</span></h2>



<p class="wp-block-paragraph">Do Loopで最も注意すべきなのが<strong>無限ループ</strong>です。条件が永遠にTrueのままだと、Excelが応答しなくなります。以下の3つの対策を覚えておきましょう。</p>



<h3 class="wp-block-heading"><span id="toc18">対策1: カウンター変数で上限を設ける</span></h3>



<p class="wp-block-paragraph">ループ回数を<a href="https://mashukabu.com/excel-vba-variable-explanation/">変数</a>で管理し、上限に達したら強制終了する方法です。</p>



<pre class="wp-block-code"><code>Dim cnt As Long 'ループ回数カウンター
cnt = 0

Do While 条件式
    '--- 処理 ---
    cnt = cnt + 1
    If cnt &gt; 10000 Then
        MsgBox &quot;ループ回数が上限を超えました&quot;
        Exit Do
    End If
Loop</code></pre>



<h3 class="wp-block-heading"><span id="toc19">対策2: DoEventsで中断可能にする</span></h3>



<pre class="wp-block-code"><code>Do While 条件式
    DoEvents '--- OSにイベント処理を返す ---
    '--- 処理 ---
Loop</code></pre>



<p class="wp-block-paragraph"><code>DoEvents</code> を入れると、ループ中でもEscキーで中断しやすくなります。ただし処理速度はやや落ちます。</p>



<h3 class="wp-block-heading"><span id="toc20">対策3: Exit Do で途中脱出する</span></h3>



<pre class="wp-block-code"><code>Do While 条件式
    If 異常条件 Then Exit Do
    '--- 通常処理 ---
Loop</code></pre>



<p class="wp-block-paragraph"><code>Exit Do</code> はDo Loopを即座に抜けるステートメントです。想定外のデータに遭遇したときの安全弁になります。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>万が一無限ループに入ってしまったら、強制停止してください。Windowsは <strong>Ctrl + Break</strong>（または Esc キー連打）、Macは <strong>Command + ピリオド</strong> です。詳しくは「<a href="https://mashukabu.com/how-to-stop-macro/">マクロを強制終了する方法</a>」をご覧ください。</p></blockquote>



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



<figure class="wp-block-table"><table><thead><tr><th>エラー</th><th>原因</th><th>対処法</th></tr></thead><tbody><tr><td>無限ループ（応答なし）</td><td>カウンター変数の更新忘れ、条件式の設定ミス</td><td>カウンター上限を設ける。<code>DoEvents</code> を入れる</td></tr><tr><td>コンパイルエラー: 「Loop がありません」</td><td><code>Do</code> に対応する <code>Loop</code> が欠落</td><td>インデントを揃えて <code>Do</code> と <code>Loop</code> の対応を確認する</td></tr><tr><td>コンパイルエラー: 「Do がありません」</td><td><code>Loop</code> に対応する <code>Do</code> が欠落</td><td>同上。ネストが深い場合はインデントで整理する</td></tr><tr><td>実行時エラー '6': オーバーフロー</td><td>カウンター変数が <code>Integer</code>（-32,768〜32,767）で足りない</td><td><code>Dim i As Long</code> に変更する（約21億まで対応）</td></tr><tr><td>実行時エラー '91': オブジェクト変数が設定されていません</td><td>ループ内で未初期化のオブジェクトを参照</td><td><code>Set</code> でオブジェクト変数を初期化してからループに入る</td></tr><tr><td>While と Until の条件が逆</td><td>While（〜の間）とUntil（〜になるまで）を取り違え</td><td>「While = True の間」「Until = True になったら終了」と覚える</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>Do Loopを含むマクロは、ファイルを <strong>マクロ有効ブック（.xlsm）</strong> で保存してください。通常の .xlsx では保存時にマクロが消えてしまいます。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc22">繰り返し処理の使い分け</span></h2>



<p class="wp-block-paragraph">VBAには3種類の繰り返しステートメントがあります。場面に合わせて使い分けましょう。</p>



<figure class="wp-block-table"><table><thead><tr><th>比較項目</th><th>For ... Next</th><th>Do Loop</th><th>For Each ... Next</th></tr></thead><tbody><tr><td>繰り返しの基準</td><td>回数（開始値〜終了値）</td><td>条件（True / False）</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><code>Exit For</code></td><td><code>Exit Do</code></td><td><code>Exit For</code></td></tr><tr><td>無限ループのリスク</td><td>低い</td><td>あり</td><td>低い</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><strong>使い分けの目安</strong>:</p>



<ul class="wp-block-list"><li><strong>回数が決まっている</strong> → <a href="https://mashukabu.com/excel-vba-howto-use-for/">For文</a></li><li><strong>条件で終了タイミングが変わる</strong> → Do Loop</li><li><strong>コレクション（セル範囲・全シート・配列）を順に処理</strong> → <a href="https://mashukabu.com/vba-howto-use-for-each-next/">For Each</a></li></ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP</strong></p><p>「空白セルまで下に読む」のような処理はDo Loopの定番パターンです。ただし<a href="https://mashukabu.com/excel-vba-howto-get-lastrow/">最終行を取得する方法</a>で先に <code>End(xlUp).Row</code> で行数を確定させ、Forループで回す方法もあります。好みや可読性で選んで大丈夫ですよ。</p></blockquote>



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



<p class="wp-block-paragraph">Do Loopは「<strong>条件にもとづいて繰り返す</strong>」ためのステートメントです。</p>



<ul class="wp-block-list"><li><strong>While</strong> = 条件を満たしている<strong>間</strong>繰り返す</li><li><strong>Until</strong> = 条件を満たす<strong>まで</strong>繰り返す</li><li><strong>前判定</strong>（Do While / Do Until）= 条件次第で1回も実行されない</li><li><strong>後判定</strong>（Loop While / Loop Until）= 必ず1回は実行される</li><li>迷ったら <strong>Do While ... Loop</strong>（前判定・While）を選ぶ</li><li><strong>カウンター変数</strong> と <strong>Exit Do</strong> で無限ループを防ぐ</li></ul>



<p class="wp-block-paragraph">条件付きの繰り返し処理が書けると、VBAの活用幅がぐっと広がります。まずは基本コードをVBEに貼り付けて、動きを確認してみてくださいね。</p>



<p class="wp-block-paragraph">Do Loopを使いこなせたら、次は<a href="https://mashukabu.com/excel-vba-learning-roadmap/">VBA学習ロードマップ</a>で全体の学習ステップを確認してみましょう。</p>



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



<ul class="wp-block-list"><li><a href="https://mashukabu.com/excel-vba-howto-use-for/">For文の使い方｜繰り返し処理の基本</a></li><li><a href="https://mashukabu.com/vba-howto-use-for-each-next/">For Eachの使い方｜セル・シート・配列を一括処理</a></li><li><a href="https://mashukabu.com/excel-vba-conditional-branch-explanation/">If文の使い方｜条件分岐を基本から実務まで解説</a></li><li><a href="https://mashukabu.com/excel-vba-howto-use-select-case/">Select Case文で条件分岐を見やすく書く方法</a></li><li><a href="https://mashukabu.com/how-to-stop-macro/">マクロを強制終了する方法｜止まらない時の対処法</a></li><li><a href="https://mashukabu.com/excel-vba-vbe-menu-explanation/">VBE画面の見方｜ウィンドウの名前と役割を整理</a></li><li><a href="https://mashukabu.com/excel-vba-howto-use-range/">Rangeの使い方｜セルの指定・範囲操作を基本から解説</a></li><li><a href="https://mashukabu.com/excel-vba-like-wildcard/">Like演算子の使い方｜ワイルドカードで文字列を曖昧比較</a></li><li><a href="https://mashukabu.com/excel-vba-variable-explanation/">VBA変数の使い方</a></li><li><a href="https://mashukabu.com/excel-vba-option-explicit/">Option Explicitで変数宣言を強制する方法</a></li><li><a href="https://mashukabu.com/excel-vba-learning-roadmap/">VBA学習ロードマップ</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/how-to-use-do-loop/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>VBA For~Next文の使い方｜繰り返し処理の基本から実務パターンまで解説</title>
		<link>https://mashukabu.com/excel-vba-howto-use-for/</link>
					<comments>https://mashukabu.com/excel-vba-howto-use-for/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Mon, 22 Nov 2021 12:30:24 +0000</pubDate>
				<category><![CDATA[VBA・マクロ]]></category>
		<category><![CDATA[Exit For]]></category>
		<category><![CDATA[For文]]></category>
		<category><![CDATA[Step]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[ネスト]]></category>
		<category><![CDATA[ループ]]></category>
		<category><![CDATA[繰り返し処理]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=238</guid>

					<description><![CDATA[VBAのFor~Next文の使い方を基本構文から実務パターンまで解説します。Stepでの増減指定やExit Forでの途中終了、ネストの書き方に加え、最終行の自動取得やDo Loop・For Eachとの使い分けまで網羅しています。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">「同じ処理を何十回も手作業で繰り返している&#8230;&#8230;」</p>



<p class="wp-block-paragraph">VBAを使い始めた方なら、一度はこんな場面に出くわしたのではないでしょうか。セルに連番を振ったり、データを1行ずつチェックしたり。手作業だと時間がかかるうえにミスも出やすいですよね。</p>



<p class="wp-block-paragraph">VBAの<strong>For~Next文</strong>を使えば、こうした繰り返し処理をたった数行のコードで自動化できます。この記事では基本構文から実務で使えるパターンまで、まとめて解説していきます。</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 For~Next文とは？繰り返し処理の基本を理解しよう</a></li><li><a href="#toc2" tabindex="0">VBA For~Next文の基本構文と書き方</a><ol><li><a href="#toc3" tabindex="0">基本の書き方</a></li><li><a href="#toc4" tabindex="0">Stepで増減値を変更する</a></li><li><a href="#toc5" tabindex="0">Exit Forで途中終了する</a></li></ol></li><li><a href="#toc6" tabindex="0">VBA For文の実務パターン5選</a><ol><li><a href="#toc7" tabindex="0">パターン1: セルに連番を振る</a></li><li><a href="#toc8" tabindex="0">パターン2: 条件に合うデータだけ処理する</a></li><li><a href="#toc9" tabindex="0">パターン3: 最終行まで自動でループする</a></li><li><a href="#toc10" tabindex="0">パターン4: 逆順ループで行を安全に削除する</a></li><li><a href="#toc11" tabindex="0">パターン5: 複数シートを一括処理する</a></li></ol></li><li><a href="#toc12" tabindex="0">For文のネスト（入れ子）で表を一括処理する</a></li><li><a href="#toc13" tabindex="0">VBA For文でよくあるエラーと対処法</a></li><li><a href="#toc14" tabindex="0">For~Next・Do Loop・For Eachの使い分け</a><ol><li><a href="#toc15" tabindex="0">どう選べばいい？3ステップの判断フロー</a></li></ol></li><li><a href="#toc16" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">VBA For~Next文とは？繰り返し処理の基本を理解しよう</span></h2>



<p class="wp-block-paragraph">For~Next文は、VBAで<strong>「決まった回数だけ処理を繰り返す」</strong>ための構文です。</p>



<p class="wp-block-paragraph">たとえば「1行目から100行目まで同じ処理をしたい」とき、100回コードを書く必要はありません。For~Next文を使えば、カウンター変数が自動で増えながら指定した回数だけ処理を実行してくれます。</p>



<p class="wp-block-paragraph">VBAにはいくつかのループ構文がありますが、For~Next文は<strong>繰り返す回数がはっきり決まっているとき</strong>に一番使いやすい構文です。</p>



<h2 class="wp-block-heading"><span id="toc2">VBA For~Next文の基本構文と書き方</span></h2>



<h3 class="wp-block-heading"><span id="toc3">基本の書き方</span></h3>



<p class="wp-block-paragraph">For~Next文の構文はこちらです。</p>



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

    For i = 1 To 10
        '--- ここに繰り返したい処理を書く ---
    Next i
End Sub</code></pre>



<p class="wp-block-paragraph">動作の流れをかんたんに整理すると、次のようになります。</p>



<ol class="wp-block-list"><li>カウンター変数 <code>i</code> に初期値（ここでは1）が入る</li><li>処理を実行する</li><li><code>Next i</code> で <code>i</code> が1つ増える</li><li><code>i</code> が最終値（ここでは10）を超えていなければ、2に戻る</li><li><code>i</code> が最終値を超えたらループ終了</li></ol>



<p class="wp-block-paragraph">カウンター変数の名前は <code>i</code> が定番です。ただし <code>row</code> や <code>count</code> など、分かりやすい名前でもOKですよ。ポイントは<strong>数値型（Long型）で宣言する</strong>ことです。</p>



<p class="wp-block-paragraph"><code>Integer</code> 型は扱える範囲が -32,768 から 32,767 までです。一方 <code>Long</code> 型なら約21億まで対応できます。大きなデータでも安心なので、迷ったら <code>Long</code> を選んでおきましょう。変数の型について詳しく知りたい方は「<a href="https://mashukabu.com/excel-vba-variable-explanation/">VBAの変数の使い方</a>」の記事もあわせてどうぞ。</p>



<h3 class="wp-block-heading"><span id="toc4">Stepで増減値を変更する</span></h3>



<p class="wp-block-paragraph">通常、カウンター変数は1ずつ増えていきます。<strong>Step</strong> を使うと、増減の幅を自由に変えられます。</p>



<pre class="wp-block-code"><code>' 2行おきに処理する（1, 3, 5, 7, 9行目）
Sub sample_step()
    Dim i As Long

    For i = 1 To 9 Step 2
        Cells(i, 1).Interior.Color = RGB(255, 255, 200)
    Next i
End Sub</code></pre>



<p class="wp-block-paragraph">カウントを減らすことも可能です。その場合は<strong>初期値を最終値より大きくする</strong>のを忘れないでくださいね。</p>



<pre class="wp-block-code"><code>' 10から1に向かってカウントダウン
Sub sample_countdown()
    Dim i As Long

    For i = 10 To 1 Step -1
        Cells(i, 1).Value = i &amp; &quot;番目&quot;
    Next i
End Sub</code></pre>



<p class="wp-block-paragraph">注意点として、<strong>Step に 0 を指定すると無限ループになります</strong>。エラーにはならず延々と処理が続いてしまいます。うっかり書かないように気をつけましょう。</p>



<h3 class="wp-block-heading"><span id="toc5">Exit Forで途中終了する</span></h3>



<p class="wp-block-paragraph">ループの途中で「もうこれ以上繰り返す必要がない」という場面もありますよね。そんなときは <strong>Exit For</strong> を使います。</p>



<pre class="wp-block-code"><code>' A列から「合計」というセルを探して、見つけたらループ終了
Sub sample_exit_for()
    Dim i As Long

    For i = 1 To 1000
        If Cells(i, 1).Value = &quot;合計&quot; Then
            MsgBox i &amp; &quot;行目に「合計」が見つかりました&quot;
            Exit For
        End If
    Next i
End Sub</code></pre>



<p class="wp-block-paragraph">大量のデータを処理するとき、目的のデータが見つかった時点でループを抜ければ<strong>処理時間を大幅に短縮</strong>できます。実務ではかなり重宝するテクニックですよ。</p>



<h2 class="wp-block-heading"><span id="toc6">VBA For文の実務パターン5選</span></h2>



<p class="wp-block-paragraph">ここからは、実際の業務で使えるパターンを紹介していきます。</p>



<h3 class="wp-block-heading"><span id="toc7">パターン1: セルに連番を振る</span></h3>



<p class="wp-block-paragraph">一番シンプルな使い方です。指定した範囲に連番を入力します。</p>



<pre class="wp-block-code"><code>Sub 連番を振る()
    Dim i As Long

    For i = 1 To 20
        Cells(i, 1).Value = i
    Next i
End Sub</code></pre>



<p class="wp-block-paragraph">このコードを実行すると A1 から A20 セルに 1 から 20 の連番が入ります。<a href="https://mashukabu.com/excel-vba-howto-use-range/">RangeやCellsの使い方</a>を理解しておくと、セルの指定がもっと柔軟にできるようになりますよ。</p>



<h3 class="wp-block-heading"><span id="toc8">パターン2: 条件に合うデータだけ処理する</span></h3>



<p class="wp-block-paragraph">For文と<a href="https://mashukabu.com/excel-vba-conditional-branch-explanation/">If文</a>を組み合わせると、条件に合ったデータだけを処理できます。実務で特に使う場面が多いパターンです。</p>



<pre class="wp-block-code"><code>' B列が「未処理」の行だけC列に「要対応」と入力
Sub 条件付き処理()
    Dim i As Long

    For i = 2 To 100
        If Cells(i, 2).Value = &quot;未処理&quot; Then
            Cells(i, 3).Value = &quot;要対応&quot;
        End If
    Next i
End Sub</code></pre>



<p class="wp-block-paragraph">条件に合う行だけ色を付けたり、別シートにコピーしたりといった応用もできます。</p>



<h3 class="wp-block-heading"><span id="toc9">パターン3: 最終行まで自動でループする</span></h3>



<p class="wp-block-paragraph">実務では、データの行数が毎回変わることがほとんどです。ループの終了値を固定してしまうと、データが増えたときに処理漏れが起きてしまいます。</p>



<p class="wp-block-paragraph">そこで、<a href="https://mashukabu.com/excel-vba-howto-get-lastrow/">最終行を自動取得</a>してループの終了値に使うのが定番パターンです。</p>



<pre class="wp-block-code"><code>Sub 最終行まで処理()
    Dim i As Long
    Dim lastRow As Long

    '--- A列の最終行を取得 ---
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row

    For i = 2 To lastRow
        '--- 2行目からデータ最終行まで処理 ---
        If Cells(i, 1).Value = &quot;&quot; Then
            Cells(i, 1).Interior.Color = RGB(255, 200, 200)
        End If
    Next i
End Sub</code></pre>



<p class="wp-block-paragraph"><code>Cells(Rows.Count, 1).End(xlUp).Row</code> は「A列の一番下から上に向かって、最初にデータがあるセルの行番号を返す」という意味です。これで毎回データ件数を調べなくて済みますよ。</p>



<h3 class="wp-block-heading"><span id="toc10">パターン4: 逆順ループで行を安全に削除する</span></h3>



<p class="wp-block-paragraph">行の削除処理をFor文で行うとき、上から順に回すと行番号がずれて正しく処理できません。<strong>Step -1 で下から上に向かってループする</strong>のがポイントです。</p>



<pre class="wp-block-code"><code>Sub 空白行を削除()
    Dim i As Long
    Dim lastRow As Long

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

    For i = lastRow To 2 Step -1
        If Cells(i, 1).Value = &quot;&quot; Then
            Rows(i).Delete
        End If
    Next i
End Sub</code></pre>



<p class="wp-block-paragraph">上から削除すると、たとえば3行目を消した瞬間に4行目が3行目に繰り上がります。すると次の <code>i = 4</code> では元の5行目を処理してしまい、旧4行目がスキップされます。逆順ループならこの問題が起きません。</p>



<h3 class="wp-block-heading"><span id="toc11">パターン5: 複数シートを一括処理する</span></h3>



<p class="wp-block-paragraph">ブック内のすべてのシートに同じ処理をかけたい場面もあります。シート数をカウンター変数の終了値に使うことで、For文でも対応できます。</p>



<pre class="wp-block-code"><code>Sub 全シートにヘッダー追加()
    Dim i As Long

    For i = 1 To Worksheets.Count
        Worksheets(i).Range(&quot;A1&quot;).Value = &quot;No.&quot;
        Worksheets(i).Range(&quot;B1&quot;).Value = &quot;名前&quot;
        Worksheets(i).Range(&quot;C1&quot;).Value = &quot;金額&quot;
    Next i
End Sub</code></pre>



<p class="wp-block-paragraph">ただし、シートやセル範囲などの「コレクション」を順番に処理するなら、<a href="https://mashukabu.com/vba-howto-use-for-each-next/">For Each~Next文</a>のほうがコードがシンプルになります。用途に応じて使い分けてみてください。</p>



<h2 class="wp-block-heading"><span id="toc12">For文のネスト（入れ子）で表を一括処理する</span></h2>



<p class="wp-block-paragraph">For文の中にさらにFor文を入れることを<strong>ネスト（入れ子）</strong>と呼びます。少し複雑に見えますが、やっていることはシンプルです。</p>



<p class="wp-block-paragraph">外側のFor文が<strong>行</strong>を、内側のFor文が<strong>列</strong>を担当するイメージで考えてみてください。</p>



<pre class="wp-block-code"><code>' 5行 x 3列の表すべてに値を入力する
Sub ネストの例()
    Dim i As Long
    Dim j As Long

    For i = 1 To 5       '行のループ
        For j = 1 To 3   '列のループ
            Cells(i, j).Value = i &amp; &quot;行&quot; &amp; j &amp; &quot;列&quot;
        Next j
    Next i
End Sub</code></pre>



<p class="wp-block-paragraph">実行すると、A1 から C5 のセルに「1行1列」「1行2列」&#8230;&#8230;といったテキストが入ります。</p>



<p class="wp-block-paragraph">ネストを使った実務的な例も見てみましょう。表の中で空白セルを見つけて「未入力」と表示するマクロです。</p>



<pre class="wp-block-code"><code>' 表内の空白セルに「未入力」と表示
Sub 空白チェック()
    Dim i As Long
    Dim j As Long

    For i = 2 To 50       '2行目から50行目まで
        For j = 1 To 5    'A列からE列まで
            If Cells(i, j).Value = &quot;&quot; Then
                Cells(i, j).Value = &quot;未入力&quot;
                Cells(i, j).Interior.Color = RGB(255, 200, 200)
            End If
        Next j
    Next i
End Sub</code></pre>



<p class="wp-block-paragraph">ネストするときのポイントは、<strong>外側と内側で別の変数名を使う</strong>ことです。外側が <code>i</code> なら内側は <code>j</code>、さらにネストするなら <code>k</code> にするのが一般的ですよ。同じ変数名を使うとエラーになるので注意してくださいね。</p>



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



<p class="wp-block-paragraph">For文を使っていると遭遇しがちなエラーをまとめました。</p>



<figure class="wp-block-table"><table><thead><tr><th>エラー内容</th><th>原因</th><th>対処法</th></tr></thead><tbody><tr><td>処理が終わらない（無限ループ）</td><td>Step に 0 を指定している</td><td>Step の値を1以上（または-1以下）にする</td></tr><tr><td>ループが一度も実行されない</td><td>初期値 > 最終値になっている（Step が正の値のとき）</td><td>初期値と最終値の大小関係を確認する</td></tr><tr><td>「Next に対応する For がありません」</td><td>For と Next の対応がずれている</td><td>ネスト時は内側から順に Next を閉じる</td></tr><tr><td>「オーバーフロー」エラー</td><td>カウンター変数が Integer 型で範囲超え</td><td>変数を Long 型に変更する</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">特に「ループが一度も実行されない」パターンは気づきにくいバグです。<code>Step -1</code> を使うときに初期値と最終値を逆にし忘れるケースが多いので、気をつけましょう。</p>



<h2 class="wp-block-heading"><span id="toc14">For~Next・Do Loop・For Eachの使い分け</span></h2>



<p class="wp-block-paragraph">VBAには For~Next 以外にもループ構文があります。それぞれの特徴を整理しておくと、場面に応じて最適な構文を選べるようになりますよ。</p>



<figure class="wp-block-table"><table><thead><tr><th>構文</th><th>向いている場面</th><th>特徴</th></tr></thead><tbody><tr><td><strong>For~Next</strong></td><td>繰り返す回数が決まっているとき</td><td>カウンター変数で回数を制御</td></tr><tr><td><strong>Do Loop</strong></td><td>条件を満たすまで（または満たす間）繰り返したいとき</td><td>回数が事前に分からなくてもOK</td></tr><tr><td><strong>For Each</strong></td><td>シートやセル範囲などのコレクションを順番に処理したいとき</td><td>オブジェクトを1つずつ取り出せる</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><span id="toc15">どう選べばいい？3ステップの判断フロー</span></h3>



<ol class="wp-block-list"><li><strong>繰り返す回数が決まっている？</strong> → Yes なら <strong>For~Next</strong></li><li><strong>コレクション（シート・セル範囲・配列）を順番に処理したい？</strong> → Yes なら <strong><a href="https://mashukabu.com/vba-howto-use-for-each-next/">For Each</a></strong></li><li><strong>「条件を満たすまで」繰り返したい？</strong> → Yes なら <strong><a href="https://mashukabu.com/how-to-use-do-loop/">Do Loop</a></strong></li></ol>



<p class="wp-block-paragraph">たとえば「A列の最終行まで処理したいけど、データ件数が毎回変わる」という場合でも、最終行を取得すれば回数が確定するため For~Next で対応できます。一方、「空白セルが見つかるまで」のように終了条件が行数ではない場合は Do Loop が向いています。</p>



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



<p class="wp-block-paragraph">この記事では、VBAのFor~Next文について基本から実務パターンまで解説しました。</p>



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



<ul class="wp-block-list"><li>For~Next文は<strong>回数が決まった繰り返し処理</strong>に最適</li><li><strong>Step</strong> で増減幅を変更、<strong>Exit For</strong> で途中終了できる</li><li><strong>最終行の自動取得</strong>と組み合わせるのが実務の定番パターン</li><li><strong>逆順ループ（Step -1）</strong>は行削除時に必須のテクニック</li><li><strong>ネスト</strong>を使えば行と列の二重ループで表全体を処理できる</li><li>Do Loop・For Eachとの使い分けで、より適切なループ構文を選べる</li></ul>



<p class="wp-block-paragraph">For文はVBAの中でも使用頻度がとても高い構文です。まずはこの記事のサンプルコードをコピーして動かしてみてください。自分で動かしてみると、理解がぐっと深まりますよ。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/excel-vba-howto-use-for/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
