EXCELをつかっている限りはRangeオブジェクトの扱いは必須です。
同じセル範囲を取得するにもさまざまな記述があるので、参考にしてください。
目次 |
---|
Range("D3") |
---|
A1形式 |
Range("R3C4") |
R1C1形式 |
Rangeプロパティは本当は Range(セル1,セル2) という形でセル範囲を 表すプロパティです。 本来はセル範囲を取得するために2つのセルを指定する必要がありますが、 セル範囲が1つの場合は 「セル2」 の部分が同一のもの となるので省略が可能、ということなのです。 |
[D3] | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
[ ]の中に直接セルのA1形式のアドレスを記述します。 通常のRangeプロパティとは違って、R1C1形式での記述は出来ないようです。 セルの取得としては一番短い記述になりますが、以下の点に注意して使用してください。 |
||||||||||
|
Cells(3,4) |
---|
CellsプロパティはRangeプロパティと違って1つのセルを選択するためのプロパティです。 Cells(行番号,列番号) という記述になります。 Rangeプロパティの方がワークシートのセル番地(A1形式)を使用できるのでEXCELを使い始めた人にはとっつきやすいかもしれません。 ではなぜ、こう言う記述が採用されているかというと、ひたすら融通性を持たせるため。 Rangeプロパティでアドレスを記述する際には文字列として記述しなければならないので、変数を使って選択セルを次々と変更していく場合には都合が悪いのです。 つまり基準点として選択するセルはアドレスが直感的にわかるRangeプロパティを。 変数などで選択するセルが変更される場合はCellsプロパティという風に使い分けが肝要です。 |
Range("A1").Offset(2,3)[.Range("A1")] |
---|
最後の [.Range("A1")] は省略可能です。 意味としては「Range("A1")を基準に2行下、3列左のセル(を基準セル"A1"として、そのA1セルを選択)」ということになります。 記述としては最初の「 Range("A1") 」が「 Cells(1,1) 」となっても差し支えありません。 えらくたいそうな記述ですが、基準セルを元に取得するセルを変化させるようなマクロの場合にはこうした記述が必要な場合もあります。 |
Range(セル1,セル2) という形で「セル1からセル2までのセル範囲」を表すプロパティです。
アドレスは " (ダブルクォーテーション)で囲んで文字列として記述します。
【1】Range("D3:E6") |
---|
A1形式 |
【2】Range("D3","E6") |
A1形式 |
【3】Range("R3C4","R6C5") |
R1C1形式 |
いずれもまったく同じセル範囲を取得します。 エクセル関数を勉強したことがある人は【1】の書式がわかりやすいでしょうか。 ですが、Rangeプロパティはそもそも単独のセルを2つ指定することでセル範囲を取得するものですから、【1】の書式はむしろ例外と言えます。 |
また、上記の三つの例はいずれもRangeプロパティを単独で使用していますが、Resizeプロパティを使用してセル範囲を取得する方法もあります。 |
【4】Range("D3").Resize(4, 2) |
基準となる単独セル範囲からResizeプロパティでセル範囲を拡張します。 |
[D3:E6] |
---|
[ ] の中に直接セルのA1形式のアドレスを記述します。 Rangeプロパティとは違って、R1C1形式での記述は出来ないようです。 単一のセルを取得するとき同様、記述されたアドレスは絶対番地として扱われます。 アドレスを表す記述に変数、定数などを含めることも出来ません。 |
Range(Cells(3,4),Cells(6,5)) |
---|
CellsプロパティはRangeプロパティと違って1つのセルを取得するためのプロパティです。 そのため、単独では複数のセルを含むセル範囲は取得できません。 ですが、Rangeプロパティとの組み合わせでセル範囲を取得できます。 (というか、これが本来のセル範囲の取得方法のようです) |
Range("A1:B4").Offset(2,3) |
---|
セル範囲A1:B4を2行下、3列右方向へ移動したセル範囲を取得します。 最初にセル範囲の大きさを決定して、その後に取得する位置を決定します。 |
Range("A1").Offset(2,3).Range("A1:B4") |
セルA1から2行下、3列右方向へ移動したセル範囲を基準とした「4行×2列」のセル範囲を取得します。 取得しようとするセル範囲の最上端最左端となるセルを取得し、その後に取得するセル範囲の大きさを決定します。 |
取得できるセル範囲はどちらも同じになります。 基準セル範囲からOffsetにより (行,列) だけ移動したセルが取得されます。 動作としてはセル範囲の大きさを先に決めるか、後に決めるかの違いだけです。 |
Range("1:1") |
---|
Rangeプロパティ |
[1:1] |
Rangeプロパティ(ショートカット) |
Rows(1) |
Rowsプロパティ |
Rows("1") |
Rowsプロパティ |
いすれも1行目全体を取得します。 Range("1:1").Select などと記述するとワークシートの行番号をクリックしたのと同じ状態になります。ほかにも Range(Cells(1,1),Cells(1,256)) という記述も可能ですが、よほど特殊な事情がない限り、ただ行を取得するためだけにこのような記述はしないでしょう。 |
Range("1:3") |
---|
Rangeプロパティ |
[1:3] |
Rangeプロパティ(ショートカット) |
Rows("1:3") |
Rowsプロパティ |
Range(Rows(1),Rows(3)) |
RangeプロパティとRowsプロパティの組み合わせ |
いずれも1行目から3行目までの範囲を取得します。 |
Range("B:B") |
---|
Rangeプロパティ |
[B:B] |
Rangeプロパティ(ショートカット) |
Columns(2) |
Columnsプロパティ |
Columns("B") |
Columnsプロパティ |
いずれもB列全体を取得します。 |
Range("B:C") |
---|
Rangeプロパティ |
[B:C] |
Rangeプロパティ(ショートカット) |
Columns("B:C") |
Columnsプロパティ |
Range(Columns(2),Columns(3)) |
RangeプロパティとColumnsプロパティの組み合わせ |
いずれもB列とC列の2列を選択します。 |
例えば、B2:D40 が範囲名として「リスト」と設定されたセル範囲がブックにある場合、 通常の記述では Range("B2:D40").Select となるところです。 |
Range("リスト").Select |
---|
[リスト].Select |
と言う記述の仕方があります。
ワークブック側に既存の名前つきセル範囲がある場合には便利な書き方です。 関数などで名前つきセル範囲を使用していて、それを利用する場合などです。 ブック側の「リスト」の範囲定義を変更することでマクロの適用されるセル範囲が変更されるので、(範囲選択の部分に関しては)マクロの記述変更の必要はありません。ブックのメンテナンスだけで運用したい場合には非常に有効と言えるでしょう。 また、マクロ内でセル範囲に名前を割り当ててある場合にも有効です。 |
実際には C3 のセルが選択されます。 次の三つの構文は B2 を基点として行や列を求めています
Range("B2:D40").Cells(2,2).Select |
---|
B2 をCells(1,1)としてそこからの相対位置を選択します。 |
Range("B2:D40").Cells(5).Select |
B2 をCells(1)としてそこからのセル番号で位置を選択します。ちょっと変わった記述ですね。範囲内を左上端のセルから右方向へセルを数えていって右端に達したら次の行の左端へ・・・と数えていった番号です。 |
Range("B2:D40").Range("B2").Select |
B2 をRange("A1")としてそこからの相対位置を選択します。後から見たときにはちょっと混乱しそうな記述ですが・・・。 |
実際には B3:D3 が選択されます。 次の三つの構文は【例題1】と同じように B2 を基点として行を求めています。
Range("B2:D40").Range(Cells(2,1),Cells(2,3)).Select |
---|
B2 をCells(1,1)としてそこからの相対位置を選択します。 |
Range("B2:D40").Rows(2).Select |
B2 をCells(1,1)としてそこからの行番号で相対位置を選択します。 普通 Rows(2).Select として実行すると、行全部が選択されるのですが、この記述ですと「範囲内での2行目のセル」だけが選択状態になります。Range("B2:D40") の範囲から外にはみ出ることはありません。 |
Range("B2:D40").Range("A2:C2").Select |
B2 をRange("A1")としてそこからの相対位置を選択します。 1つのセルの場合同様、直感的には捉えにくいかもしれませんね。 |
セルを取得する(プログラムに認識させる)にはその前提として取得しようとするセルの上位にある「対象となるオブジェクトが必要」、つまり取得の基点となるものが必要となります。 上記の例では「Range("B2:D40")」が「対象となるオブジェクト」になります。 |
では、アクティブになっているシートから「C3」と言うセルを取得する場合について考えて見ましょう。 この場合は次のように記述すると「C3」セルが選択されます。 |
Range("C3").Select |
この書き方ではRangeオブジェクトの上位のオブジェクトは書かれていません。 では「対象となるオブジェクト」は書かなくても良いのか? いえ、実は「対象となるオブジェクト」を省略した記述になっています。 本来なら下記のような記述になるはずです。 |
[ActiveSheet.]Range("C3").Select |
つまり、セルを取得するメソッドで「対象となるオブジェクト」を省略した場合は、現在選択されているシートの全てのセルを「対象となるオブジェクト」と仮定してセルを取得する、と言うことなのです。
この場合は当然、「A1」が基点となります。 逆に、「対象となるオブジェクト」がアクティブな場合は省略してもかまわない、と言うことになります。 |
Range("B2:D40").Range("B2").Select |
---|
この例では、「対象となるオブジェクト」はシートオブジェクトの下位の、「Range("B2:D40")」というRangeオブジェクトとなっています。この場合は先にも述べているとおり、セルB2がセル取得のための起点になります。 「Range("B2:D40")」の上位には当然シートオブジェクトがあるわけですが、「Range("A1:IV65536")」というシート全体のセル範囲を「Range("B2:D40")」に縮小して取得する感覚で書けばよろしいかと思います。 |
[ActiveSheet.Cells.]Range("B2:D40").Range("B2").Select [ActiveSheet.Range("A1:IV65536").]Range("B2:D40").Range("B2").Select |
このことを理解していただいた上で、【例題1】【例題2】を見なおして頂きたいと思います。 |
SEO | [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||