RangeとCellsの深遠
今回はRangeとCellsの特集です。
すでに説明した内容もありますが、知っておいた方が良い事、知らなくても困らない事(笑)
これらを、まとめてみました。
まずは基本
Cells(1, 1).Value="エクセル"
Range(Cells(1,1),Cells(2,2)).Value="エクセル"
これらの、プロパティ、メソッドを調べるのは簡単です。
「マクロの記録」で、セルを操作すれば良いのです。
記録されたマクロの必要な記述をコピペして使えばOKです。
Range
expression.Range(Cell1, Cell2)
Cell1 必ず指定します。バリアント型 (Variant) の値を範囲の名前を指定します。これは、マクロの言語の A1 形式での範囲である必要があります。範囲名には、範囲を表す演算子 (:)、共通部分を表す演算子 (スペース) または複数の範囲を表す演算子 (,) を含めることができます。また、ドル記号 ($) は含めることはできますが、無視されます。範囲の一部にローカルに定義した名前を使用できます。名前を使用する場合、その名前はマクロの言語と見なされます。
Cell2 省略可能です。バリアント型 (Variant) の値を使用します。セル範囲の左上隅と右下隅のセルを指定します。各引数には、単一のセルを含む列全体あるいは行全体を表す Range オブジェクト、またはマクロの言語で単一のセルに名前を付ける文字列を指定できます。
だからこそ、書店には、入門書が並んでいるのでしょう。
つまり、言葉にすると結構難しいのです。
では指定可能なパターンです。
| 1. |
Range("A1") |
A1セル |
| 2. |
Range("A1:B3") |
A1~B3セル範囲 |
| 3. |
Range("A1,B3") |
A1とB3セル |
| 4. |
Range("A1", "B3") |
A1~B3セル範囲 |
| 5. |
Range(Cells(1, 1)) |
A1セル |
| 6. |
Range(Cells(1, 1), Cells(3,2)) |
A1~B3セル範囲 |
| 7. |
Range("A1", Cells(3,2)) |
A1~B3セル範囲 |
| 8. |
Range("A1:A3", "B1") |
A1~B3セル範囲 |
| 9. |
Range("名前定義") |
名前定義のセル範囲 |
| 10. | Range(Rows(1), Rows(3)) | 1~3行の範囲 |
| 11. | Range(Columns(1), Columns(3)) | 1~3列の範囲 |
| 11. | Range("1:3") | 1~3行の範囲 |
| 11. | Range("A:C") | 1~3列の範囲 |
| 12. | Range(Rows(1), Columns(1)) | 全セル |
まだまだ指定方法はあるでしょうが、まあこんなところにしましょう。
どうですか、ヘルプの説明を読んで、上の全てが理解できますでしょうか。
それ以外は、特に覚える必要はありませんし、使得なくても困らないし思います。(使ってもよいですけどね)
特に8.や12.などは、悪ふざけの範囲です。
でもエラーにはなりません、そしてそれが問題です。
Rangeは、セル範囲(複数セル)を扱う時に使用します。
もちろん単一セルでも使いますが、その場合は、行列を指定するCellsを使う方が多いです。
また、Rangeオブジェクトに対し、プロパティを指定しない場合は、Valueプロパティが規定となります。
オブジェクトブラウザを見るのも勉強になると思います。
Cells
指定した範囲のセル (Range オブジェクト) を返します。値の取得のみ可能です。
expression.Cells
expression 必ず指定します。Range オブジェクトを返すオブジェクト式を指定します。
CellsプロパティをWorksheet オブジェクトに指定した場合
ワークシートのすべてのセル (Range オブジェクト) を返します。値の取得のみ可能です。
expression.Cells
では指定可能なパターンです。
| 1. | Cells | 全セル |
| 2. | Cells(1, 1) | A1セル |
| 2. | Cells(1, "A") | A1セル |
Cellsの指定方法はあまりありません。
普通にCells(行, 列)で指定すれば良いです。
また、ヘルプで「値の取得のみ可能」と言うのは、
WorksheetオブジェクトのCellsプロパティとしての説明です。
CellsはRangeオブジェクトを返します。
おそらく、この部分の理解が不足していることが多いのだろうと思われます。
その行列の位置を指定することで、単一セルになるのです。
そして、これが本来の指定であり、Cells(1, 1)は、この省略形とも言えます。
また、Rangeオブジェクトなので、プロパティを指定しない場合は、Valueプロパティが規定となります。
RangeとCellsの極み
| 1. | Range("C3") |
| 2. | Cells(3, 3) |
| 3. | Cells.Item(3, 3) |
| 4. | Range("B2:C10").Cells(2, 2) |
| 5. | Range("B2:C10").Item(2, 2) |
| 6. | Range("A1").Cells(1, 3).Cells(3, 1) |
上の2つは普通の指定ですよね、でも下の3つは何でしょう。
実際に使用することはありません。
ただ、これらが全て同一セルを指すことを理解するには、Rangeオブジェクト、Cellsプロパティを正しく理解している必要があります。
Range("A1").Cells(1, 3)は、C1セルになり、CellsはRangeオブジェクトなので、
さらに、.Cells(3, 1)で、C3セルを指す事になります。
Offsetと同じです、OffsetもRangeオブジェクトを返すプロパティです。
ただ、こんな使い方をすることは無いので、覚える必要はありません。
ただ、これが原因で、意味不明なバグで悩む事もあると言う事を知っておいて下さい。
つまり、Rangeを引数で渡した場合に、その範囲を超える指定をしても、動作してしまうのです。
・・・ちょっと難しいですね、あくまで、理解を深める為のお話です。
Rangeオブジェクトのお話
碁盤の目に区切られた場所があり、マス目は、横にA,B,C、縦に1,2,3と見出しが付いています。
その1マス毎に、ダンボールが置いてあり、そのダンボールは、
- それぞれ大きさも、色ももまちまちです。
- それぞれの中には、色々な物が入っています。
- それぞれに、小人が沢山付いています。
- 直接ダンボールにふれることも、動かすこともできません。
- こちらで解るのは、ダンボールに備え付けられている電話番号だけです。
- この電話は、他の箱に転送可能です。
- ダンボールに何かをしたい場合は、電話をかけ、小人に指示します。
どうです、想像できましたか?奇妙な光景です。(笑)
このダンボールがオブジェクト、小人がプロパティやメソッド、電話番号がアドレスです。
ダンボール("A1")が左上のダンボールになりますが、ダンボールを持てるわけではありません。
中身を知るには、小人のValueさんに電話で聞くしかありません、それがダンボール("A1").Valueです。
色を変えるには、小人のInteriorさんを通し、部下の小人のColorさんに、電話で指示します。
また、ダンボール("A1:B2")とすると、A1,A2,B1,B2へ同時に電話する事が出来ます。
ダンボール("A1")に電話し、続けてOffset(1,1)と伝えると、
ダンボール("A1")への電話は、1つ下、1つ右、の箱に転送されます。
従って、ダンボール("A1").Offset(1,1)は、ダンボール("B2")に電話しているのと同じことです。
Set 変数 = ダンボール("A1")は、電話番号を変数に入れているだけです。
ははは、って感じですが、これが私の頭の中でのRangeオブジェクトの想像図です。
少しは、イメージできましたでしょうか。
気味が悪い、余計解んないって・・・
本来なら、他のプロパティも説明したいところですが、今回は無理でした。
使う機会があれば、都度説明するようにします。
Rangeオブジェクトのプロパティ、メソッドはVBAの基本です。
また、前回も出た、Findは、Rangeオブジェクトのメソッドです。
ネット上では、RangeとCellsで速度がどうとか・・・というのも見かけますが、少し話が変な方向に進んでいる場合も見受けられます。
普通には、差異はほとんどありません。
厳密な速度測定なら、全述のItemの指定による速度の違いも考慮すべきです。
どのようなプロパティ、メソッドがあるかは、折を見て調べておく事は、大変役に立つと思います。
私もまだまだ、知らないプロパティ、メソッドは沢山あります。
RangeとCellsの関連記事
同じテーマ「マクロVBA技術解説」の記事
コーディングとデバッグ
ローカルウィンドウの使い方
WorksheetFunctionについて
RangeとCellsの深遠
Offset、Resizeを使いこなそう
値渡し(ByVal)、参照渡し(ByRef)について
最終行・最終列の取得方法(End,CurrentRegion,SpecialCells,UsedRange)
ユーザー定義関数の作り方
セルの値について(Value,Value2,Text)
Excelのバージョンを判断して「名前を付けて保存」
空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)
新着記事NEW ・・・新着記事一覧を見る
SQL基礎問題9:特定商品購入者の平均購入金額|SQL入門(2025-11-04)
SQL基礎問題8:バスケット分析・ペア商品の出現回数|SQL入門(2025-11-04)
SQL基礎問題7:成績表から各教科の最高点と最低点を抽出|SQL入門(2025-11-02)
SQL基礎問題6:成績表から教科ごとの点数ベスト3を抽出|SQL入門(2025-11-02)
SQL基礎問題5:複数のマスタテーブルの結合|SQL入門(2025-11-01)
SQL基礎問題4:2つのテーブルの不一致を抽出|SQL入門(2025-10-29)
SQL基礎問題3:文字列の一部をキーにして集計|SQL入門(2025-10-29)
SQL基礎問題2:文字列「-nn-」のnnが偶数のみ抽出|SQL入門(2025-10-28)
SQL基礎問題1:最大在庫数を持つ製品の在庫金額|SQL入門(2025-10-28)
「ADO + VBA」でSQLを実行するときのVBAサンプル|SQL入門(2025-10-28)
アクセスランキング ・・・ ランキング一覧を見る
1.生成AIパスポート試験 練習問題(四肢択一式)|生成AI活用研究
2.最終行の取得(End,Rows.Count)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.繰り返し処理(For Next)|VBA入門
6.RangeとCellsの使い方|VBA入門
7.FILTER関数(範囲をフィルター処理)|エクセル入門
8.日本の祝日一覧|Excelリファレンス
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.セルのクリア(Clear,ClearContents)|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBA技術解説
- RangeとCellsの深遠
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.
