VBA Range VS Cells セル範囲の指定方法、使えるのはどっち

vbarangevscellseyecatch

セルの範囲指定で使うプロパティRangeとCells。その時の気分で使い分けていることはありませんか?
本当は、使い方にはしっかりした理由があります。

こんにちは じゅんぱ店長 (@junpa33) です。

セル範囲の指定方法は、一番のベースとなるのがRangeとCellsを使った方法です。

エクセルVBAのすべての基礎となるコードと言っても過言ではないRangeとCellsですが、

今回はその基本機能の一つとしてのセル範囲の指定についてになります。

「Range」VS「Cells」

エクセルVBAでは、エクセルシート上のセルを扱う時にRangeとCellsという名前をよく目にします。

セル範囲をVBAコードで扱う上でも、このRangeとCellsの区別は何かを知っておくことは重要です。

使い分けが必要になります。

「セル」というオブジェクト

Excelの構成要素の最も重要な要素として、ワークブック、ワークシートと並んで「セル」というオブジェクト(本体、主体、物体)があります。

「セル」オブジェクトをVBAで言うとそれは、「Rangeオブジェクト」と言います。Cellsオブジェクトではありません。

そして、そのRangeオブジェクトをまな板の上にのせて料理していく包丁として、

「Rangeプロパティ」と「Cellsプロパティ」という、エクセルVBAの幹ともいえるプロパティがあります。

RangeプロパティとCellsプロパティ 一番の違い

Rangeは、「1つのセルだけでなく複数のセル」を取り扱うことが出来る。

Cellsは、「1つのセルか全セル」という2つのパターンしか取り扱うことが出来ない。

というのが、最大にして最も重要な違いになります。

「セル」を範囲選択するのは2つのプロパティ

この2つのRangeプロパティとCellsプロパティを使って自在にセルを範囲選択していくことが出来ます。

逆に、どちらが欠けてしまうと上手く選択できなくなります。順に説明していきます。

RangeプロパティとCellsプロパティの基本の記述方法

Rangeプロパティの記述方法(構文)

Rangeでセル参照を指定する記述は、

Rangeの構文

  • 対象のオブジェクト.Range(セル参照)

対象のオブジェクトは、Application、WorksheetやRangeのいずれかになります。

省略した場合は、アクティブシートが指定されたとみなされます。

セル参照は、そのセルがある番地という意味です。(原則的にセル参照表示はダブルクォーテーションで囲む)

Cellsプロパティの記述方法(構文)

Cellsでセル参照を指定する方法は

Cellsの構文

  • 対象のオブジェクト.Cells.(行番号,列番号)

対象のオブジェクトは、Application、WorksheetやRangeのいずれかになります。

省略した場合は、アクティブシートが指定されたとみなされます。

ちなみに、「列」の指定方法としてRangeと同じようにアルファベットを使うことも許されています。

RangeとCells 記述方法の違いによる利用用途

Rangeプロパティの記述方法は、セル参照で、列名をAからのアルファベットで記述することになります。

非常に直観的に理解しやすい記述方法になっています。けれども、アルファベット表記はVBAコード的には、順に変化していく変数としては設計しずらいものになっています。

Cellsプロパティの記述方法は、行番号と列番号を数値で表示する方法になります。

こちらは、2つの数値でセル位置を指定できるので、セル位置を順に移動させていく、変数を使ったコード設計にも非常に都合が良いということになります。

つまり、

セル範囲が、確定・固定している場合の範囲指定方法で有れば、Rangeプロパティが直観的にも都合がよく。

セル範囲が移動しながら処理を行っていく変数を使ったコード処理が必要な場合はCellsプロパティが良いということです。

ただ1つのセルを指定範囲とする場合

サンプルとしてセルB3とF15をそれぞれ1つセルだけの範囲として指定します。

セルB3とは3行目のB列(2番目の列)のセル、セルF15とは15行目のF列(6番目の列)のセルということです。

Rangeプロパティを使う

セルB3は、・・・・Range(“B3”)

セルF15は、・・・・Range(“F15”)

となります。

Cellsプロパティを使う

セルB3は、・・・・Cells(3,2)

セルF15は、・・・・Cells(15,6)

となります。Rangeの様にダブルクォーテーションは使いません。

複数のセルを指定範囲とする場合

複数のセルで範囲の指定を行います。

サンプルとしてセルB3からF15までの範囲を指定します。

(「3行目から15行目」と「B列からF列」の交差しているエリアです)

Rangeプロパティを使う

範囲を指定するためには、その範囲の始まりのセルと終わりのセルで指定をします。

Rangeでの指定範囲の構文

  • 対象のオブジェクト.Range(始まりのセル参照,終わりのセル参照)

今回のサンプルでの記述では、(対象のオブジェクトは省略していますので)

セルB3からセルF15の範囲指定は、・・・・Range(”B3″,”F15″)

となります。

書き方的に少々面倒くさいので、同じ意味の記述方法として、

Range(“B3:F15”)という書き方が一般的です。セル参照同士をコロン(:)で挟みダブルクォーテーションで囲みます。

Range(“B3:F15”).Select

Cellsプロパティを使う

注意

Cellsプロパティは、セルの範囲を指定する機能はありません。

先にも言いましたが、Cellsで範囲指定することは出来ません。

でもそれは、

「Cells(始点のセル,終点のセル)は無い」ということです。

ですが、セル範囲の指定に関わることは可能です。

むしろ、VBAで変数を扱う時は必須の技術となります。

今回のサンプルで、Cellsプロパティを利用して範囲指定する記述方法は、

Range(Cells(3,2),cells(15,6))

と記述できます。

Cellsは単独のセルを指定できる

この単独のセルは、セルの指定範囲の「始まりのセル」「終わりのセル」でもあるからです。

Cellsを利用した指定範囲の構文

  • 対象のオブジェクト.Range( Cells ( 始まりの行,始まりの列 ) ,Cells ( 終わりの行,終わりの列 ) )
vbarangecell001
Range(Cells(3,2),cells(15,6)).Select

複数個所のセル範囲を指定する場合

複数あるセルの範囲を同時に指定する

複数あるセル範囲が、連続で有っても非連続であってもRangeプロパティなら関係はありません。

先ほどのセル範囲の「B3からF15」に加えて「A1」「H2からH5」「C17からE18」のそれぞれのセル範囲を同時に指定します。

Rangeプロパティを使う

セル範囲の「B3からF15」は、・・・・Range(“B3:F15”)

セル範囲の「A1」は、・・・・・・・・Range(“A1”)

セル範囲の「H2からH5」は、・・・・・Range(“H2:H5”)

セル範囲の「C17からE18」は、・・・・Range(“C17:E18”)

この4つのセルの範囲を同時に指定する記述は、

・・・・Range(“B3:F15,A1,H2:H5,C17:E18”)

となります。

Range(“B3:F15,A1,H2:H5,C17:E18”).Select

間違ってもこのように書いてはいけません。コードエラーになります。Range(“B3:F15″,”A1″,”H2:H5″,”C17:E18”)

間違い防止のために、Rangeの括弧()内に書けるダブルクォーテーションで囲むセル参照は2つまでと覚えておきましょう。

2つのセル範囲を含む拡大したセル範囲を指定する

セル範囲の「A1」「B3からF15」の両方を含む拡大したセル範囲を指定します。

(元の指定範囲は、説明上分かりやすくするために「黄色」表示をしています。)

Rangeプロパティを使う

  1. セル範囲の「A1」「B3からF15」の両方を含む拡大したセル範囲を指定します。
  2. セル範囲の「H2からH5」「C17からE18」の両方を含む拡大したセル範囲を指定します。

①セル範囲の「A1」「B3からF15」の場合

セル範囲の「B3からF15」は、・・・・Range(“B3:F15”)

セル範囲の「A1」は、・・・・・・・・Range(“A1”)

2つのセル範囲の拡張セル範囲指定の記述は

Range(“A1″,”B3:F15”)

となります。

Range(“A1″,”B3:F15”).Select

②セル範囲「H2からH5」「C17からE18」の場合

セル範囲の「H2からH5」は、・・・・・Range(“H2:H5”)

セル範囲の「C17からE18」は、・・・・Range(“C17:E18”)

2つのセル範囲の拡張セル範囲指定の記述は

Range(“H2:H5″,”C17:E18”)

となります。

Range(“H2:H5″,”C17:E18”).Select

行全体や列全体、全てのセルを指定範囲とする場合

行や列の範囲を指定するには、「Rowsプロパティ」「Columnsプロパティ」を利用することが出来ます。ケースによっての使い分けが必要になります。

関連記事

Rowsプロパティについてはこの記事を参考にしてください

vbarowseyecatch VBA Rowsプロパティの範囲選択と関連のメソッド

行全体や列全体の範囲を指定する

Rangeプロパティを使う

範囲を指定するのはRangeプロパティを使用します。

たとえば、

セル範囲の2行目全体は、・・・・Range(“2:2”)

Rowsプロパティを使って記述すると、Rows(2) となります。

セル範囲のD列全体は、・・・・Range(“D:D”)

Columnsプロパティを使って記述すると、Columns(4) または Columns(“D”) となります。

セル範囲の2行目から3行目全体は、・・・・Range(“2:3”)

Rowsプロパティを使って記述すると、Rows(“2:3”) となります。

セル範囲のD列からG列全体は、・・・・Range(“D:G”)

Columnsプロパティを使って記述すると、Columns(“D:G”) となります。

セル範囲の2行目から3行目と5行目全体は、・・・・Range(“2:3,5:5”)

Rowsで連続していない範囲を同時に指定することは出来ません。

Rangeプロパティを使わずに、どうしてもRowsもColumnsを使って範囲指定したい場合は、

「Unionメソッド」を利用することになります。

Range(“2:3,5:5”).Select

セル範囲のB列とD列からG列全体は、・・・・Range(“B:B,D:G”)

Columnsで連続していない範囲を同時に指定することは出来ません。

Rangeプロパティを使わずに、どうしてもRowsもColumnsを使って範囲指定したい場合は、

「Unionメソッド」を利用することになります。

Range(“B:B,D:G”).Select

セル範囲の中で行や列の範囲を指定する

Rangeなどで指定した範囲内で更にその中での行列を指定する場合は、絶対参照(ワークシートのセルA1から始まるセル番地)ではなく、相対参照(指定範囲の左上端セルの番地をセルA1と見立ててセル番地を指定する)必要があります。

この「セル範囲の中で行や列の範囲を指定」する場合では、Rangeプロパティを利用することは「あまり上手な選択ではない」ということは言えます。

Rowsプロパティ、Columnsプロパティの方が有用です。

Rangeプロパティを使う

すでにあるセル範囲の中でのRangeプロパティを使っての行と列を指定する方法です。

セル範囲「B3からF15」の中で行や列を範囲指定します。

たとえば、

セル範囲の中の2行目全体は、・・・・Range(“B3:F15”).Range(“A2:E2”)

Rowsプロパティを使って記述すると、Range(“B3:F15”).Rows(2) となります。

Range(“B3:F15”).Range(“A2:E2”).Select

セル範囲の中の3列目全体は、・・・・Range(“B3:F15”).Range(“C1:C13”)

Columnssプロパティを使って記述すると、Range(“B3:F15”).Columns(3) となります。

Range(“B3:F15”).Range(“C1:C13”).Select

セル範囲の中の2行目から3行目全体は、・・・・Range(“B3:F15”).Range(“A2:E3”)

Rowsプロパティを使って記述すると、Range(“B3:F15”).Rows(“2:3”) となります。

Range(“B3:F15”).Range(“A2:E3”).Select

セル範囲の3列目から4列目全体は、・・・・Range(“B3:F15”).Range(“C1:D13”)

Columnssプロパティを使って記述すると、Range(“B3:F15”).Columns(“C:D”) となります。

Range(“B3:F15”).Range(“C1:D13”).Select

すべてのセル範囲を指定する

Cellsプロパティを使う

1枚のワークシート上のすべてのセルを選択します。

全てのセルを範囲指定する構文

  • 対象のオブジェクト.Cells

ただ、「Cells」と記述するだけです。

「Range」VS「Cells」のまとめ

Rangeプロパティは、単独セルから、複数セルの範囲指定までマルチに使用することが出来ます。

Cellsプロパティは、全てのセルか、または単独セルの指定しかできません。

では、Rangeプロパティの方が優れているかというとそういうわけでもなく、実際の利用上ははっきり役割分担されています。Cellsプロパティがなければ、VBAコードを組み立てるのにこの上なく苦労することになります。

VBAでは変数を使ってセル番地を変化させながらコード処理していくことが普通にあり、

「数値によりセル位置を動かすことの出来るCellsプロパティ利用」は必須の技術になっています。

単独セルを含めたセルの範囲指定は、セルに対して行う操作の一番最初に行うことで最も基本的なことになります。

「どのセルに対して何を行う。」の「どのセル」に当たる部分です。これが出来なければすべてが始まらないということになります。

そういったことで、Rangeオブジェクト、Rangeプロパティ、Cellsプロパティは、VBAを使っていく上では必ず使えるようにならないといけない項目になります。

エクセルVBAの独習には動画学習という方法もあります。 目と耳両方を使って学習することでさらに勉強効率を上げることもできます。

Udemy1eyecatch エクセルVBA初級者がUdemyで動画学習する講座おすすめ5選と無料講座の上手な使い方。

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch002 エクセルVBAを独学で習得する!ために大切な7つのポイントを解説します

今回の記事はここまでです。   最後までご覧いただき有難うございました。

<記事内容についての告知>VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。