<?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>Exit For &#8211; biz-tactics</title>
	<atom:link href="https://mashukabu.com/tag/exit-for/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>Exit For &#8211; biz-tactics</title>
	<link>https://mashukabu.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<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-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~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>
