ExcelマクロVBA技術解説 | RangeとCellsの深遠 | Excelマクロの問題点と解決策、エクセルVBAの技術的解説



最終更新日:2013-02-18

RangeとCellsの深遠


RangeとCells特集にします。


今さら・・・と、あなどるなかれ、結構奥が深いのです。


すでに説明した内容もありますが、知っておいた方が良い事、知らなくても困らない事(笑)


これらを、まとめてみました。



まずは基本


A1セルに"エクセル"と入れる場合。

Range("A1").Value="エクセル"
Cells(1, 1).Value="エクセル"


A1〜B2セル(4つのセル)に"エクセル"と入れる場合。

Range("A1:B2").Value="エクセル"
Range(Cells(1,1),Cells(2,2)).Value="エクセル"


RangeもCellsもセルに対して、何らかの操作をする場合に使用します。

多くのプロパティ、メソッドが用意されていますが、
これらの、プロパティ、メソッドを調べるのは簡単です。

「マクロの記録」で、セルを操作すれば良いのです。

記録されたマクロの必要な記述をコピペして使えばOKです。


注意).ネットでは、書式設定に、NumberFormatを使用している場合を見かけます。

     自動記録される、NumberFormatLocalを使うべきです。

     

Range


RangeはWorksheetオブジェクトのプロパティで、

セルまたはセル範囲を表すRange オブジェクトを返します。


ヘルプでは、

セルまたはセル範囲を表す 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)) 全セル


まだまだ指定方法はあるでしょうが、まあこんなところにしましょう

どうですか、ヘルプの説明を読んで、上の全てが理解できますでしょうか。


太字は必ず覚える必要があるもので、VBAで実際によく使います。

それ以外は、覚える必要も無いし、使う事もないと思いまう。(使ってもよいですけどね)


特に8.や12.などは、悪ふざけの範囲です。

でもエラーにはなりません、そしてそれが問題です。

VBAでバグにより結果的にこのような指定になってしまい、とんでも無い事になる場合があります。


Rangeは、セル範囲(複数セル)を扱う時に使用します。

もちろん単一セルでも使いますが、その場合は、行列を指定するCellsを使う方が多いです。


また、Rangeオブジェクトに対し、プロパティを指定しない場合は、Valueプロパティが規定となります。

プロパティは、数多く存在しています、説明しきれませんので、使う機会があれば少しづつ説明します。

オブジェクトブラウザを見るのも勉強になると思います。



Cells


CellsはWorksheetオブジェクトまたはRangeオブジェクトのプロパティで、

セルを表すRangeオブジェクトを返します。


ヘルプでは、

CellsプロパティをRange オブジェクトに指定した場合

指定した範囲のセル (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オブジェクトと言うのは存在しない事です、

CellsはRangeオブジェクトを返します。

つまり、WorksheetのCellsプロパティは、シートの全セル範囲のRangeオブジェクトです。

おそらく、この部分の理解が不足していることが多いのだろうと思われます。


Cellsプロパティは、シートの全セル範囲のRangeオブジェクトなのですから、

その行列の位置を指定することで、単一セルになるのです。


おそらく、他言語をやっている人なら、Cells.Item(1, 1)の指定の方がしっくりくるかもしれません。

そして、これが本来の指定であり、Cells(1, 1)は、この省略形とも言えます。


また、Rangeオブジェクトなので、プロパティを指定しない場合は、Valueプロパティが規定となります。



RangeとCellsの極み


セル「C3」を指定する場合のパターンです。

1. Range("C2")
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プロパティを正しく理解している必要があります。


6.に関しては、オブジェクトの参照についても理解する必要があります。

Range("A1").Cells(1, 3)は、C1セルになり、CellsはRangeオブジェクトなので、

さらに、.Cells(3, 1)で、C3セルを指す事になります。

Offsetと同じです、OffsetもRangeオブジェクトを返すプロパティです。

ただ、こんな使い方をすることは無いので、覚える必要はありません。


ただ、これが原因で、意味不明なバグで悩む事もあると言う事を知っておいて下さい。

つまり、Rangeを引数で渡した場合に、その範囲を超える指定をしても、動作してしまうのです。


・・・ちょっと難しいですね、あくまで、理解を深める為のお話です。



Rangeオブジェクトのお話


Rangeオブジェクトを理解するためのたとえ話です。

以下を想像して下さい。


碁盤の目に区切られた場所があり、マス目は、横にA,B,C、縦に1,2,3と見出しが付いています。

その1マス毎に、ダンボールが置いてあり、そのダンボールは、

・それぞれ大きさも、色ももまちまちです。

・それぞれの中には、色々な物が入っています。

・それぞれに、小人が沢山付いています。

・直接ダンボールにふれることも、動かすこともできません。

・こちらで解るのは、ダンボールに備え付けられている電話番号だけです。

・この電話は、他の箱に転送可能です。

・ダンボールに何かをしたい場合は、電話をかけ、小人に指示します。


どうです、想像できましたか?奇妙な光景です。(笑)

このダンボールがオブジェクト、小人がプロパティやメソッド、電話番号がアドレスです。


ダンボール("A1")が左上のダンボールになりますが、ダンボールを持てるわけではありません。

ダンボール("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")は、電話番号を変数に入れているだけです。

結果として、ダンボール(1,1)に対する指示も、変数に対する指示も同じことになります。


ははは、って感じですが、これが私の頭の中でのRangeオブジェクトの想像図です。


少しは、イメージできましたでしょうか。


気味が悪い、余計解んないって・・・



個別のプロパティを説明しなくても、これだけの説明が必要です。


本来なら、他のプロパティも説明したいところですが、今回は無理でした。


使う機会があれば、都度説明するようにします。


Rangeオブジェクトのプロパティ、メソッドはVBAの基本です。


書式設定、行高、列幅・・・VBAでは必須知識になります。


また、前回も出た、Findは、Rangeオブジェクトのメソッドです。



ネット上では、RangeとCellsで速度がどうとか・・・というのも見かけますが、


少し話が変な気がします、普通には、差異はないはずですし、


厳密な速度測定なら、全述のItemの指定による速度の違いも考慮すべきです。



いろいろ難しいですが、エクセルですから、結局は、このRangeに対する操作が全てです。


どのようなプロパティ、メソッドがあるかは、折を見て調べておく事は、大変役に立つと思います。


私もまだまだ、知らないプロパティ、メソッドは沢山あります。





同じテーマ「ExcelマクロVBA技術解説」の記事

Offset、Resizeを使いこなそう
マクロ作成後に、表位置がずれた場合の対処
値渡し、参照渡しについて(ByVal,ByRef)
実は奥が深いIfステートメント
最終行・最終列の取得方法(End,CurrentRegion,SpecialCells,UsedRange)
ユーザー定義関数の作り方
セルの値について(Value,Value2,Text)

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

データクレンジングと名寄せ|ExcelマクロVBA技術解説(10月20日)
SUMIFの間違いによるパフォーマンスの低下について|エクセル関数超技(6月17日)
条件式のいろいろな書き方:TrueとFalseの判定とは|ExcelマクロVBA技術解説(6月15日)
空白セルを正しく判定する方法2|ExcelマクロVBA技術解説(5月6日)
フルパスをディレクトリ、ファイル名、拡張子に分ける|ExcelマクロVBA技術解説(4月15日)
テキストボックスの各種イベント|Excelユーザーフォーム入門(4月9日)
フォルダ(サブフォルダも全て)削除する、Optionでファイルのみ削除|ExcelマクロVBAサンプル集(4月4日)
最後の空白(や指定文字)以降の文字を取り出す|エクセル関数超技(3月26日)
先頭の数値、最後の数値を取り出す|エクセル関数超技(3月26日)
Excelファイルを開かずにシート名をチェック|ExcelマクロVBAサンプル集(3月23日)

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

1.最終行の取得(End,Rows.Count)|ExcelマクロVBA入門
2.RangeとCellsの使い方|ExcelマクロVBA入門
3.Range以外の指定方法(Cells,Rows,Columns)|ExcelマクロVBA入門
4.変数とデータ型(Dim)|ExcelマクロVBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|ExcelマクロVBA入門
6.定数と型宣言文字(Const)|ExcelマクロVBA入門
7.徹底解説(VLOOKUP,MATCH,INDEX,OFFSET)|エクセル関数超技
8.マクロって何?VBAって何?|ExcelマクロVBA入門
9.CSVの読み込み方法|ExcelマクロVBAサンプル集
10.ひらがな⇔カタカナの変換|エクセル基本操作



  • >
  • >
  • >
  • RangeとCellsの深遠

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


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

    ↑ PAGE TOP