<?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%e6%8c%87%e5%ae%9a/feed/" rel="self" type="application/rss+xml" />
	<link>https://mashukabu.com</link>
	<description></description>
	<lastBuildDate>Fri, 03 Apr 2026 22:02:35 +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】Rangeの使い方｜セルの指定・範囲操作を基本から解説</title>
		<link>https://mashukabu.com/excel-vba-howto-use-range/</link>
					<comments>https://mashukabu.com/excel-vba-howto-use-range/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Sat, 12 Feb 2022 15:04:50 +0000</pubDate>
				<category><![CDATA[VBA・マクロ]]></category>
		<category><![CDATA[CurrentRegion]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[Range]]></category>
		<category><![CDATA[Resize]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[セル指定]]></category>
		<category><![CDATA[プロパティ]]></category>
		<category><![CDATA[メソッド]]></category>
		<category><![CDATA[範囲指定]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=1027</guid>

					<description><![CDATA[VBA Rangeの使い方を基本から実務パターンまで解説。Offset・Resize・CurrentRegionで動的な範囲指定、For Eachループ、最終行取得まで網羅。コピーして使えるサンプルコード付き。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">VBAでセルを操作するとき「<code>Range("A1")</code>」は書けるけれど、動的な範囲指定になると急に手が止まる。そんな経験はありませんか？</p>



<p class="wp-block-paragraph">固定のセル番地しか使えないままだと、行数が変わるたびにコードを書き直すことになります。データが増えるほど手間も増える悪循環です。</p>



<p class="wp-block-paragraph">この記事では、Rangeの基本から Offset・Resize・CurrentRegion といった動的操作まで体系的に解説します。コピペで使えるサンプルコード付きなので、すぐに実務に活かせますよ。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>VBEの起動方法や画面の見方は「<a href="https://mashukabu.com/excel-vba-vbe-menu-explanation/">VBE画面の見方</a>」で解説しています。初めてマクロを書く方は先にチェックしてみてください。</p></blockquote>




  <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 Rangeプロパティとは？</a><ol><li><a href="#toc2" tabindex="0">Rangeの基本構文</a></li></ol></li><li><a href="#toc3" tabindex="0">VBA Rangeの基本的な使い方</a><ol><li><a href="#toc4" tabindex="0">単一セルを指定する</a></li><li><a href="#toc5" tabindex="0">セル範囲を指定する</a></li><li><a href="#toc6" tabindex="0">飛び飛びのセルを指定する</a></li><li><a href="#toc7" tabindex="0">列全体・行全体を指定する</a></li><li><a href="#toc8" tabindex="0">名前定義されたセルを指定する</a></li></ol></li><li><a href="#toc9" tabindex="0">Offsetで隣接セルを参照する</a><ol><li><a href="#toc10" tabindex="0">Offsetの構文と動作イメージ</a></li><li><a href="#toc11" tabindex="0">Offsetの実務活用例</a></li></ol></li><li><a href="#toc12" tabindex="0">Resize・CurrentRegionで範囲を動的に操作する</a><ol><li><a href="#toc13" tabindex="0">Resizeの構文と動作イメージ</a></li><li><a href="#toc14" tabindex="0">CurrentRegionで表全体を取得する</a></li><li><a href="#toc15" tabindex="0">ヘッダー行を除いてデータ部分だけを操作する</a></li></ol></li><li><a href="#toc16" tabindex="0">VBA Rangeのプロパティとメソッド</a><ol><li><a href="#toc17" tabindex="0">よく使うプロパティ</a></li><li><a href="#toc18" tabindex="0">よく使うメソッド</a></li><li><a href="#toc19" tabindex="0">プロパティの使用例</a></li><li><a href="#toc20" tabindex="0">メソッドの使用例</a></li></ol></li><li><a href="#toc21" tabindex="0">VBA Rangeを使った実務活用パターン</a><ol><li><a href="#toc22" tabindex="0">パターン1: 表の見出し行を書式設定する</a></li><li><a href="#toc23" tabindex="0">パターン2: 特定の範囲のデータをクリアする</a></li><li><a href="#toc24" tabindex="0">パターン3: セル範囲を別シートにコピーする</a></li><li><a href="#toc25" tabindex="0">パターン4: Range(Cells, Cells)で動的に範囲を指定する</a></li><li><a href="#toc26" tabindex="0">パターン5: For EachでRangeをループ処理する</a></li></ol></li><li><a href="#toc27" tabindex="0">よくあるエラーと対処法</a><ol><li><a href="#toc28" tabindex="0">別シート操作時のエラーを防ぐコード</a></li><li><a href="#toc29" tabindex="0">Set忘れを防ぐコード</a></li></ol></li><li><a href="#toc30" tabindex="0">Cellsプロパティとの違い・使い分け</a></li><li><a href="#toc31" tabindex="0">まとめ</a><ol><li><a href="#toc32" tabindex="0">関連記事</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">VBA Rangeプロパティとは？</span></h2>



<p class="wp-block-paragraph">Rangeは、ワークシート上のセルやセル範囲を指定するためのプロパティです。</p>



<p class="wp-block-paragraph">指定したセルに対して値の読み書き・書式変更・コピー・削除ができます。VBAでExcelを動かすなら、ほぼ必ず使う基本中の基本です。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>Cellsプロパティでもセルを指定できます。どちらも取得するのは「Rangeオブジェクト」です。Rangeは文字列指定、Cellsは数値指定という違いがあります。</p></blockquote>



<h3 class="wp-block-heading"><span id="toc2">Rangeの基本構文</span></h3>



<pre class="wp-block-code"><code>'--- 単一セルを指定 ---
Range(&quot;A1&quot;)

'--- セル範囲を指定 ---
Range(&quot;A1:C10&quot;)

'--- シートを明示して指定 ---
ActiveSheet.Range(&quot;A1&quot;)
Worksheets(&quot;Sheet1&quot;).Range(&quot;A1&quot;)</code></pre>



<p class="wp-block-paragraph"><code>ActiveSheet.Range("A1")</code> の <code>ActiveSheet</code> は省略できます。ただし省略すると、別シートを操作するマクロで意図しないシートを参照することがあります。慣れないうちはシートを明示しましょう。</p>



<h2 class="wp-block-heading"><span id="toc3">VBA Rangeの基本的な使い方</span></h2>



<p class="wp-block-paragraph">ここからは、Rangeのセル指定パターンを1つずつ見ていきましょう。</p>



<h3 class="wp-block-heading"><span id="toc4">単一セルを指定する</span></h3>



<p class="wp-block-paragraph">1つのセルを指定するには、ダブルクォーテーションの中にセル番地を書きます。</p>



<pre class="wp-block-code"><code>Sub SingleCell()
    '--- A1セルに値を入力 ---
    Range(&quot;A1&quot;).Value = &quot;こんにちは&quot;
End Sub</code></pre>



<p class="wp-block-paragraph"><code>.Value</code> は省略しても動きます。ただし明示した方がコードの意図が伝わりやすいです。</p>



<h3 class="wp-block-heading"><span id="toc5">セル範囲を指定する</span></h3>



<p class="wp-block-paragraph">複数のセルをまとめて指定するには、コロン <code>:</code> で範囲を表します。</p>



<pre class="wp-block-code"><code>Sub CellRange()
    '--- A1からD8までの範囲を選択 ---
    Range(&quot;A1:D8&quot;).Select
End Sub</code></pre>



<p class="wp-block-paragraph">シート上でドラッグして選ぶ感覚と同じです。</p>



<h3 class="wp-block-heading"><span id="toc6">飛び飛びのセルを指定する</span></h3>



<p class="wp-block-paragraph">離れた複数のセルを指定するには、カンマ <code>,</code> で区切ります。</p>



<pre class="wp-block-code"><code>Sub NonContiguous()
    '--- 飛び飛びのセルを太字にする ---
    Range(&quot;A1,C3,E5&quot;).Font.Bold = True
End Sub</code></pre>



<p class="wp-block-paragraph">Excelで <code>Ctrl</code> を押しながらクリックして複数選択するのと同じイメージです。</p>



<h3 class="wp-block-heading"><span id="toc7">列全体・行全体を指定する</span></h3>



<p class="wp-block-paragraph">列や行をまるごと指定するには、列文字または行番号をコロンでつなぎます。</p>



<pre class="wp-block-code"><code>Sub EntireColumnAndRow()
    '--- A列全体を選択 ---
    Range(&quot;A:A&quot;).Select

    '--- A列からF列までを選択 ---
    Range(&quot;A:F&quot;).Select

    '--- 1行目全体を選択 ---
    Range(&quot;1:1&quot;).Select

    '--- 1行目から8行目までを選択 ---
    Range(&quot;1:8&quot;).Select
End Sub</code></pre>



<h3 class="wp-block-heading"><span id="toc8">名前定義されたセルを指定する</span></h3>



<p class="wp-block-paragraph">Excelの「名前の定義」で名前を付けたセル範囲は、Rangeから直接参照できます。</p>



<pre class="wp-block-code"><code>Sub NamedRange()
    '--- 名前定義「売上合計」を参照 ---
    Dim total As Double '合計金額
    total = Range(&quot;売上合計&quot;).Value

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



<p class="wp-block-paragraph">名前定義を使うとセル位置が変わってもコード修正が不要です。実務では積極的に活用したいテクニックですね。</p>



<h2 class="wp-block-heading"><span id="toc9">Offsetで隣接セルを参照する</span></h2>



<p class="wp-block-paragraph">基準セルから相対的にずらした位置を参照するのが Offset プロパティです。「A1から2行下・1列右」のような指定ができます。</p>



<h3 class="wp-block-heading"><span id="toc10">Offsetの構文と動作イメージ</span></h3>



<pre class="wp-block-code"><code>Range(&quot;基準セル&quot;).Offset(行方向, 列方向)</code></pre>



<figure class="wp-block-table"><table><thead><tr><th>引数</th><th>説明</th><th>既定値</th></tr></thead><tbody><tr><td>RowOffset</td><td>行方向のずらし幅（正=下、負=上）</td><td>0</td></tr><tr><td>ColumnOffset</td><td>列方向のずらし幅（正=右、負=左）</td><td>0</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">具体例を見てみましょう。</p>



<pre class="wp-block-code"><code>Sub OffsetDemo()
    '--- A1から2行下・1列右 → B3 ---
    Range(&quot;A1&quot;).Offset(2, 1).Value = &quot;ここはB3&quot;

    '--- C5から1行上 → C4 ---
    Range(&quot;C5&quot;).Offset(-1, 0).Value = &quot;ここはC4&quot;

    '--- A1から3列右（行方向は省略） → D1 ---
    Range(&quot;A1&quot;).Offset(, 3).Value = &quot;ここはD1&quot;
End Sub</code></pre>



<p class="wp-block-paragraph">片方の引数だけ指定すれば、もう一方は0として扱われます。行方向だけ、列方向だけのずらしも簡単です。</p>



<h3 class="wp-block-heading"><span id="toc11">Offsetの実務活用例</span></h3>



<p class="wp-block-paragraph">入力データの隣のセルに処理結果を書き込むパターンです。</p>



<pre class="wp-block-code"><code>Sub WriteResult()
    Dim lastRow As Long '最終行
    Dim i As Long       'ループカウンター

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

    For i = 2 To lastRow
        '--- A列の値を2倍にしてB列に書き込む ---
        Cells(i, 1).Offset(0, 1).Value = Cells(i, 1).Value * 2
    Next i
End Sub</code></pre>



<p class="wp-block-paragraph">Offsetを使えば「今見ているセルの隣」を直感的に参照できます。<a href="https://mashukabu.com/excel-vba-howto-use-for/">For文</a>と組み合わせると、行ごとの処理がスッキリ書けますよ。</p>



<h2 class="wp-block-heading"><span id="toc12">Resize・CurrentRegionで範囲を動的に操作する</span></h2>



<p class="wp-block-paragraph">Offsetが「位置をずらす」操作なら、Resizeは「範囲の大きさを変える」操作です。CurrentRegionは表全体を自動取得してくれます。</p>



<h3 class="wp-block-heading"><span id="toc13">Resizeの構文と動作イメージ</span></h3>



<pre class="wp-block-code"><code>Range(&quot;基準セル&quot;).Resize(行数, 列数)</code></pre>



<figure class="wp-block-table"><table><thead><tr><th>引数</th><th>説明</th><th>省略時</th></tr></thead><tbody><tr><td>RowSize</td><td>変更後の行数</td><td>元の行数を維持</td></tr><tr><td>ColumnSize</td><td>変更後の列数</td><td>元の列数を維持</td></tr></tbody></table></figure>



<pre class="wp-block-code"><code>Sub ResizeDemo()
    '--- A1を起点に5行3列の範囲を選択 ---
    Range(&quot;A1&quot;).Resize(5, 3).Select

    '--- A1:C1（1行3列）を5行に広げる ---
    Range(&quot;A1:C1&quot;).Resize(5).Select
End Sub</code></pre>



<p class="wp-block-paragraph">Resizeは起点（左上セル）を変えずにサイズだけ変更します。Offsetとは役割が違うので、セットで覚えておきましょう。</p>



<h3 class="wp-block-heading"><span id="toc14">CurrentRegionで表全体を取得する</span></h3>



<p class="wp-block-paragraph">CurrentRegionは、指定したセルを含む「空白行・空白列で囲まれた範囲」を自動取得するプロパティです。</p>



<pre class="wp-block-code"><code>Sub CurrentRegionDemo()
    Dim tbl As Range 'テーブル全体

    Set tbl = Range(&quot;A1&quot;).CurrentRegion

    MsgBox &quot;表の範囲: &quot; &amp; tbl.Address &amp; vbCrLf &amp; _
           &quot;行数: &quot; &amp; tbl.Rows.Count &amp; vbCrLf &amp; _
           &quot;列数: &quot; &amp; tbl.Columns.Count
End Sub</code></pre>



<p class="wp-block-paragraph">表の行数や列数が変わっても、つねに表全体を返してくれます。「データ件数が毎回違う」という場面で重宝するプロパティです。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>CurrentRegionは保護されたシートでは使用できません。シート保護を設定している場合は注意してください。</p></blockquote>



<h3 class="wp-block-heading"><span id="toc15">ヘッダー行を除いてデータ部分だけを操作する</span></h3>



<p class="wp-block-paragraph">実務では「見出し行を除いたデータ部分だけ」を処理したい場面が多いです。Offset と Resize を組み合わせると実現できます。</p>



<pre class="wp-block-code"><code>Sub DataWithoutHeader()
    Dim tbl As Range 'テーブル全体

    Set tbl = Range(&quot;A1&quot;).CurrentRegion

    '--- 1行下にずらして、行数を1つ減らす ---
    tbl.Offset(1, 0).Resize(tbl.Rows.Count - 1, _
        tbl.Columns.Count).ClearContents

    MsgBox &quot;データ部分をクリアしました&quot;
End Sub</code></pre>



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



<ol class="wp-block-list"><li><code>CurrentRegion</code> で見出し行を含む表全体を取得</li><li><code>Offset(1, 0)</code> で1行下にずらす（見出し行をスキップ）</li><li><code>Resize(行数 - 1)</code> で行数を1つ減らす（はみ出し防止）</li></ol>



<p class="wp-block-paragraph">このパターンはよく使うので、ぜひ覚えておいてください。</p>



<h2 class="wp-block-heading"><span id="toc16">VBA Rangeのプロパティとメソッド</span></h2>



<p class="wp-block-paragraph">Rangeで指定したセルに対して使える、主なプロパティとメソッドを紹介します。</p>



<h3 class="wp-block-heading"><span id="toc17">よく使うプロパティ</span></h3>



<figure class="wp-block-table"><table><thead><tr><th>プロパティ</th><th>説明</th><th>使用例</th></tr></thead><tbody><tr><td><code>.Value</code></td><td>セルの値を取得・設定</td><td><code>Range("A1").Value = 100</code></td></tr><tr><td><code>.Text</code></td><td>表示文字列を取得（読み取り専用）</td><td><code>MsgBox Range("A1").Text</code></td></tr><tr><td><code>.Formula</code></td><td>数式を取得・設定</td><td><code>Range("A1").Formula = "=SUM(B1:B10)"</code></td></tr><tr><td><code>.Font</code></td><td>フォント設定（色・太字・サイズ等）</td><td><code>Range("A1").Font.Bold = True</code></td></tr><tr><td><code>.Interior</code></td><td>セルの塗りつぶし</td><td><code>Range("A1").Interior.Color = vbYellow</code></td></tr><tr><td><code>.NumberFormat</code></td><td>表示形式</td><td><code>Range("A1").NumberFormat = "#,##0"</code></td></tr><tr><td><code>.Row</code> / <code>.Column</code></td><td>行番号・列番号を取得</td><td><code>MsgBox Range("C5").Row</code> → 5</td></tr><tr><td><code>.Address</code></td><td>セルのアドレスを取得</td><td><code>MsgBox Range("A1").Address</code> → $A$1</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><span id="toc18">よく使うメソッド</span></h3>



<figure class="wp-block-table"><table><thead><tr><th>メソッド</th><th>説明</th><th>使用例</th></tr></thead><tbody><tr><td><code>.Select</code></td><td>セルを選択</td><td><code>Range("A1").Select</code></td></tr><tr><td><code>.Copy</code></td><td>セルをコピー</td><td><code>Range("A1").Copy Range("B1")</code></td></tr><tr><td><code>.Clear</code></td><td>値・書式をすべて消去</td><td><code>Range("A1:C10").Clear</code></td></tr><tr><td><code>.ClearContents</code></td><td>値だけ消去（書式は残す）</td><td><code>Range("A1:C10").ClearContents</code></td></tr><tr><td><code>.Delete</code></td><td>セルを削除</td><td><code>Range("A1").Delete Shift:=xlUp</code></td></tr><tr><td><code>.AutoFill</code></td><td>オートフィル</td><td><code>Range("A1").AutoFill Range("A1:A10")</code></td></tr></tbody></table></figure>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP</strong></p><p><code>.Value2</code> は日付型や通貨型を経由せず、Doubleとしてそのまま返します。型変換が不要なぶん処理速度が速いので、大量データを扱うときは <code>.Value2</code> がおすすめです。</p></blockquote>



<h3 class="wp-block-heading"><span id="toc19">プロパティの使用例</span></h3>



<pre class="wp-block-code"><code>Sub PropertyDemo()
    '--- A1セルに値を入力 ---
    Range(&quot;A1&quot;).Value = &quot;売上データ&quot;

    '--- A1セルを太字+赤文字にする ---
    Range(&quot;A1&quot;).Font.Bold = True
    Range(&quot;A1&quot;).Font.Color = vbRed

    '--- B1セルに数式を入力 ---
    Range(&quot;B1&quot;).Formula = &quot;=SUM(B2:B10)&quot;

    '--- B1セルの表示形式を桁区切りにする ---
    Range(&quot;B1&quot;).NumberFormat = &quot;#,##0&quot;
End Sub</code></pre>



<h3 class="wp-block-heading"><span id="toc20">メソッドの使用例</span></h3>



<pre class="wp-block-code"><code>Sub MethodDemo()
    '--- A1:C10をコピーしてE1に貼り付け ---
    Range(&quot;A1:C10&quot;).Copy Range(&quot;E1&quot;)

    '--- A列の値だけクリア（書式は残す） ---
    Range(&quot;A:A&quot;).ClearContents
End Sub</code></pre>



<h2 class="wp-block-heading"><span id="toc21">VBA Rangeを使った実務活用パターン</span></h2>



<p class="wp-block-paragraph">基本を押さえたところで、実務で使える具体的なコードを見ていきましょう。</p>



<h3 class="wp-block-heading"><span id="toc22">パターン1: 表の見出し行を書式設定する</span></h3>



<pre class="wp-block-code"><code>Sub FormatHeader()
    Dim rngHeader As Range '見出し範囲

    Set rngHeader = Range(&quot;A1:E1&quot;)

    With rngHeader
        .Value = Array(&quot;日付&quot;, &quot;部署&quot;, &quot;品目&quot;, &quot;数量&quot;, &quot;金額&quot;)
        .Font.Bold = True
        .Interior.Color = RGB(68, 114, 196)
        .Font.Color = vbWhite
        .HorizontalAlignment = xlCenter
    End With
End Sub</code></pre>



<p class="wp-block-paragraph"><code>With</code> ステートメントを使うと、同じ範囲への操作をまとめて書けます。Range指定の繰り返しが不要になるので、コードが読みやすくなりますよ。</p>



<h3 class="wp-block-heading"><span id="toc23">パターン2: 特定の範囲のデータをクリアする</span></h3>



<p class="wp-block-paragraph">入力フォームのリセットボタンなどで使えるパターンです。</p>



<pre class="wp-block-code"><code>Sub ClearInputArea()
    '--- 入力エリア（B2:D20）の値だけクリア ---
    Range(&quot;B2:D20&quot;).ClearContents

    '--- カーソルを先頭に戻す ---
    Range(&quot;B2&quot;).Select

    MsgBox &quot;入力エリアをクリアしました&quot;
End Sub</code></pre>



<p class="wp-block-paragraph"><code>.ClearContents</code> なら罫線や色を残したまま値だけ消せます。<code>.Clear</code> だと書式ごと消えるので注意してください。</p>



<h3 class="wp-block-heading"><span id="toc24">パターン3: セル範囲を別シートにコピーする</span></h3>



<p class="wp-block-paragraph">データを別シートに転記する場面で使えるコードです。</p>



<pre class="wp-block-code"><code>Sub CopyToSheet()
    Dim wsFrom As Worksheet '転記元
    Dim wsTo As Worksheet   '転記先

    Set wsFrom = Worksheets(&quot;データ&quot;)
    Set wsTo = Worksheets(&quot;レポート&quot;)

    '--- A1:E20をレポートシートのA1に貼り付け ---
    wsFrom.Range(&quot;A1:E20&quot;).Copy wsTo.Range(&quot;A1&quot;)

    MsgBox &quot;コピーが完了しました&quot;
End Sub</code></pre>



<p class="wp-block-paragraph">別シートを操作するときはシートの明示が必須です。</p>



<h3 class="wp-block-heading"><span id="toc25">パターン4: Range(Cells, Cells)で動的に範囲を指定する</span></h3>



<p class="wp-block-paragraph">データの件数が変わっても対応できるよう、最終行を取得して範囲を動的に決めるパターンです。</p>



<pre class="wp-block-code"><code>Sub DynamicRange()
    Dim lastRow As Long '最終行

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

    '--- A1から最終行のC列までに罫線を引く ---
    Range(Cells(1, 1), Cells(lastRow, 3)).Borders.LineStyle = xlContinuous

    MsgBox &quot;罫線を引きました（&quot; &amp; lastRow &amp; &quot;行目まで）&quot;
End Sub</code></pre>



<p class="wp-block-paragraph"><code>Cells(Rows.Count, 1).End(xlUp).Row</code> は最終行取得の定番です。シートの最下行から上方向に検索して、最初にデータがあるセルの行番号を返します。<code>End</code> プロパティは Excelの <code>Ctrl + 矢印キー</code> と同じ動きです。<code>xlUp</code>（上方向）のほか <code>xlDown</code>・<code>xlToLeft</code>・<code>xlToRight</code> も指定できます。</p>



<p class="wp-block-paragraph">最終行の取得方法について詳しくは「<a href="https://mashukabu.com/excel-vba-howto-get-lastrow/">最終行を取得する3つの方法</a>」をチェックしてみてください。</p>



<p class="wp-block-paragraph"><code>Range(Cells(開始), Cells(終了))</code> の形なら、開始位置も終了位置も変数で制御できます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>Cellsは行番号・列番号を数値で指定するプロパティです。RangeとCellsの詳しい使い分けは「<a href="https://mashukabu.com/excel-vba-range-cells/">RangeとCellsの使い分け</a>」で解説しています。</p></blockquote>



<h3 class="wp-block-heading"><span id="toc26">パターン5: For EachでRangeをループ処理する</span></h3>



<p class="wp-block-paragraph">Range内のセルを1つずつ処理するには、For Each が便利です。</p>



<pre class="wp-block-code"><code>Sub HighlightNegative()
    Dim rng As Range  '対象範囲
    Dim cell As Range '個別セル

    Set rng = Range(&quot;B2:B20&quot;)

    For Each cell In rng
        '--- マイナスの値を赤文字にする ---
        If IsNumeric(cell.Value) Then
            If cell.Value &lt; 0 Then
                cell.Font.Color = vbRed
            End If
        End If
    Next cell
End Sub</code></pre>



<p class="wp-block-paragraph">For Each は「範囲内のセルを順番に取り出す」構文です。行番号を気にせず書けるのがメリットですね。</p>



<p class="wp-block-paragraph">For Each の詳しい使い方は「<a href="https://mashukabu.com/vba-howto-use-for-each-next/">For Eachでセル・シートを一括処理</a>」で解説しています。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP</strong></p><p>For Each の処理順序は「左から右、上から下（行優先）」が一般的です。ただし公式ドキュメントでは順序が保証されていません。順序が重要な処理では<a href="https://mashukabu.com/excel-vba-howto-use-for/">For文</a>を使いましょう。</p></blockquote>



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



<p class="wp-block-paragraph">Rangeで遭遇しやすいエラーをまとめました。</p>



<figure class="wp-block-table"><table><thead><tr><th>エラー</th><th>原因</th><th>対処法</th></tr></thead><tbody><tr><td>実行時エラー1004</td><td>別シートのRangeとCellsでシート指定が食い違っている</td><td><code>With</code> の中で <code>.Range(.Cells(...))</code> とドットを付ける</td></tr><tr><td>実行時エラー1004（Rangeメソッド失敗）</td><td>Range内の文字列が不正（全角文字混入など）</td><td>セル番地に全角文字がないか確認する</td></tr><tr><td>実行時エラー9</td><td>存在しないシート名を指定している</td><td>シート名のスペルを確認する</td></tr><tr><td>実行時エラー91</td><td>Range型変数に <code>Set</code> を付けずに代入</td><td><code>Set rng = Range("A1")</code> と書く</td></tr><tr><td>マクロが保存できない</td><td><code>.xlsx</code> 形式で保存しようとしている</td><td><code>.xlsm</code> 形式で保存する</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><span id="toc28">別シート操作時のエラーを防ぐコード</span></h3>



<p class="wp-block-paragraph">別シートのセルを操作するときに起きやすいエラー1004の正しい書き方です。</p>



<pre class="wp-block-code"><code>Sub CrossSheetExample()
    '--- エラーが起きるコード ---
    ' Sheets(&quot;Sheet2&quot;).Range(Cells(1, 1), Cells(10, 3)).Select
    '--- CellsがActiveSheetを参照してしまう ---

    '--- 正しいコード ---
    With Sheets(&quot;Sheet2&quot;)
        .Range(.Cells(1, 1), .Cells(10, 3)).Select
    End With
End Sub</code></pre>



<p class="wp-block-paragraph"><code>With</code> の中で <code>.Cells</code> とドットを付ければ、CellsもSheet2を参照するようになります。</p>



<h3 class="wp-block-heading"><span id="toc29">Set忘れを防ぐコード</span></h3>



<p class="wp-block-paragraph">Range型の変数に代入するときは <code>Set</code> が必須です。</p>



<pre class="wp-block-code"><code>Sub SetExample()
    Dim rng As Range '対象範囲

    '--- 正しい ---
    Set rng = Range(&quot;A1:C10&quot;)

    '--- エラーになる ---
    ' rng = Range(&quot;A1:C10&quot;)  ← Setがないとエラー
End Sub</code></pre>



<h2 class="wp-block-heading"><span id="toc30">Cellsプロパティとの違い・使い分け</span></h2>



<p class="wp-block-paragraph">Rangeと並んでよく使われるのがCellsプロパティです。</p>



<figure class="wp-block-table"><table><thead><tr><th>項目</th><th>Range</th><th>Cells</th></tr></thead><tbody><tr><td>指定方法</td><td>文字列（<code>"A1"</code> 形式）</td><td>数値（行番号, 列番号）</td></tr><tr><td>範囲指定</td><td><code>Range("A1:C10")</code> で直接指定</td><td>単体では1セルのみ</td></tr><tr><td>名前定義</td><td><code>Range("売上合計")</code> で対応</td><td>非対応</td></tr><tr><td>変数との相性</td><td>文字列結合が必要</td><td>数値を直接渡せる</td></tr><tr><td>ループ処理</td><td>やや書きにくい</td><td>行・列を変数で制御しやすい</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">使い分けのポイントは次のとおりです。</p>



<ul class="wp-block-list"><li><strong>固定のセル範囲</strong> → Range</li><li><strong>名前定義の参照</strong> → Range</li><li><strong>変数でセル位置を動かす</strong> → Cells</li><li><strong>ループ処理</strong> → Cells</li><li><strong>動的な範囲指定</strong> → Range(Cells, Cells) の組み合わせ</li></ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP</strong></p><p>迷ったら「固定範囲はRange、ループはCells」と覚えておけばOKです。詳しくは「<a href="https://mashukabu.com/excel-vba-range-cells/">RangeとCellsの使い分け</a>」をチェックしてみてください。</p></blockquote>



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



<p class="wp-block-paragraph">VBA Rangeプロパティの使い方を振り返りましょう。</p>



<ul class="wp-block-list"><li><strong>Range(&#8220;A1&#8221;)</strong> で単一セル、<strong>Range(&#8220;A1:C10&#8221;)</strong> で範囲を指定</li><li>行全体は <strong>Range(&#8220;1:1&#8221;)</strong>、列全体は <strong>Range(&#8220;A:A&#8221;)</strong></li><li><strong>Offset</strong> で基準セルからの相対位置を参照</li><li><strong>Resize</strong> で範囲サイズを動的に変更</li><li><strong>CurrentRegion</strong> で表全体を自動取得</li><li><strong>Range(Cells, Cells)</strong> で動的な範囲指定</li><li>別シートの操作は <strong>シートオブジェクトを明示</strong></li><li>Range型変数への代入は <strong>Set</strong> を忘れずに</li></ul>



<p class="wp-block-paragraph">Rangeはセル操作の出発点です。Offset・Resize・CurrentRegionまで使いこなせると、データ件数に左右されない柔軟なマクロが書けるようになります。ぜひVBEを開いて試してみてください。</p>



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



<ul class="wp-block-list"><li><a href="https://mashukabu.com/excel-vba-range-cells/">RangeとCellsの使い分け</a></li><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-howto-get-lastrow/">最終行を取得する3つの方法</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-use-do-loop/">Do Loopの使い方</a></li><li><a href="https://mashukabu.com/excel-vba-option-explicit/">Option Explicitで変数宣言を強制する方法</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-worksheetfunction/">WorksheetFunctionの使い方</a></li><li><a href="https://mashukabu.com/excel-vba-variable-explanation/">変数の使い方とルール</a></li><li><a href="https://mashukabu.com/excel-vba-macro-difference/">VBAとマクロの違い</a></li><li><a href="https://mashukabu.com/excel-vba-like-wildcard/">Like演算子の使い方</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/excel-vba-howto-use-range/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>VBA RangeとCellsの違いと使い分け｜実務シナリオ別に選び方を解説</title>
		<link>https://mashukabu.com/excel-vba-range-cells/</link>
					<comments>https://mashukabu.com/excel-vba-range-cells/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Fri, 11 Feb 2022 14:30:39 +0000</pubDate>
				<category><![CDATA[VBA・マクロ]]></category>
		<category><![CDATA[1004エラー]]></category>
		<category><![CDATA[Cells]]></category>
		<category><![CDATA[For Each]]></category>
		<category><![CDATA[Range]]></category>
		<category><![CDATA[Resize]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[セル指定]]></category>
		<category><![CDATA[ループ処理]]></category>
		<category><![CDATA[使い分け]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=1024</guid>

					<description><![CDATA[VBAのRangeとCellsの違いと使い分けを実務シナリオ別に解説。For文・For Eachループ、Offset・Resizeとの組み合わせ、Range(Cells,Cells)の動的範囲指定、1004エラーの原因と対処まで、コード例つきでわかりやすく説明します。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Excel VBAでセルを操作するとき、RangeとCellsのどちらを使うか迷いませんか。</p>



<p class="wp-block-paragraph">書き方がまったく違うので、「結局どっちが正解なの？」と手が止まりがちですよね。使い分けを間違えると、ループ処理でセル番地の文字列結合が必要になったり、別シート操作で1004エラーに悩まされたりします。</p>



<p class="wp-block-paragraph">この記事では、RangeとCellsの違いを比較表で整理し、実務シナリオごとの選び方をお伝えします。Offset・Resizeとの組み合わせやFor Eachでのループ処理も取り上げるので、読み終わるころには「この場面ならこっち」と迷わず選べるようになりますよ。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>VBAを初めて触る方は、先に「<a href="https://mashukabu.com/excel-vba-vbe-menu-explanation/">VBE画面の見方</a>」をチェックしておくとスムーズです。</p></blockquote>




  <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">RangeとCellsの違いを一覧でおさらい</a><ol><li><a href="#toc2" tabindex="0">Range：アドレス直書きでわかりやすい</a></li><li><a href="#toc3" tabindex="0">Cells：行番号・列番号で指定できる</a></li></ol></li><li><a href="#toc4" tabindex="0">VBA Cellsを使うべき場面</a><ol><li><a href="#toc5" tabindex="0">For文でループするとき</a></li><li><a href="#toc6" tabindex="0">行列を動的に計算したいとき</a></li></ol></li><li><a href="#toc7" tabindex="0">VBA Rangeを使うべき場面</a><ol><li><a href="#toc8" tabindex="0">セルアドレスが固定のとき</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とRangeの基本パターン</a></li><li><a href="#toc12" tabindex="0">For EachとCellsの使い分け</a></li><li><a href="#toc13" tabindex="0">For Eachで実務に使えるパターン：条件に合うセルを集計</a></li></ol></li><li><a href="#toc14" tabindex="0">Offset・Resizeで基準セルからの相対指定</a><ol><li><a href="#toc15" tabindex="0">Offset：基準セルから行・列をずらす</a></li><li><a href="#toc16" tabindex="0">Resize：範囲のサイズを変更する</a></li><li><a href="#toc17" tabindex="0">Offset + Resize の組み合わせ：ヘッダーを除外する実例</a></li></ol></li><li><a href="#toc18" tabindex="0">Range(Cells, Cells)の組み合わせ技</a><ol><li><a href="#toc19" tabindex="0">基本構文</a></li><li><a href="#toc20" tabindex="0">開始・終了行を動的に変える実例</a></li></ol></li><li><a href="#toc21" tabindex="0">実務シナリオ別の選択ガイド</a><ol><li><a href="#toc22" tabindex="0">一覧表を上から順に処理する</a></li><li><a href="#toc23" tabindex="0">For Eachで条件付き書式を動的に適用する</a></li><li><a href="#toc24" tabindex="0">可変範囲をまるごとコピーする</a></li><li><a href="#toc25" tabindex="0">集計行をループの外に固定する</a></li><li><a href="#toc26" tabindex="0">シナリオ別まとめ表</a></li></ol></li><li><a href="#toc27" tabindex="0">1004エラーの原因と対処法</a><ol><li><a href="#toc28" tabindex="0">Worksheetオブジェクトの明示</a></li><li><a href="#toc29" tabindex="0">OffsetやResizeでも同じ原則</a></li></ol></li><li><a href="#toc30" tabindex="0">まとめ：迷ったときの使い分け早見表</a><ol><li><a href="#toc31" tabindex="0">関連記事</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">RangeとCellsの違いを一覧でおさらい</span></h2>



<p class="wp-block-paragraph">まず結論から整理しましょう。RangeとCellsはどちらも「セルを指定する方法」ですが、得意な場面が違います。</p>



<figure class="wp-block-table"><table><thead><tr><th>比較項目</th><th>Range</th><th>Cells</th></tr></thead><tbody><tr><td>書き方</td><td><code>Range("A1")</code></td><td><code>Cells(1, 1)</code></td></tr><tr><td>指定方法</td><td>アドレス文字列</td><td>行番号・列番号（数値）</td></tr><tr><td>複数セル範囲</td><td><code>Range("A1:C10")</code> で直接指定</td><td>単体では1セルのみ</td></tr><tr><td>名前付き範囲</td><td><code>Range("売上合計")</code> で参照可</td><td>非対応</td></tr><tr><td>変数との相性</td><td>文字列結合が必要</td><td>数値をそのまま渡せる</td></tr><tr><td>ループ処理</td><td>For Eachと好相性</td><td>For文カウンターと好相性</td></tr><tr><td>Offset/Resize</td><td>両方で使える</td><td>両方で使える</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">ひとことで言えば、「文字列で指定するか、数値で指定するか」の違いです。この違いが使い分けの根拠になっています。</p>



<h3 class="wp-block-heading"><span id="toc2">Range：アドレス直書きでわかりやすい</span></h3>



<p class="wp-block-paragraph">RangeはExcelシート上の「A1」形式をそのまま使えます。普段のExcel操作と同じ感覚なので、直感的に読み書きできるのが強みです。</p>



<pre class="wp-block-code"><code>' 1つのセルに値を入力
Range(&quot;A1&quot;).Value = &quot;こんにちは&quot;

' 範囲をまとめて太字にする
Range(&quot;A1:C10&quot;).Font.Bold = True

' 離れたセルを一括指定
Range(&quot;A1,C3,E5&quot;).Font.Color = vbRed</code></pre>



<p class="wp-block-paragraph">Rangeの詳しい使い方は「<a href="https://mashukabu.com/excel-vba-howto-use-range/">VBA Rangeの使い方</a>」でも解説しています。</p>



<h3 class="wp-block-heading"><span id="toc3">Cells：行番号・列番号で指定できる</span></h3>



<p class="wp-block-paragraph">Cellsは行と列を数値で指定します。「Cells(行, 列)」の形で、列もアルファベットではなく数字で書くのがポイントです。</p>



<pre class="wp-block-code"><code>' A1セル（1行目・1列目）に値を入力
Cells(1, 1).Value = &quot;こんにちは&quot;

' B3セル（3行目・2列目）に値を入力
Cells(3, 2).Value = 100</code></pre>



<p class="wp-block-paragraph">数値だけで指定するので、変数と組み合わせやすいのが最大の強みです。</p>



<h2 class="wp-block-heading"><span id="toc4">VBA Cellsを使うべき場面</span></h2>



<p class="wp-block-paragraph">Cellsが本領を発揮するのは、セルの位置を動的に変えたいときです。</p>



<h3 class="wp-block-heading"><span id="toc5">For文でループするとき</span></h3>



<p class="wp-block-paragraph">Cellsの最大の強みは、変数をそのまま行番号に渡せることです。</p>



<pre class="wp-block-code"><code>' A列の1行目〜10行目に連番を入力
Dim i As Long
For i = 1 To 10
    Cells(i, 1).Value = i
Next i</code></pre>



<p class="wp-block-paragraph">同じ処理をRangeで書くとこうなります。</p>



<pre class="wp-block-code"><code>' Rangeだと文字列結合が必要
Dim i As Long
For i = 1 To 10
    Range(&quot;A&quot; &amp; i).Value = i
Next i</code></pre>



<p class="wp-block-paragraph">動きは同じですが、<code>"A" & i</code> と文字列結合が入ります。列も変数にしたい場合はさらに複雑になるので、ループ処理ではCellsがおすすめです。</p>



<p class="wp-block-paragraph">For文の書き方をもっと知りたい方は「<a href="https://mashukabu.com/excel-vba-howto-use-for/">VBA For文の使い方</a>」もチェックしてみてください。</p>



<h3 class="wp-block-heading"><span id="toc6">行列を動的に計算したいとき</span></h3>



<p class="wp-block-paragraph">行も列も変数で動かしたい場合、Cellsの数値指定が活きます。</p>



<pre class="wp-block-code"><code>' 5×5の掛け算表を作る
Dim r As Long  ' 行カウンター
Dim c As Long  ' 列カウンター
For r = 1 To 5
    For c = 1 To 5
        Cells(r, c).Value = r * c
    Next c
Next r</code></pre>



<p class="wp-block-paragraph">二重ループとの相性は抜群です。Rangeでこれをやると、列番号をアルファベットに変換する処理が必要になり、かなり面倒になります。</p>



<p class="wp-block-paragraph">変数（<code>Dim</code>）の宣言ルールが気になる方は「<a href="https://mashukabu.com/excel-vba-variable-explanation/">変数の使い方とルール</a>」を参照してください。宣言を強制する<a href="https://mashukabu.com/excel-vba-option-explicit/">Option Explicit</a>もあわせて覚えておくと安心ですよ。</p>



<h2 class="wp-block-heading"><span id="toc7">VBA Rangeを使うべき場面</span></h2>



<p class="wp-block-paragraph">一方、Rangeが適しているのは「セルの位置が決まっている」場面です。</p>



<h3 class="wp-block-heading"><span id="toc8">セルアドレスが固定のとき</span></h3>



<p class="wp-block-paragraph">操作対象が固定セルなら、Rangeが読みやすいです。</p>



<pre class="wp-block-code"><code>' 決まったセル範囲をクリアする
Range(&quot;A1:D1&quot;).ClearContents

' ヘッダー行を太字にする
Range(&quot;A1:F1&quot;).Font.Bold = True</code></pre>



<p class="wp-block-paragraph">「A1:D1」とそのまま書けるので、コードを読んだ人がすぐに対象範囲を把握できます。可読性の高さがRangeの大きなメリットです。</p>



<h3 class="wp-block-heading"><span id="toc9">名前付き範囲を指定するとき</span></h3>



<p class="wp-block-paragraph">Excelで名前を定義している場合、Rangeから直接参照できます。</p>



<pre class="wp-block-code"><code>' 名前定義「売上合計」の値を取得
Dim total As Long
total = Range(&quot;売上合計&quot;).Value</code></pre>



<p class="wp-block-paragraph">名前付き範囲はCellsでは参照できません。名前定義を使う場面ではRangeの一択になります。</p>



<p class="wp-block-paragraph">セルの位置が変わってもコードを修正しなくて済むので、実務ではとても便利ですよ。なお、RangeやCellsで取得した値をExcel関数で処理したい場合は「<a href="https://mashukabu.com/excel-vba-howto-use-worksheetfunction/">WorksheetFunctionの使い方</a>」もあわせてチェックしてみてください。</p>



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



<p class="wp-block-paragraph">For Each文を使うと、Range内の各セルを1つずつ取り出して処理できます。「何行目か」を自分で管理しなくていいので、コードがシンプルになるのが魅力です。</p>



<h3 class="wp-block-heading"><span id="toc11">For EachとRangeの基本パターン</span></h3>



<pre class="wp-block-code"><code>Sub 空欄セルに初期値を入れる()
    Dim cell As Range
    For Each cell In Range(&quot;B2:B20&quot;)
        If cell.Value = &quot;&quot; Then
            cell.Value = 0
        End If
    Next cell
End Sub</code></pre>



<p class="wp-block-paragraph"><code>For Each cell In Range(...)</code> と書くだけで、範囲内のセルを上から順に処理してくれます。行番号を管理する <code>i</code> 変数が不要なので、コードの見通しがよくなります。</p>



<p class="wp-block-paragraph">For Each文の詳しい使い方は「<a href="https://mashukabu.com/vba-howto-use-for-each-next/">For Eachの使い方</a>」で解説しています。</p>



<h3 class="wp-block-heading"><span id="toc12">For EachとCellsの使い分け</span></h3>



<p class="wp-block-paragraph">For EachとFor文（Cells）のどちらを選ぶかは、「処理中に行番号が必要かどうか」で決まります。</p>



<pre class="wp-block-code"><code>' ケース1: 行番号が不要 → For Each がシンプル
Sub 負の値を赤くする()
    Dim cell As Range
    For Each cell In Range(&quot;C2:C100&quot;)
        If cell.Value &lt; 0 Then
            cell.Font.Color = vbRed
        End If
    Next cell
End Sub

' ケース2: 行番号を使って別列に書き込む → For + Cells が便利
Sub 判定結果を隣の列に出力する()
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, 3).End(xlUp).Row

    Dim i As Long
    For i = 2 To lastRow
        If Cells(i, 3).Value &gt;= 80 Then
            Cells(i, 4).Value = &quot;合格&quot;
        Else
            Cells(i, 4).Value = &quot;不合格&quot;
        End If
    Next i
End Sub</code></pre>



<p class="wp-block-paragraph">「同じセルだけ触る処理」ならFor Each、「隣の列や別のセルにも書き込む処理」ならFor + Cellsと覚えておくと迷いません。</p>



<h3 class="wp-block-heading"><span id="toc13">For Eachで実務に使えるパターン：条件に合うセルを集計</span></h3>



<p class="wp-block-paragraph">実務でよくあるのが、範囲内のセルを条件でフィルタしながら集計するパターンです。</p>



<pre class="wp-block-code"><code>Sub 部門別の売上を集計する()
    Dim cell As Range
    Dim totalSales As Long

    ' A列が「営業部」の行だけ、B列の金額を合計
    For Each cell In Range(&quot;A2:A50&quot;)
        If cell.Value = &quot;営業部&quot; Then
            totalSales = totalSales + cell.Offset(0, 1).Value
        End If
    Next cell

    Range(&quot;D1&quot;).Value = &quot;営業部合計&quot;
    Range(&quot;E1&quot;).Value = totalSales
End Sub</code></pre>



<p class="wp-block-paragraph">ここで使っている <code>Offset</code> については、次のセクションで詳しく説明します。</p>



<h2 class="wp-block-heading"><span id="toc14">Offset・Resizeで基準セルからの相対指定</span></h2>



<p class="wp-block-paragraph">RangeやCellsで取得したセルを「起点」として、そこから相対的に位置をずらしたり範囲を広げたりできます。これがOffsetとResizeです。</p>



<h3 class="wp-block-heading"><span id="toc15">Offset：基準セルから行・列をずらす</span></h3>



<p class="wp-block-paragraph"><code>Offset(行方向, 列方向)</code> で、基準セルからの相対位置を指定します。</p>



<pre class="wp-block-code"><code>' A1セルから2行下・1列右 → B3セル
Range(&quot;A1&quot;).Offset(2, 1).Value = &quot;ここはB3&quot;

' 現在のセルの1つ右に値を入力
Cells(5, 1).Offset(0, 1).Value = &quot;B5に入力&quot;</code></pre>



<p class="wp-block-paragraph">行方向の正の値は下、負の値は上。列方向の正の値は右、負の値は左です。</p>



<p class="wp-block-paragraph">Offsetが特に活躍するのは、For Eachループの中で隣のセルにアクセスするときです。</p>



<pre class="wp-block-code"><code>Sub 単価と数量から金額を計算する()
    Dim cell As Range
    ' B列（単価）をループして、C列（数量）と掛けた結果をD列に出力
    For Each cell In Range(&quot;B2:B20&quot;)
        If cell.Value &lt;&gt; &quot;&quot; Then
            cell.Offset(0, 2).Value = cell.Value * cell.Offset(0, 1).Value
        End If
    Next cell
End Sub</code></pre>



<p class="wp-block-paragraph">For Eachでは行番号を直接持たないので、「隣のセル」「2列右のセル」にアクセスするにはOffsetが必須です。この組み合わせは実務で非常によく使います。</p>



<h3 class="wp-block-heading"><span id="toc16">Resize：範囲のサイズを変更する</span></h3>



<p class="wp-block-paragraph"><code>Resize(行数, 列数)</code> で、基準セルから指定した大きさの範囲を作ります。</p>



<pre class="wp-block-code"><code>' A1セルを起点に、5行3列の範囲を選択
Range(&quot;A1&quot;).Resize(5, 3).Select

' ヘッダー行を除いたデータ範囲を取得
Dim dataRange As Range
Set dataRange = Range(&quot;A1&quot;).Resize(10, 4)  ' A1:D10</code></pre>



<p class="wp-block-paragraph">Resizeは「データの先頭セルはわかっているが、範囲の大きさを動的に決めたい」ときに重宝します。</p>



<h3 class="wp-block-heading"><span id="toc17">Offset + Resize の組み合わせ：ヘッダーを除外する実例</span></h3>



<p class="wp-block-paragraph">OffsetとResizeを組み合わせると、「ヘッダー行をスキップしてデータ範囲だけ取得する」といった実務的な操作が1行で書けます。</p>



<pre class="wp-block-code"><code>Sub ヘッダーを除いてデータ範囲に色をつける()
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row

    ' A1から始まるテーブルのヘッダーを除外して色付け
    ' Offset(1, 0) で1行下にずらし、Resize(lastRow - 1, 4) でデータ行分の範囲を確保
    Range(&quot;A1&quot;).Offset(1, 0).Resize(lastRow - 1, 4).Interior.Color = RGB(230, 240, 255)
End Sub</code></pre>



<p class="wp-block-paragraph">ちょっとむずかしく見えますが、やっていることはシンプルです。Offset(1, 0) でA2に移動し、Resize(lastRow &#8211; 1, 4) でA2からデータ最終行までの4列分を取得しています。</p>



<p class="wp-block-paragraph">Offset・Resizeの詳しい使い方は「<a href="https://mashukabu.com/excel-vba-howto-use-range/">VBA Rangeの使い方</a>」でも解説しています。</p>



<h2 class="wp-block-heading"><span id="toc18">Range(Cells, Cells)の組み合わせ技</span></h2>



<p class="wp-block-paragraph">RangeとCellsは組み合わせて使えます。これを覚えると、動的な範囲指定がぐっと楽になります。</p>



<h3 class="wp-block-heading"><span id="toc19">基本構文</span></h3>



<p class="wp-block-paragraph"><code>Range(Cells(開始行, 開始列), Cells(終了行, 終了列))</code> の形で書きます。</p>



<pre class="wp-block-code"><code>' A1からE10までを選択
Range(Cells(1, 1), Cells(10, 5)).Select</code></pre>



<p class="wp-block-paragraph">開始位置も終了位置も数値で制御できるのがポイントです。固定範囲にはRange単体、動的範囲にはこの組み合わせと覚えておきましょう。</p>



<h3 class="wp-block-heading"><span id="toc20">開始・終了行を動的に変える実例</span></h3>



<p class="wp-block-paragraph">実務で最もよく使うのが、最終行を取得して動的に範囲を決めるパターンです。</p>



<pre class="wp-block-code"><code>Sub 動的範囲に罫線を引く()
    ' A列の最終行を取得
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row

    ' A1から最終行のC列まで罫線を引く
    Range(Cells(1, 1), Cells(lastRow, 3)).Borders.LineStyle = xlContinuous
End Sub</code></pre>



<p class="wp-block-paragraph"><code>Cells(Rows.Count, 1).End(xlUp).Row</code> でA列の一番下から上に向かって最終行を探しています。データの件数が増減しても自動で対応できるので、実務では非常に重宝します。</p>



<p class="wp-block-paragraph">最終行の取得方法をもっと詳しく知りたい方は「<a href="https://mashukabu.com/excel-vba-howto-get-lastrow/">最終行を取得する3つの方法</a>」もどうぞ。</p>



<p class="wp-block-paragraph">もうひとつ、可変範囲をコピーする実例も見てみましょう。</p>



<pre class="wp-block-code"><code>Sub データ範囲をコピーして貼り付ける()
    Dim lastRow As Long
    Dim lastCol As Long

    ' データの最終行・最終列を取得
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    lastCol = Cells(1, Columns.Count).End(xlToLeft).Column

    ' データ範囲をまるごとコピー
    Range(Cells(1, 1), Cells(lastRow, lastCol)).Copy

    ' Sheet2のA1に貼り付け
    Sheets(&quot;Sheet2&quot;).Range(&quot;A1&quot;).PasteSpecial xlPasteValues
    Application.CutCopyMode = False
End Sub</code></pre>



<p class="wp-block-paragraph">最終行だけでなく最終列も動的に取得すれば、列が増えても自動で対応できます。</p>



<h2 class="wp-block-heading"><span id="toc21">実務シナリオ別の選択ガイド</span></h2>



<p class="wp-block-paragraph">ここまでの内容を、よくある実務シナリオで整理しましょう。</p>



<h3 class="wp-block-heading"><span id="toc22">一覧表を上から順に処理する</span></h3>



<p class="wp-block-paragraph">請求書データや社員名簿を1行ずつ処理するパターンです。</p>



<pre class="wp-block-code"><code>Sub 一覧表を順に処理する()
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row

    Dim i As Long
    For i = 2 To lastRow  ' 2行目から（1行目はヘッダー）
        ' B列が空欄ならスキップ
        If Cells(i, 2).Value &lt;&gt; &quot;&quot; Then
            ' D列に計算結果を入力
            Cells(i, 4).Value = Cells(i, 2).Value * Cells(i, 3).Value
        End If
    Next i
End Sub</code></pre>



<p class="wp-block-paragraph">行を変数 <code>i</code> で動かすので<strong>Cells一択</strong>です。「<a href="https://mashukabu.com/excel-vba-howto-use-for/">For文</a>」と「<a href="https://mashukabu.com/vba-howto-use-for-each-next/">For Each</a>」のどちらでもCellsが活躍します。条件分岐の詳しい書き方は「<a href="https://mashukabu.com/excel-vba-conditional-branch-explanation/">VBA If文の使い方</a>」も参考にしてみてください。</p>



<h3 class="wp-block-heading"><span id="toc23">For Eachで条件付き書式を動的に適用する</span></h3>



<p class="wp-block-paragraph">For Eachを使えば、セルの値に応じて書式を変えるといった処理もシンプルに書けます。</p>



<pre class="wp-block-code"><code>Sub 売上達成状況に色をつける()
    Dim cell As Range
    For Each cell In Range(&quot;D2:D50&quot;)
        Select Case True
            Case cell.Value &gt;= 1000000
                cell.Interior.Color = RGB(198, 239, 206)  ' 緑（達成）
            Case cell.Value &gt;= 500000
                cell.Interior.Color = RGB(255, 235, 156)  ' 黄（もう少し）
            Case Else
                cell.Interior.Color = RGB(255, 199, 206)  ' 赤（未達）
        End Select
    Next cell
End Sub</code></pre>



<p class="wp-block-paragraph">行番号を使わず「セルそのもの」を操作するだけなので、For Eachが最適です。Select Caseの詳しい書き方は「<a href="https://mashukabu.com/excel-vba-howto-use-select-case/">Select Caseの使い方</a>」もチェックしてみてください。</p>



<h3 class="wp-block-heading"><span id="toc24">可変範囲をまるごとコピーする</span></h3>



<p class="wp-block-paragraph">データの最終行・最終列が変わる範囲を一括操作するパターンです。</p>



<pre class="wp-block-code"><code>Sub 可変範囲を書式設定する()
    Dim lastRow As Long
    Dim lastCol As Long
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    lastCol = Cells(1, Columns.Count).End(xlToLeft).Column

    ' データ範囲全体に背景色をつける
    Range(Cells(2, 1), Cells(lastRow, lastCol)).Interior.Color = RGB(230, 240, 255)
End Sub</code></pre>



<p class="wp-block-paragraph"><strong>Range(Cells, Cells)の組み合わせ</strong>が最適です。開始・終了を変数で制御しつつ、範囲全体をまとめて操作できます。</p>



<h3 class="wp-block-heading"><span id="toc25">集計行をループの外に固定する</span></h3>



<p class="wp-block-paragraph">ヘッダーや集計行など、位置が固定のセルを操作するパターンです。</p>



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

    ' ループ部分はCells
    Dim total As Long
    Dim i As Long
    For i = 2 To lastRow
        total = total + Cells(i, 3).Value
    Next i

    ' 固定セルへの書き込みはRange
    Range(&quot;A1&quot;).Value = &quot;集計結果&quot;
    Range(&quot;B1&quot;).Value = total
End Sub</code></pre>



<p class="wp-block-paragraph"><strong>ループ内はCells、固定セルはRange</strong>と使い分けるのがスマートです。コードの意図が明確になり、後から読んでも何をしているか一目でわかります。</p>



<h3 class="wp-block-heading"><span id="toc26">シナリオ別まとめ表</span></h3>



<figure class="wp-block-table"><table><thead><tr><th>シナリオ</th><th>おすすめ</th><th>理由</th></tr></thead><tbody><tr><td>一覧を上から順に処理</td><td>Cells + For文</td><td>行番号を変数で動かす</td></tr><tr><td>範囲内のセルを一括処理</td><td>Range + For Each</td><td>行番号管理が不要でシンプル</td></tr><tr><td>可変範囲を一括操作</td><td>Range(Cells, Cells)</td><td>動的な開始・終了を範囲指定</td></tr><tr><td>固定セルへの読み書き</td><td>Range</td><td>アドレス直書きで可読性が高い</td></tr><tr><td>名前付き範囲の参照</td><td>Range</td><td>Cellsでは名前定義を参照できない</td></tr><tr><td>二重ループ（行×列）</td><td>Cells</td><td>行列ともに数値で制御できる</td></tr><tr><td>隣のセルにアクセス</td><td>Offset</td><td>For Each内で行番号なしに隣接セルを操作</td></tr><tr><td>動的な範囲サイズ変更</td><td>Resize</td><td>基準セルから任意サイズの範囲を作成</td></tr></tbody></table></figure>



<h2 class="wp-block-heading"><span id="toc27">1004エラーの原因と対処法</span></h2>



<p class="wp-block-paragraph">RangeとCellsの組み合わせで最もハマりやすいのが、実行時エラー1004（「アプリケーション定義またはオブジェクト定義のエラー」）です。</p>



<h3 class="wp-block-heading"><span id="toc28">Worksheetオブジェクトの明示</span></h3>



<p class="wp-block-paragraph">このエラーは、別シートのCellsをRange引数に渡すときに起きます。</p>



<pre class="wp-block-code"><code>' エラーになるコード
Sheets(&quot;Sheet2&quot;).Range(Cells(1, 1), Cells(10, 3)).Select</code></pre>



<p class="wp-block-paragraph">一見すると正しく見えますが、問題があります。<code>Range</code> は Sheet2 を指していますが、<code>Cells</code> はアクティブシートを指しています。シートの参照先がバラバラなのでエラーになるのです。</p>



<p class="wp-block-paragraph">正しくはこう書きます。</p>



<pre class="wp-block-code"><code>' 正しいコード：Withでシートを統一する
With Sheets(&quot;Sheet2&quot;)
    .Range(.Cells(1, 1), .Cells(10, 3)).Select
End With</code></pre>



<p class="wp-block-paragraph">ポイントは <code>.Range</code> と <code>.Cells</code> の先頭にドット（<code>.</code>）をつけることです。ドットをつけると、Withで指定したSheet2のプロパティとして認識されます。</p>



<p class="wp-block-paragraph">ドットを1つでも忘れるとエラーになるので注意してください。</p>



<p class="wp-block-paragraph">もうひとつ、シートを変数に入れて書く方法もあります。</p>



<pre class="wp-block-code"><code>' 変数でシートを指定する方法
Dim ws As Worksheet
Set ws = Sheets(&quot;Sheet2&quot;)
ws.Range(ws.Cells(1, 1), ws.Cells(10, 3)).Select</code></pre>



<p class="wp-block-paragraph">どちらの書き方でもOKです。大事なのは「Range・Cells・すべてのシート参照を揃える」ことです。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>1004エラーは実行時に発生するため、コードを書いた時点では気づけません。別シートを操作するコードを書いたら、必ずテスト実行して確認しましょう。</p></blockquote>



<h3 class="wp-block-heading"><span id="toc29">OffsetやResizeでも同じ原則</span></h3>



<p class="wp-block-paragraph">Offset・Resizeを使う場合もシート参照を揃える必要があります。</p>



<pre class="wp-block-code"><code>' NGパターン：シート参照が混在
Sheets(&quot;Sheet2&quot;).Range(&quot;A1&quot;).Offset(1, 0).Resize(10, 3).Value = &quot;&quot;

' OKパターン：Withで統一
With Sheets(&quot;Sheet2&quot;)
    .Range(&quot;A1&quot;).Offset(1, 0).Resize(10, 3).Value = &quot;&quot;
End With</code></pre>



<p class="wp-block-paragraph">Offset・Resizeは基準セルのシートを引き継ぐので、基準となるRange/Cellsのシート指定さえ正しければ問題ありません。Withブロックを使う習慣をつけておくと安全です。</p>



<h2 class="wp-block-heading"><span id="toc30">まとめ：迷ったときの使い分け早見表</span></h2>



<p class="wp-block-paragraph">RangeとCellsの使い分けを最終確認しましょう。</p>



<figure class="wp-block-table"><table><thead><tr><th>やりたいこと</th><th>使うもの</th><th>書き方の例</th></tr></thead><tbody><tr><td>固定セルに値を入れる</td><td>Range</td><td><code>Range("A1").Value = 100</code></td></tr><tr><td>名前付き範囲を参照</td><td>Range</td><td><code>Range("売上合計").Value</code></td></tr><tr><td>ループで行を動かす</td><td>Cells</td><td><code>Cells(i, 1).Value</code></td></tr><tr><td>行列ともに変数で動かす</td><td>Cells</td><td><code>Cells(r, c).Value</code></td></tr><tr><td>範囲内のセルを一括処理</td><td>For Each + Range</td><td><code>For Each cell In Range("A1:A10")</code></td></tr><tr><td>隣のセルにアクセス</td><td>Offset</td><td><code>cell.Offset(0, 1).Value</code></td></tr><tr><td>動的なサイズの範囲を作る</td><td>Resize</td><td><code>Range("A2").Resize(lastRow, 4)</code></td></tr><tr><td>動的範囲を一括操作</td><td>Range + Cells</td><td><code>Range(Cells(1,1), Cells(lastRow,3))</code></td></tr><tr><td>別シートのセルを操作</td><td>With + ドット付き</td><td><code>.Range(.Cells(1,1), .Cells(10,3))</code></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">判断に迷ったら、次の順番で考えてみてください。</p>



<ol class="wp-block-list"><li>名前付き範囲を使う？ → <strong>Range</strong></li><li>セルの位置が固定？ → <strong>Range</strong></li><li>範囲内を順に処理（行番号不要）？ → <strong>For Each + Range</strong></li><li>変数で位置を動かす？ → <strong>Cells</strong></li><li>動的な範囲指定？ → <strong>Range(Cells, Cells)</strong></li><li>基準セルから相対的にずらす？ → <strong>Offset / Resize</strong></li></ol>



<p class="wp-block-paragraph">どちらが正解ということではなく、場面で使い分けるのがベストです。VBAに慣れてくると、これらを自然に組み合わせて使えるようになりますよ。</p>



<p class="wp-block-paragraph">ぜひVBEを開いて、両方のコードを試してみてくださいね。VBA全体の学習順序に迷ったら「<a href="https://mashukabu.com/excel-vba-learning-roadmap/">VBA学習の順番ガイド</a>」も参考にしてください。</p>



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



<ul class="wp-block-list"><li><a href="https://mashukabu.com/excel-vba-howto-use-range/">VBA Rangeの使い方</a></li><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-howto-get-lastrow/">最終行を取得する3つの方法</a></li><li><a href="https://mashukabu.com/excel-vba-conditional-branch-explanation/">VBA 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-use-do-loop/">Do Loopの使い方</a></li><li><a href="https://mashukabu.com/excel-vba-vbe-menu-explanation/">VBE画面の見方</a></li><li><a href="https://mashukabu.com/excel-vba-option-explicit/">Option Explicitで変数宣言を強制する方法</a></li><li><a href="https://mashukabu.com/excel-vba-variable-explanation/">変数の使い方とルール</a></li><li><a href="https://mashukabu.com/excel-vba-howto-use-worksheetfunction/">WorksheetFunctionの使い方</a></li><li><a href="https://mashukabu.com/excel-vba-learning-roadmap/">VBA学習の順番ガイド</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/excel-vba-range-cells/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
