<?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%bb%e3%83%ab%e7%af%84%e5%9b%b2/feed/" rel="self" type="application/rss+xml" />
	<link>https://mashukabu.com</link>
	<description></description>
	<lastBuildDate>Fri, 27 Mar 2026 22:49:33 +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>
	</channel>
</rss>
