エクセルVBAでセル範囲設定は、簡単なものから複雑なものまでいろんな対応が必要です。
RangeとCellsから始めて14個のプロパティやメソッドを利用します。
こんにちは じゅんぱ店長 (@junpa33) です。
今回は、エクセルVBAで一番重要なこと、「セル範囲の選択」についてです。
何故重要かというと、
基本、VBAで行う作業では「どこかのセルにあるデータを何かの方法で加工する」作業がメインになります。その「どこかのセル」は「どこなのかを指示する」ことから作業は始まります。「どこかのセル」を「ここのセル」と言ってあげないとすべては始まらないのです。
そしてその最も基本的なことを行なうのが「セル範囲の指定」ということになるのです。
この記事ではこの「セル範囲の指定と設定」について書いていきます。
- セルの範囲選択
- Range VS Cells !VBAで使えるのはどっち
- セルの範囲選択と設定は14のツールで対応する
- Rowsプロパティの働きと関連のメソッド
- Columnsプロパティでセルの列を指定する
- EntireRowとRowプロパティの違い
- EntireColumnとColumnの使い方
- Offsetプロパティは指定範囲を移動させる
- Resizeプロパティでセル範囲をサイズ変更
- CurrentRegionは連続データをまとめて掴む
- UnionとRangeの一括選択の働きを比較
- SpecialCellsメソッドはセル検索し選択する
- UsedRangeプロパティの使い方のコツ
- Endプロパティで上下左右の最終セルを取得
- データ入力済セルの最終行番号を取得する
コンテンツ
セル範囲の指定と設定は14個のツールの選択肢から始まる

「処理対象のセルがどこにあるのか?」
これを指定してあげないとVBAでは、すべては始まりません。
「1個のセルやセル範囲(ここでは、まとめてセル範囲と言います)」をVBAコードで指示してあげることは、思っているよりも結構難しいものです。サラリと流すような内容でもありません。
1個だけなら未だしも、複数セルのセル範囲となれば、「いらないセル(処理したくないセル)」も混ざってしまうことだってあります。
エクセルVBAでは、セルの範囲設定を行うのに使えるプロパティやメソッドがいくつか準備されていますが、
「よく使う~まあまぁ使う」までの14個のツール(プロパティやメソッド)をピックアップしました。
この14個のツールを使えば(複合技も含めて)大体のセル範囲も指定できると思います。
14個のツール(プロパティやメソッド)と摘要
- RangeとCells ・・セルの指定
- Rows ・・行の指定
- Columns ・・列の指定
- EntireRow ・・行の指定
- Row ・・行番号
- EntireColumn ・・列の指定
- Column ・・列番号
- Offset ・・セルの移動
- Resize ・・範囲サイズの再指定
- Union ・・範囲の結合
- CurrentRegion ・・今のセルを含む範囲
- UsedRange ・・編集セルの範囲
- SpecialCells ・・セル内容の抽出
- End ・・最終セル
14個のツールそれぞれの特徴と使い方

エクセルを利用する業務環境によってよく使うプロパティはある程度決まってくると思います。
必要に応じて使っていくということで良いと思います
RangeプロパティとCellsプロパティ
RangeプロパティとCellsプロパティの最大の違いは、
- Rangeプロパティは、「1つのセルだけでなく複数のセル」を取り扱うことが出来る。
- Cellsプロパティは、「1つのセルか全セル」という2つのパターンしか取り扱うことが出来ない。
ということです。
つまり、ただ一つのセルを扱う(指定する)時はどちらでも使用することが出来ますが、
複数個のセルを取り扱う時はRangeプロパティを使用することになります。
またシート1枚のセル全部ということになると「 ” Cells ” で全部を言い表す」ことが出来ます。
RangeプロパティとCellsプロパティでセル範囲を指定する場合は、セル範囲の行番号と列番号が分かっている必要があります。


Range(“B3:F15,A1,H2:H5,C17:E18”).Select

Rowsプロパティ
Rowsプロパティの大きな特徴は、
- 行レベルで複数のセルを範囲指定することが出来ます。
- 連続した行であれば同時選択は可能ですが、離れた行同士については同時選択をすることは出来ません。
- あらかじめ決められたセル範囲内での行指定を行うことが出来ます。
ということです。
あらかじめ決められたセル範囲内でのセルの位置指定は、「相対参照(位置)」になりますので注意が必要です。

Rows(“3:5”).Select

Range(“B3:E9”).Rows(“3:5”).Select

Columnsプロパティ
Columnsプロパティの大きな特徴は、Rowsプロパティと似た部分もあります。
- 列レベルで複数のセルを範囲指定することが出来ます。
- 連続した列であれば同時選択は可能ですが、対して離れた列同士については同時選択をすることは出来ません。
- あらかじめ決められたセル範囲内での列指定を行うことが出来ます。
さらにColumnsプロパティでの列指定の特徴的なことは、
指定の参照方法が複数列指定の場合、アルファベット表記をしないといけないことです。
単なる単独列(1列)のみの場合では、数字表記も可能となっています。
この特徴は、列番号を変数化(可変化)したい時に問題になります。あらかじめ対策できる知識を持っていることが必要です。

Columns(3).Select

Columns(“C:E”).Select

EntireRowプロパティとRowプロパティ
EntireRowプロパティとRowプロパティの最大の特徴は、
- EntireRowプロパティは一つのセルを指定すればそのセルが属している行全てを選択範囲にすることが出来ます。
- ただし、あらかじめ決められたセル範囲内でこのEntireRowプロパティを実行しても、決められたセル範囲を飛び出してシートのその行全体を選択してしまいます。
- Rowプロパティは、指定されたRangeオブジェクトの行番号を返します。すなわち数値を返すプロパティです。
この2つのプロパティの使い方としては、
EntireRowプロパティはこれだけでセルの範囲指定を行うことが可能ですが、
Rowプロパティはセルの位置の情報の一つの行番号を調べる時に使うことになります。

Range(“B2:E11”).Select
Selection.Range(“A4”).EntireRow.Select

Range(“B2:E11”).Select
MsgBox Range(“B2:E11”).Range(“B5”).Row

EntireColumnプロパティとColumnプロパティ
EntireColumnプロパティとColumnプロパティの大きな特徴は、
EntireRowプロパティとRowプロパティと同様です。行を列に置き換えて読んでください。
- EntireColumnプロパティは一つのセルを指定すればそのセルが属している列全てを選択範囲にすることが出来ます。
- ただし、あらかじめ決められたセル範囲内でこのEntireColumnプロパティを実行しても、決められたセル範囲を飛び出してシートのその列全体を選択してしまいます。
- Columnプロパティは、指定されたRangeオブジェクトの列番号を返します。すなわち数値を返すプロパティです。返す値はアルファベットではなく数値になります。

Range(“B3:G15”).Range(“C3”).EntireColumn.Select

Range(“B3”).Select
MsgBox Range(“B3”).Column

Offsetプロパティ
Offsetプロパティの特徴は、
- 選択範囲のサイズをそのままで上下左右に平行移動させることが出来ます。

Selection.Offset(5, 0).Select

Resizeプロパティ
Resizeプロパティの特徴は、
- セルの大きさを変更したい対象のセル範囲について、行数と列数を変更した新しいセル範囲として、Rangeオブジェクトで取得します。
たとえて言うなら、フックに掛けた輪ゴム(サイズは16号とか18号とかありますが)を、伸ばしたり縮めたりするようなものです。
ただ1点、フック(基準点)から外したら伸び縮みできなくなります。
Resizeプロパティもセル範囲のサイズを計る ” 起点 ” となるセルがあります。
それは、セル範囲の左上端のセルになります。ここから数えて新たに指定した行列の数で、セル範囲を設定することになります。
この起点そのものを移動させるためには、Offsetプロパティを使うことになります。

Range(“C3”).Select
Selection.Resize(3, 5).Select

Range(“C3”).Select
Selection.Offset(4, -1).Resize(3, 5).Select

Unionメソッド
Unionメソッドの特徴は、
- 複数個のセル範囲を、新たに1つのセル範囲としてひとくくりにすることが出来ます。

Sub UnionRangeサンプル4()
Dim ARange, BRange As Range
Set ARange = Range("C3:C9,D3:F3,D6:F6,D9:F9,I5,I9,J6,J8,K7,L6,L8,M5,M9,P6:P8,Q5:S5,Q9:S9,V5:V9,W5:Y5,W7:Y7,W9:Y9,AB3:AB9")
Set BRange = Range("I12:I15,J16:J17,K18,L16:L17,M12:M15,O12:O18,P12:R12,P15:S15,P18:R18,S13:S14,S16:S17,U15:U18,V13:V14,V16:X16,W12,X13:X14,Y15:Y18,C14,D15,E16,F17,G18,AB18,AC17,AD16,AE15,AF14")
Union(ARange, BRange).Select
Selection.Interior.ColorIndex = 11
Range("A1").Select
End Sub

CurrentRegionプロパティ
CurrentRegionプロパティの特徴は、
- データが入力された連続したセルの塊を、セル範囲として設定します。
- 空白行と空白列で囲まれたセル範囲になります。
同じワークシート内でも空白行や列で分離されている場合は別のセル範囲と見なされます。

Range(“B3”).CurrentRegion.Select
2つに分かれたセル範囲を一度に掴むためにはUnionメソッドを利用します。

Union(Range(“B3”).CurrentRegion,Range(“B17”).CurrentRegion).Select

UsedRangeプロパティ
UsedRangeプロパティの特徴は、
- Rangeオブジェクトではなく、ワークシートオブジェクトに繋がって動作します。
- セルに何かの編集が加わっていれば、「使用済みセル」として感知します。
- 一度「使用済セル」として感知した場合は、そのセルを初期状態に戻さない限り感知解除されることはありません。(セルの背景色を解除(背景色なしに)しても、そのセルを背景色なしに設定したとして感知されてしまいます。)

ActiveSheet.UsedRange.Select

SpecialCellsメソッド
SpecialCellsメソッドの特徴は、
- エクセル画面のリボンにある「検索」から「条件を選択してジャンプ」の項目のVBAコード版です。
- 条件に合ったセルだけを選択することが出来ます。

エラー値だけを選択
Range(“B2:G10”).SpecialCells(xlCellTypeFormulas, xlErrors).Select
Selection.Interior.ColorIndex = 8

Endプロパティ
Endプロパティの特徴は、
- 最終のセルを取得できますので、行番号や列番号も取得することが出来ます。
- コード記述方法を変えれば、先頭の行番号や列番号も取得できます。

Cells(3, 3).End(xlDown).Interior.Color = RGB(0, 255, 255)

セル範囲の指定 14のツールのまとめ

セル範囲の選択方法について説明してきました。
14個のツールは、単独で使うだけでなく複数を同時使用することもあるかもしてません。
求める結果に対しては、筋道は1つだけではありません。
自分の得意な使い方を見つけるのも良いことだと思います。新たなコードを試してみるのも面白いものです。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。