エクセルデータを扱う際に必ず使うオブジェクト『Range』。
たぶん、1つのセルに対してであれば容易に使いこなせているかと思います。
ですが、これが複数のセルになると「どうやって値取得するんだ…」と悩む人がいると多いはずです。
なので、本記事ではRange型の「1つのセル」「1列の複数セル」「離れた2つの列の複数セル」の値の取得方法について解説していきますので、覚えていってください。
1つのセルの値を取得する
ここでは1つのセルの値を取得する記述について説明します。
また、一応、ここでは二通りのやり方を解説しておきます。
まずは「指定したセルの値を直接表示する」という一般的なやり方です。
1 2 3 4 5 |
Sub sample1() Debug.Print Range("B2").Value End Sub |
上ではセルB2を指定して、その値を取得しています。
その値をイミディエイトウィンドウに表示している感じです。
1つのセルであれば、上のやり方で十分です。
ですが、Range型の理解を深めるという意味で、一応あえて下のように一度Range型の変数に代入してセルの値を取得してみます。
1 2 3 4 5 6 7 8 |
Sub sample2() Dim target As Range Set target = Range("B2") Debug.Print target(1, 1) End Sub |
上では5行目でRange型の変数にセル自体を入れています。
そして、6行目でその変数の値をイミディエイトウィンドウに表示するようにしています。
ここで覚えておいてほしいのが、6行目を確認してみると分かるかと思いますが、Range型は配列形式になっています。※配列は二次元配列です。
以降で紹介する複数のセルの値の取得で「Range型は配列形式になっている」が重要になってくるので覚えてお低ください。
複数のセルの値を取得する
次に複数(1列)のセルの値を取得してみます。
下では「セルB2からセルB6の値をイミディエイトウィンドウに表示する」でやってみます。
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub sample2() Dim target As Range Dim i As Long Set target = Range("B2:B6") For i = 1 To target.Rows.Count Debug.Print target(i, 1) Next End Sub |
6行目でRange型の変数にセルB2からB6の5つのセルの値を代入しています。
今回は1列で5行分の値なので、Range型は(1 To 5, 1 To 1)という構成になります。
なので、8行目で1からセル行数分(5)までのループを指定しています。
複数のセル(2列)の値を取得する
上では複数のセルの値といっても、1列に並んだセルを対象にしていました。
ですが、その列が離れている2つの列になると少々値の取得のための記述が変わります。
ここで使うセルデータは下の通りです。
「上の2つの列の値を取得する」コードについて解説します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub sample11() Dim target As Range Dim areaNum As Long Dim rowNum As Long Set target = Range("B2:B6, D2:D6") For areaNum = 1 To target.Areas.Count For rowNum = 1 To target.Areas(areaNum).Rows.Count Debug.Print target.Areas(areaNum)(rowNum, 1) Next rowNum Next areaNum End Sub |
上の重要なポイントは次の通りです。
7行目:「B2~B6」「D2~D6」の2つのセル領域の値を取得
9行目:「セル領域の数」分のループを指定
10行目:「セル領域にある行数」分のループを指定
ちなみに上のコードを実行すると下のような結果が得られます。
次に複数の列を扱う場合に必要になる『Areasプロパティ』について簡単に解説していきます。
Areasプロパティの説明
Areasプロパティとは
9行目~11行目で使っている『Areasプロパティ』とは選択範囲内にある領域 (隣接しているセルのブロック) のコレクションです。
今回は上までとは違い、7行目で「B2~B6」「D2~D6」という2つのセル領域を指定しています。
この2つのセル領域をRange型の変数に代入すると、2つのRange型として格納されます。
こういった2つのセル領域がある場合にAreasプロパティが必要になります。
Areasプロパティの使い方
コレクションから単一のRangeオブジェクトを取得する場合には下のように記述します。
この引数である『index』は「どのセル領域が対象か」を指しています。
また、このindex番号は領域を選択した順番に対応します。
例えば、今回であれば、「B2~B6」がindex番号が”1”、「D2~D6」はindex番号が”2”といった順になります。
そして、そのセル領域内のRange型の1つ1つの値を取得する場合は下のように記述します。
※以降、正確ではないかもしれないが、イメージしやすいように解説する。
.Areas(2)(2, 1)
※セルD3は領域”2″にある”2行目,1列目”にある。
ここまで理解できれば、複数の範囲のセルをRange型で扱う場合でも困ることはないかと思います。
1位 | 2位 | 3位 |
---|---|---|
Excel VBA 脱初心者のための集中講座 | パーフェクトExcel VBA | ExcelVBA 実戦のための技術 |
初心者~中級者 | 中級者 | 初心者~中級者 |
【初心者が手に取るべき参考書】 ・「書籍+動画」で圧倒的に理解しやすい入門書になっている。 ・丁寧で詳しい解説でボリューム感がある。 | 【より深い理解をしたい方にお勧めな参考書】 ・テーマに対して丁寧な解説・適度な深さで解説されている。 ・幅広くテーマを扱っていることから、基礎知識をあらかた網羅できる。 | 【入門書と一緒に買うべき参考書】 ・1つ1つのテーマを経験豊富なエンジニア視点で解説してくれている。 ・実践的で効果的なコードの書き方が理解できる。 |
【読んでみた一言】 正直、入門書はコレ一冊でいいかも。あとは中級者用の参考書に進むべし。 | 【読んでみた一言】 深く書かれているが、少々専門的に書かれていることから、読む前に数冊の入門書を読破したほうが良い。 | 【読んでみた一言】 基礎知識を持っている人が次のレベルに達するきっかけを与えてくれる参考書である。 |
スポンサーリンク