VBA入門
第11回.RangeとCellsの使い方

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
最終更新日:2020-09-26

第11回.RangeとCellsの使い方


VBA Range Cells


VBAではセルを指定する方法としてRangeCellsがあります、


RangeもCellsも、どちらもRangeオブジェクトでセルを指定するものです。

どちらを使ったらよいのでしょうか、
どう使い分けたらよいのでしょうか、

実際のマクロVBA記述では、RangeとCellsを使い分ける必要があります、
RangeとCellsの使い方・使い分け方について解説をします。

以下で、基本的な使い分け方から、使用する場面に応じての実際の書き方を見ていきましょう。

RangeとCellsの基本的な使い分け方

Rangeを使うのは

・固定位置のセルの場合
・セル範囲(複数セル)の場合
・名前定義を使う時

以上のいずれかになります。
単一セル(1つの)セルの指定で変数を使う場合は、Cellsを使うようにします。

Cellsを使うのは

単一(1つの)セルを指定する場合

複数セルであるセル範囲や名前定義をCellsで指定することはできません。

固定セル(固定位置)の指定

最初に書いたように、固定位置で条件によって変化する事が無い場合は、

Range("B2")
Range("A1:C5")
Range("1:5")
Range("A:C")

このように書けば良いでしょう。

また、名前定義を使って、
Range("名前定義の名前")
この名前定義を使う場合は、Rangeでしか指定できません。

Rangeに変数は使わないようにします

時々、こんな書き方を見かけます、

Range("A" & i)
iは変数で、数値が入っている訳ですが、
(変数については、次回に説明します。)

このような使い方は極力避けましょう。
使ってはダメだという事でもないのですが、あまり良い書き方ではありません。

そして、実行速度もほんの僅かではありますが遅くなります。
つまり、このような記述をする特段の理由が見当たらないという事になります。
Cellsがあるのですから、基本的にはこれを使うようにしましょう。

とはいえ、
Rangeに変数を使う場面として、これならありかなという場面としては
繰り返し処理の中ではなく、範囲の最後が変数に入っているような場合でしょうか。
変数の、lastRowに最後の行数が入っているとして、その範囲に何か設定するような場合。

Cellsを使うと、
Range(Cells(2, 1), Cells(lastRow, 1)) = ""
Range(Cells(2, 3), Cells(lastRow, 3)) = ""

Rangeだけで書くと、
Range("A1:A" & lastRow) = ""
Range("C1:C" & lastRow) = ""

これなら、どちらもありだとは思います。
特に、後々に出てきますがRangeやCellsにシート指定をするようになると、
Rangeで書くほうが記述がかなり短く済むので使っても良いと思います。
ただしこの場合でも、実はResizeプロパティを覚えると、もっと簡単に記述することができるようになります。
Resizeプロパティは、指定されたセル範囲(Rangeオブジェクト)のサイズを変更します、そして、サイズが変更されたセル範囲(Rangeオブジェクト)を返します。サイズ変更は、縦方向の行数、横方向の列数の両方またはどちらか一方を指定できます。
したがって、Rangeで変数を使う事はVBAの学習が進めばなくなってくるものと思います。

1つの(VBAで位置を変化させる)セルを指定する場合

VBAで位置を変化させるような1つのセルを指定する場合の書き方の基本は、

Cells(行, 列)

このように書いて下さい。
列は、数字だけでなく、列記号も使えます。

Cells(5, 3)
Cells(5, "C")

どちらで書いても同じC5セルになります。

※上記では固定数値で書いていますが、マクロVBAではこの数値部分を変数で指定する場合が多くなります。

変数 ijに数値が入っているとして、
Cells(i, 3)
Cells(i, j)
このように書きます。

セル範囲(複数セル)を指定する場合

セル範囲(複数セル)の場合の書き方の基本は、

Range(始点セル, 終点セル)
この、始点セルと終点セルに、Cellsを指定します。
Range(Cells(行, 列), Cells(行, 列))
このように書きます。

例えば、
A1セルからA5セルなら
Range(Cells(1, 1), Cells(5, 1))
A1セルからC1セルなら
Range(Cells(1, 1), Cells(1, 3))
A1セルからC5セルなら
Range(Cells(1, 1), Cells(5, 3))
このようになります。

※上記では固定数値で書いていますが、マクロVBAではこの数値部分を変数で指定する場合が多くなります。

変数 i に数値が入っているとして、
Range(Cells(1, 1), Cells(i, 1))
Range(Cells(1, 1), Cells(1, i))
このように書きます。

複数行全体、複数列全体の指定

複数行の場合、1行から5行なら、
Range(Rows(1), Rows(5))

複数列の場合、1列(A列)から3列(C列)なら、
Range(Columns(1), Columns(3))
このように指定します。

※上記では固定数値で書いていますが、マクロVBAではこの数値部分を変数で指定する場合が多くなります。

変数 i に数値が入っているとして、
Range(Rows(1), Rows(i))
Range(Columns(1), Columns(i))
このように書きます。

RangeとCellsの使い分け方のまとめ

RangeとCellsの使い分け方については、
セル範囲と名前定義の場合はRangeを使う、それ以外はCellsを使う。
これが基本になります。

別の言い方をすれば、
変数を使う時はCells、Rows、Columnsを使用すると言う事です。

RangeとCellsの基本の関連記事

RangeとCellsは、VBAの基本中の基本であり、これが理解できなければVBAは何も始まりません。
これから多くのRange、Cellsに関することを説明していきますので順に学んで行ってください。

第8回.セルに文字を入れるとは(Range,Value)
前回実行したマクロを、もう少し詳しく見てみましょう。どうして、これでセルに値がはいるのか、どうやってVBAを読んだらよいのか、少しだけ詳しく解説します。とにかくこれで、A1セルに、「おはよう!」と入る事がわかりました。
第9回.Rangeでのセルの指定方法
前回までに出てきたRangeの使い方は、Range("A1") このように書くことで1つのセルを指定する場合でした。複数のセル範囲を指定する場合、矩形のセル範囲、行全体、列全体、特殊なセル範囲 これらの指定方法を見ていきましょう。複数のセル(矩形のセル範囲) 複数のセル(矩形のセル範囲)を指定する場合のVBAの書き方です。
第10回.Range以外の指定方法(Cells,Rows,Columns)
Rangeの指定で、あらゆるセルおよびセル範囲は指定できるのですが、マクロで使う場合は、ちょっと使いづらい場合があります。"A1"や"B5"と言うような文字で指定するのでは何かと不便です、もっと、プログラムっぽい(笑)指定方法があります。

第31回.セルの書式(表示形式,NumberFormatLocal)
セルは表示形式を指定することで、セルに入っている値は同じ値でも色々な見え方をさせる事が出来ます。セルの値はそのままで、見た目だけをユーザーに見やすい形にすることが出来ます。同じ数値の、12345でも 12345、12,345、\12,345 等々の違う表示方法を指定する事が出来ます。
第32回.セルの書式(配置,Alignment)
セル内での値を表示する位置(縦位置、横位置)をマクロVBAで指定できます。「セルの書式設定」→「配置」で指定する内容です。マクロVBAでの配置の指定 Range.プロパティ=設定値 指定できるプロパティの設定値は以下になります。
第33回.セルの書式(フォント,Font)
セルで表示している文字の書体をマクロVBAで指定する方法です。セル(Rangeオブジェクト)のフォントは、Fontプロパティになります。Fontプロパティは、Fontオブシェクトを返します。解りづらい説明だと思います。
第34回.セルの書式(塗りつぶし,Interior)
セルを目立たせる最も有効な手段は、セルを色で塗りつぶすことでしょう、セルを塗りつぶす時のマクロVBAの解説です。セル(Rangeオブジェクト)の塗りつぶし(パターン)は、Interiorプロパティになります。Interiorプロパティは、Interiorオブシェクトを返します。
第35回.セルの書式(罫線,Border)
VBAで罫線を引く必要が出てくる場合も度々あります、シートのデータ範囲がマクロで変更されてしまう場合は、罫線を引き直す事が必要になってきます。ネット等を検索すると、罫線を引くマクロは書き方が千差万別となっているようです。そして、マクロの記録を使用して作成したVBAコードをそのまま使っている最悪のケースも散見されます。
第38回.セルに計算式を設定(Formula)
セルに計算式(関数)を設定する場合のマクロVBAになります。マクロでは、セルに計算式を設定することは、そんなに多くないと思いますが、決して使わないわけではありません。しかし、この計算式の設定には何種類ものプロパティがあり、結構やっかいなのです。

第39回.セルのクリア(Clear)
セルをクリアするマクロVBAの書き方です、クリアするといっても、セルの何を(値、色、コメント等々)クリアするかによって、VBAコードが違ってきます。具体的には、セルの何を(値、色、コメント等々)クリアするかによって使用するメソッドが変わるという事です。
第40回.セルのコピー・カット&ペーストCopy,Cut,Paste)
あるセルをコピーまたはカットして、別のセルに貼り付けるVBAの説明です。セルを同じシートの別のセルにコピーしたり、セルを別のシートにコピーしたりするVBAになります。手作業で、セルをコピー(Ctrl+C)またはカット(Ctrl+X)して、他のセルに貼り付け(Ctrl+V後にESCまたはEnter) これと同じ動作をするVBAになります。
第41回.セルのコピー&値の貼り付け(PasteSpecial)
値の貼り付けと題しましたが、値だけではなく、「形式を選択して貼り付け」のいろいろな指定方法です。セルをコピーして、他のセルに「形式を選択して貼り付け」する場合のマクロVBAコードです。セルの値や書式を別のセルにコピーすることはマクロVBAでは定番かつ必須の技術になります。
第42回.セルをコピーするとは
セルをコピーするとは、どういう事でしょうか… セルをコピーするというマクロVBAを少し掘り下げて考えることで、より実践的なマクロVBAコードを書くことが出来るようになります。コピーと一言で言っているものは、何のコピーを指しているのでしょうか。

第82回.Rangeのプロパティ(Resize)
Resizeプロパティは、指定されたセル範囲(Rangeオブジェクト)のサイズを変更します、そして、サイズが変更されたセル範囲(Rangeオブジェクト)を返します。サイズ変更は、縦方向の行数、横方向の列数の両方またはどちらか一方を指定できます。
第83回.Rangeのプロパティ(Offset)
Offsetプロパティは、指定されたセル範囲(Rangeオブジェクト)をオフセット(移動)します、オフセット(移動)したセル範囲を表すRangeオブジェクトを返します。Offsetとは、「差し引きする」意味ですが、Offsetプロパティで取得されるのは、元のRange範囲を、指定した行数・列数移動したRange範囲になります。
第84回.Rangeのプロパティ(Address)
Addressプロパティは、セル範囲(Rangeオブジェクト)の参照範囲を表す文字列の値を返します。引数により、参照方法($の付いた絶対参照)や形式(R1C1形式)を指定できます。Addressは、VBAの中で処理の一環として使う事はあまり多くないかもしれませんが、VBA作成過程ではRangeオブジェクト変数のアドレス確認に使う事もあり、
第85回.結合セルの扱い
セルが結合されていると、マクロでは時に扱いづらい事があります、セル結合されている場合に、VBAでどのように取り扱うかを解説します。そもそも、やたらにセル結合すべきではないのですが、見た目重視で作られたシートでは、セル結合が頻繁に使用されているものです。

RangeとCellsの応用の関連記事

是非読んでほしいRangeとCellsに関する説明ページ
RangeとCellsの深遠
RangeとCells特集にします。今さら…と、あなどるなかれ、結構奥が深いのです。すでに説明した内容もありますが、知っておいた方が良い事、知らなくても困らない事(笑) これらを、まとめてみました。まずは基本 A1セルに"エクセル"と入れる場合。
だまされるな!RangeとCellsの使い分け!
ネットを見ていると、Range("A"&i) と言う記述を良く見かけます。初心者の方が、マクロの自動記録を見て、記録されたマクロを自分で工夫して、行数を変数にしたというのなら素晴らしい事です。しかし、マクロについて、かなり手慣れた人や、時にはExcelマクロの指導的立場にいる人が、
Rangeの使い方:最終行まで選択を例に
Rangeの使い方・書き方について、データ最終行まで選択する場合を例に説明します、Rangeの書き方なので、RangeオブジェクトではなくRangeプロパティの解説という事になります。最近続けざまに、以下のようなコードを見かけました。Range("A2",Range("A2").End(xlDown)).Selec…
リファレンス
Rangeのプロパティ一覧 ・・・ 詳細解説ページへのリンクあり
エクセルの基本である、Rangeオブジェクトのプロパティの一覧です。太字リンク付きは、詳細解説ページ、または、応用したVBAコードがあるページにリンクしています。Excel2010までのRangeオブジェクトのプロパティ一覧 Excel2016で追加されたRangeオブジェクトのプロパティ一覧 CommentThreaded 範囲の左上隅のセルに関連付け…
Rangeのメソッド一覧 ・・・ 詳細解説ページへのリンクあり
エクセルの基本である、Rangeオブジェクトのメソッドの一覧です。太字リンク付きは、詳細解説ページ、または、応用したVBAコードがあるページにリンクしています。Excel2010までのRangeオブジェクトのメソッド一覧 Excel2013で追加されたRangeオブジェクトのメソッド一覧 FlashFill Trueは、


RangeやCellsの書き方次第で、マクロVBAの見た目が大きく変わってきます。
処理結果が同じであるなら、読みやすいVBAコードを書くようにしましょう。




同じテーマ「マクロVBA入門」の記事

第8回.セルに文字を入れるとは(Range,Value)
第9回.Rangeでのセルの指定方法
第10回.Range以外の指定方法(Cells,Rows,Columns)
第11回.RangeとCellsの使い方
第38回.セルに計算式を設定(Formula)
第12回.変数宣言のDimとデータ型
第13回.定数宣言のConstと型宣言文字
第14回.文字の結合(&アンパサンド)と継続行(_アンダーバー)
第15回.四則演算と注釈(コメント)
第16回.繰り返し処理(For Next)
第17回.繰り返し処理(Do Loop)


新着記事NEW ・・・新着記事一覧を見る

VBA100本ノック 37本目:グラフの色設定|VBA練習問題(12月1日)
VBA100本ノック 36本目:列の並べ替え|VBA練習問題(12月1日)
VBA100本ノック 35本目:条件付き書式|VBA練習問題(11月29日)
VBA100本ノック 34本目:配列の左右回転|VBA練習問題(11月28日)
VBA100本ノック 33本目:マクロ記録の改修|VBA練習問題(11月26日)
VBA100本ノック 32本目:Excel終了とテキストファイル出力|VBA練習問題(11月25日)
VBA100本ノック 31本目:入力規則|VBA練習問題(11月24日)
将棋とプログラミングについて~そこには型がある~|エクセル雑感(11月22日)
VBA100本ノック 30本目:名札作成(段組み)|VBA練習問題(11月22日)
VBA100本ノック 29本目:画像の挿入|VBA練習問題(11月21日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.マクロって何?VBAって何?|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ