Rangeオブジェクトの取得

EXCELをつかっている限りはRangeオブジェクトの扱いは必須です。
同じセル範囲を取得するにもさまざまな記述があるので、参考にしてください。

目次
  1. 1つのセルの取得
  2. 複数のセルを含むセル範囲の取得
  3. 列範囲、行範囲の取得
  4. 名前の付いたセルの取得
  5. 選択範囲内の特定セルの取得
マクロなお部屋に戻る

  1. 単独セルの取得
  2. 例えば「D3」というセルを取得する場合には以下のような記述が出来ます。

    ◆Rangeプロパティ

    Range("D3")
    A1形式
    Range("R3C4")
    R1C1形式
    Rangeプロパティは本当は Range(セル1,セル2) という形でセル範囲を 表すプロパティです。
    本来はセル範囲を取得するために2つのセルを指定する必要がありますが、 セル範囲が1つの場合は 「セル2」 の部分が同一のもの となるので省略が可能、ということなのです。

    ◆ショートカット

    [D3]
    [ ]の中に直接セルのA1形式のアドレスを記述します。
    通常のRangeプロパティとは違って、R1C1形式での記述は出来ないようです。
    セルの取得としては一番短い記述になりますが、以下の点に注意して使用してください。
    1 セルアドレス、およびセル範囲の名前が使用できる。
    2 セルアドレス、セル範囲の名前はダブルクォーテーションで囲まなくても良い。
    3 記述されたアドレスは絶対番地として扱われる。
    4 アドレスを表す記述に変数、定数などを含めることは出来ない。
    5 他の取得方法より実行時のメモリを多少多めに使用してしまう。
    変数などと絡めて使用することができないので、あまり融通性のある記述ではありません。しかし、頻繁にセル範囲の変更を行うようなマクロでなければこれで充分とも言えます。

    ◆Cellsプロパティ

    Cells(3,4)
    CellsプロパティはRangeプロパティと違って1つのセルを選択するためのプロパティです。

    Cells(行番号,列番号)

    という記述になります。
    Rangeプロパティの方がワークシートのセル番地(A1形式)を使用できるのでEXCELを使い始めた人にはとっつきやすいかもしれません。
    ではなぜ、こう言う記述が採用されているかというと、ひたすら融通性を持たせるため。
    Rangeプロパティでアドレスを記述する際には文字列として記述しなければならないので、変数を使って選択セルを次々と変更していく場合には都合が悪いのです。
    つまり基準点として選択するセルはアドレスが直感的にわかるRangeプロパティを。
    変数などで選択するセルが変更される場合はCellsプロパティという風に使い分けが肝要です。

    ◆Offsetプロパティ

    Range("A1").Offset(2,3)[.Range("A1")]
    最後の [.Range("A1")] は省略可能です。
    意味としては「Range("A1")を基準に2行下、3列左のセル(を基準セル"A1"として、そのA1セルを選択)」ということになります。
    記述としては最初の「 Range("A1") 」が「 Cells(1,1) 」となっても差し支えありません。
    えらくたいそうな記述ですが、基準セルを元に取得するセルを変化させるようなマクロの場合にはこうした記述が必要な場合もあります。

    ページ先頭へ  

  3. 複数のセルを含むセル範囲
  4. 例えば「D3:E6」というセルを取得する場合には以下のような記述が出来ます。

    ◆Rangeプロパティ

    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形式での記述は出来ないようです。
    単一のセルを取得するとき同様、記述されたアドレスは絶対番地として扱われます。
    アドレスを表す記述に変数、定数などを含めることも出来ません。

    ◆CellsプロパティとRangeプロパティの組み合わせ

    Range(Cells(3,4),Cells(6,5))
    CellsプロパティはRangeプロパティと違って1つのセルを取得するためのプロパティです。
    そのため、単独では複数のセルを含むセル範囲は取得できません。
    ですが、Rangeプロパティとの組み合わせでセル範囲を取得できます。
    (というか、これが本来のセル範囲の取得方法のようです)

    ◆Offsetプロパティ

    Range("A1:B4").Offset(2,3)
    セル範囲A1:B4を2行下、3列右方向へ移動したセル範囲を取得します。
    最初にセル範囲の大きさを決定して、その後に取得する位置を決定します。
    Range("A1").Offset(2,3).Range("A1:B4")
    セルA1から2行下、3列右方向へ移動したセル範囲を基準とした「4行×2列」のセル範囲を取得します。
    取得しようとするセル範囲の最上端最左端となるセルを取得し、その後に取得するセル範囲の大きさを決定します。
    取得できるセル範囲はどちらも同じになります。
    基準セル範囲からOffsetにより (行,列) だけ移動したセルが取得されます。
    動作としてはセル範囲の大きさを先に決めるか、後に決めるかの違いだけです。

    ページ先頭へ  

  5. 行範囲、列範囲の取得
  6. 行範囲、列範囲を取得する場合、次のような記述があります。

    ◆1行目を取得する

    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))
    という記述も可能ですが、よほど特殊な事情がない限り、ただ行を取得するためだけにこのような記述はしないでしょう。

    Rows(1)とRows("1")の違い Rows(1)とRows("1")って、一緒じゃないの?と言う疑問がわきますが、取得の方法としてはまったく別物です。
    Rows(1)の方は行のインデックス値で取得しています。これに対して
    Rows("1")は名前による取得です。

    ◆複数行を取得する

    Range("1:3")
    Rangeプロパティ
    [1:3]
    Rangeプロパティ(ショートカット)
    Rows("1:3")
    Rowsプロパティ
    Range(Rows(1),Rows(3))
    RangeプロパティとRowsプロパティの組み合わせ
    いずれも1行目から3行目までの範囲を取得します。

    ◆B列を取得する

    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列を選択します。

    ページ先頭へ

  7. 範囲名のつけられたセル範囲
  8. ブックによってはセル範囲に範囲名をつける場合があります。
    その場合は範囲名を使ってその範囲を取得できます。

    例えば、B2:D40 が範囲名として「リスト」と設定されたセル範囲がブックにある場合、
    通常の記述では Range("B2:D40").Select となるところです。
    Range("リスト").Select
    [リスト].Select
    と言う記述の仕方があります。 ワークブック側に既存の名前つきセル範囲がある場合には便利な書き方です。
    関数などで名前つきセル範囲を使用していて、それを利用する場合などです。
    ブック側の「リスト」の範囲定義を変更することでマクロの適用されるセル範囲が変更されるので、(範囲選択の部分に関しては)マクロの記述変更の必要はありません。ブックのメンテナンスだけで運用したい場合には非常に有効と言えるでしょう。
    また、マクロ内でセル範囲に名前を割り当ててある場合にも有効です。

    ページ先頭へ
     

  9. セル範囲内の特定のセルを選択
  10. 複数のセルを含む範囲で特定のセルを指定するにはどのような記述があるでしょうか。
    例えば、 B2:D40 のセル範囲で考えてみましょう。

    ◆【例題1】「上記の範囲内で2行目で2列目にあたるセルを選択する」場合。

    実際には 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")としてそこからの相対位置を選択します。後から見たときにはちょっと混乱しそうな記述ですが・・・。

    ◆【例題2】「上記の範囲内で2行目にあたるセルを全て選択する」場合。

    実際には 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] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送