セルの範囲指定で使うプロパティRangeとCells。その時の気分で使い分けていることはありませんか?
本当は、使い方にはしっかりした理由があります。
こんにちは じゅんぱ店長 (@junpa33) です。
セル範囲の指定方法は、一番のベースとなるのがRangeとCellsを使った方法です。
エクセルVBAのすべての基礎となるコードと言っても過言ではないRangeとCellsですが、
今回はその基本機能の一つとしてのセル範囲の指定についてになります。
- セルの範囲選択
- Range VS Cells !VBAで使えるのはどっち
- セルの範囲選択と設定は14のツールで対応する
- Rowsプロパティの働きと関連のメソッド
- Columnsプロパティでセルの列を指定する
- EntireRowとRowプロパティの違い
- EntireColumnとColumnの使い方
- Offsetプロパティは指定範囲を移動させる
- Resizeプロパティでセル範囲をサイズ変更
- CurrentRegionは連続データをまとめて掴む
- UnionとRangeの一括選択の働きを比較
- SpecialCellsメソッドはセル検索し選択する
- UsedRangeプロパティの使い方のコツ
- Endプロパティで上下左右の最終セルを取得
- データ入力済セルの最終行番号を取得する
コンテンツ
「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(セル参照)
対象のオブジェクトは、Application、WorksheetやRangeのいずれかになります。
省略した場合は、アクティブシートが指定されたとみなされます。
セル参照は、そのセルがある番地という意味です。(原則的にセル参照表示はダブルクォーテーションで囲む)
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プロパティを使う
となります。
Cellsプロパティを使う
となります。Rangeの様にダブルクォーテーションは使いません。
複数のセルを指定範囲とする場合
複数のセルで範囲の指定を行います。
サンプルとしてセルB3からF15までの範囲を指定します。
(「3行目から15行目」と「B列からF列」の交差しているエリアです)
Rangeプロパティを使う
範囲を指定するためには、その範囲の始まりのセルと終わりのセルで指定をします。
対象のオブジェクト.Range(始まりのセル参照,終わりのセル参照)
今回のサンプルでの記述では、(対象のオブジェクトは省略していますので)
セルB3からセルF15の範囲指定は、・・・・Range(”B3″,”F15″)
となります。
書き方的に少々面倒くさいので、同じ意味の記述方法として、
Range(“B3:F15”)という書き方が一般的です。セル参照同士をコロン(:)で挟みダブルクォーテーションで囲みます。
Cellsプロパティを使う
先にも言いましたが、Cellsで範囲指定することは出来ません。
でもそれは、
「Cells(始点のセル,終点のセル)は無い」ということです。
ですが、セル範囲の指定に関わることは可能です。
むしろ、VBAで変数を扱う時は必須の技術となります。
今回のサンプルで、Cellsプロパティを利用して範囲指定する記述方法は、
Range(Cells(3,2),cells(15,6))
と記述できます。
Cellsは単独のセルを指定できる。
この単独のセルは、セルの指定範囲の「始まりのセル」と「終わりのセル」でもあるからです。
対象のオブジェクト.Range( Cells ( 始まりの行,始まりの列 ) ,Cells ( 終わりの行,終わりの列 ) )
複数個所のセル範囲を指定する場合
複数あるセルの範囲を同時に指定する
複数あるセル範囲が、連続で有っても非連続であってもRangeプロパティなら関係はありません。
先ほどのセル範囲の「B3からF15」に加えて「A1」「H2からH5」「C17からE18」のそれぞれのセル範囲を同時に指定します。
Rangeプロパティを使う
・・・・Range(“B3:F15,A1,H2:H5,C17:E18”)
となります。
間違ってもこのように書いてはいけません。コードエラーになります。Range(“B3:F15″,”A1″,”H2:H5″,”C17:E18”)
間違い防止のために、Rangeの括弧()内に書けるダブルクォーテーションで囲むセル参照は2つまでと覚えておきましょう。
2つのセル範囲を含む拡大したセル範囲を指定する
セル範囲の「A1」「B3からF15」の両方を含む拡大したセル範囲を指定します。
(元の指定範囲は、説明上分かりやすくするために「黄色」表示をしています。)
Rangeプロパティを使う
- セル範囲の「A1」「B3からF15」の両方を含む拡大したセル範囲を指定します。
- セル範囲の「H2からH5」「C17からE18」の両方を含む拡大したセル範囲を指定します。
セル範囲の「B3からF15」は、・・・・Range(“B3:F15”)
セル範囲の「A1」は、・・・・・・・・Range(“A1”)
2つのセル範囲の拡張セル範囲指定の記述は
Range(“A1″,”B3:F15”)
となります。
セル範囲の「H2からH5」は、・・・・・Range(“H2:H5”)
セル範囲の「C17からE18」は、・・・・Range(“C17:E18”)
2つのセル範囲の拡張セル範囲指定の記述は
Range(“H2:H5″,”C17:E18”)
となります。
行全体や列全体、全てのセルを指定範囲とする場合
行や列の範囲を指定するには、「Rowsプロパティ」「Columnsプロパティ」を利用することが出来ます。ケースによっての使い分けが必要になります。
行全体や列全体の範囲を指定する
Rangeプロパティを使う
範囲を指定するのはRangeプロパティを使用します。
たとえば、
Rowsプロパティを使って記述すると、Rows(2) となります。
Columnsプロパティを使って記述すると、Columns(4) または Columns(“D”) となります。
Rowsプロパティを使って記述すると、Rows(“2:3”) となります。
Columnsプロパティを使って記述すると、Columns(“D:G”) となります。
Rowsで連続していない範囲を同時に指定することは出来ません。
Rangeプロパティを使わずに、どうしてもRowsもColumnsを使って範囲指定したい場合は、
「Unionメソッド」を利用することになります。
Columnsで連続していない範囲を同時に指定することは出来ません。
Rangeプロパティを使わずに、どうしてもRowsもColumnsを使って範囲指定したい場合は、
「Unionメソッド」を利用することになります。
セル範囲の中で行や列の範囲を指定する
Rangeなどで指定した範囲内で更にその中での行列を指定する場合は、絶対参照(ワークシートのセルA1から始まるセル番地)ではなく、相対参照(指定範囲の左上端セルの番地をセルA1と見立ててセル番地を指定する)必要があります。
この「セル範囲の中で行や列の範囲を指定」する場合では、Rangeプロパティを利用することは「あまり上手な選択ではない」ということは言えます。
Rowsプロパティ、Columnsプロパティの方が有用です。
Rangeプロパティを使う
すでにあるセル範囲の中でのRangeプロパティを使っての行と列を指定する方法です。
セル範囲「B3からF15」の中で行や列を範囲指定します。
たとえば、
Rowsプロパティを使って記述すると、Range(“B3:F15”).Rows(2) となります。
Columnssプロパティを使って記述すると、Range(“B3:F15”).Columns(3) となります。
Rowsプロパティを使って記述すると、Range(“B3:F15”).Rows(“2:3”) となります。
Columnssプロパティを使って記述すると、Range(“B3:F15”).Columns(“C:D”) となります。
すべてのセル範囲を指定する
Cellsプロパティを使う
1枚のワークシート上のすべてのセルを選択します。
対象のオブジェクト.Cells
ただ、「Cells」と記述するだけです。
「Range」VS「Cells」のまとめ
Rangeプロパティは、単独セルから、複数セルの範囲指定までマルチに使用することが出来ます。
Cellsプロパティは、全てのセルか、または単独セルの指定しかできません。
では、Rangeプロパティの方が優れているかというとそういうわけでもなく、実際の利用上ははっきり役割分担されています。Cellsプロパティがなければ、VBAコードを組み立てるのにこの上なく苦労することになります。
VBAでは変数を使ってセル番地を変化させながらコード処理していくことが普通にあり、
「数値によりセル位置を動かすことの出来るCellsプロパティ利用」は必須の技術になっています。
単独セルを含めたセルの範囲指定は、セルに対して行う操作の一番最初に行うことで最も基本的なことになります。
「どのセルに対して何を行う。」の「どのセル」に当たる部分です。これが出来なければすべてが始まらないということになります。
そういったことで、Rangeオブジェクト、Rangeプロパティ、Cellsプロパティは、VBAを使っていく上では必ず使えるようにならないといけない項目になります。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。