VBAでの『CurrentRegion』は”空白のセルで囲まれた範囲を読み取り、参照する”ためのプロパティです。
このプロパティでセル範囲を選択すれば、選択したい行や列が増えたとしても、「空白のセルで囲む範囲」という特性によって追加分も自動的に選択することができるようになります。
他の方法で「コーディング後の表情報追加の自動選択」を実現しようすると、少々面倒なコードになってしまいがちです。
なので、ぜひ便利なので覚えていってください。
CurrentRegionプロパティの使い方
ここではCurrentRegionプロパティの簡単な解説をします。
CurrentRegionプロパティの書式
CurrentRegionプロパティの書式は下の通りです。
対象セル.CurrentRegion
上の書式で、空白セルを識別して、対象セルを起点に上下左右連続するデータ範囲を求めることができます。
CurrentRegionプロパティの参考コード
まずはCurrentRegionプロパティの動作確認をしてみます。
ここでは下のエクセルデータを使います。
そして、ここでは「空白セルを識別してデータが入ったセル範囲を選択する」という内容のコードを実行してみます。
1 2 3 4 5 |
Sub sample1() Range("C3").CurrentRegion.Select End Sub |
上のコードではセルC3を起点にCurrentRegionプロパティで空白を識別しています。
この上のコードを実行すると下のように”C3:E5”が選択されます。
ちなみに今回は「セルC3」を指定していますがセルC3からE5の範囲でどのセルを指定しても同じ結果が得られます。
【応用】CurrentRegionプロパティで必要なデータだけを選択する
上までで基本的なCurrentRegionプロパティの使い方・動きを理解してもらえたかと思います。
ですが、きっと「空白を識別することで、見出しとかいらないデータまで選択してしまう…」という状況に陥るかと思います。
そういう時の解説法をここで解説していきます。
ここで使う表は下になります。
上の表では「見出し」「No.の値」といった不必要なデータも加えています。
なので、このいらないデータを選択から外すためのコードにする必要があります。
それが下のコードになります。
1 2 3 4 5 6 7 |
Sub sample2() With Range("B2").CurrentRegion .Resize(.Rows.Count - 1, .Columns.Count - 1).Offset(1, 1).Select End With End Sub |
上のコードで重要になるプロパティは次の通りです。
・CurrentRegion:起点になるセルから、空白を識別して、まとまったデータを取得する
・Resize:セル範囲を変更する
・Offset:セル範囲を維持したまま移動する
2つのプロパティの理解がイマイチの方は下の記事を一読してみてください。
上のコードを実行すると下のようなになります。
上では「見出し」「No.の値」を選択から外して、必要なセルだけを選択しています。
コレで不必要なデータまでを取得する必要がなくなりました。
ですが、少し上のコードは難しいかもしれませんので、一応補足しておきます。
今回は3つに分解して解説していきます。
1.まとまったデータを選択する
まずはセルB2を起点にCurrentRegionプロパティで空白を識別して、まとまったデータ(セル範囲)を指定します。
上のコードで選択される範囲は下の通りです。
上では「見出し」と「No.」が含まれてしまっています。
2.Resizeプロパティで選択範囲を変更する
次にResizeプロパティで選択範囲を変更します。
上までの「見出しの一行・No.の1列」がいらないので、下のように選択範囲を縮小させています。
上のコードは第一引数の「.Rows.Count」で行数を取得し、1行分いらないので「 – 1」を指定しています。
第二引数の「.Columns.Count」も同様に、1列分いらないので「 – 1」を指定しています。
上のコードで下のようなセル範囲になります。
前回よりも一行・一列の選択範囲が狭まっています。
ですが、まだ「見出し」と「No.」が少し選択している状態になっています。
3.Offsetプロパティでセル範囲をそのまま移動する
最後にOffsetプロパティで選択範囲を移動させます。
上までではまだ見出しとNo.が部分的に選択されている状況になっていました。
その選択範囲を下のコードで「下に一行分、右に一列分移動」させます。
上のコードでは「第一引数に移動させる行数(正は下方向・負は上方向)」を指定し、「第二引数に移動させる列数(正は右方向・負は左方向)」を指定します。
上のコードまでを実行すると下のように選択範囲になります。
コレで必要なデータのみを選択できました。
このようにCurrentRegionプロパティに、ResizeプロパティとOffsetプロパティを組み合わせるとさらに細かい処理を行うことができるようになります。
【おまけ】セル範囲の値を配列で扱う
ここでは「CurrentRegionプロパティで複数のセルを取得し、その複数のセルを配列に入れる」という内容でやってみます。
ちなみに値の確認はDebug.Printを使って、イミディエイトウィンドウに出力します。
そして、ここで使うデータは上で使ったモノを引き続き使います。
では、セルC3~E7の値を取得するコードは下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Sub sample3() Dim target As Range Dim targetValue As Variant Dim i1 As Long Dim i2 As Long With Range("B2").CurrentRegion Set target = .Resize(.Rows.Count - 1, .Columns.Count - 1).Offset(1, 1) End With targetValue = target.Value For i1 = LBound(targetValue, 1) To UBound(targetValue, 1) For i2 = LBound(targetValue, 2) To UBound(targetValue, 2) Debug.Print targetValue(i1, i2) Next i2 Next i1 End Sub |
上のコードの重要なポイントは次の通りです。
9行目:指定したセル範囲のデータを取得し、Range型の変数(tagert)に代入している。
12行目:取得した複数のセルデータをVariant型の変数(targetValue)に代入している。
※Variant型の変数にセル範囲を代入すると、自動で二次元配列に変換してセルの値を格納してくれる。
※今回の配列の構成は二次元配列で(1 To 5, 1 To 3)となっている。
ちなみに上のコードを実行すると下のような結果になります。
1位 | 2位 | 3位 |
---|---|---|
Excel VBA 脱初心者のための集中講座 | パーフェクトExcel VBA | ExcelVBA 実戦のための技術 |
初心者~中級者 | 中級者 | 初心者~中級者 |
【初心者が手に取るべき参考書】 ・「書籍+動画」で圧倒的に理解しやすい入門書になっている。 ・丁寧で詳しい解説でボリューム感がある。 | 【より深い理解をしたい方にお勧めな参考書】 ・テーマに対して丁寧な解説・適度な深さで解説されている。 ・幅広くテーマを扱っていることから、基礎知識をあらかた網羅できる。 | 【入門書と一緒に買うべき参考書】 ・1つ1つのテーマを経験豊富なエンジニア視点で解説してくれている。 ・実践的で効果的なコードの書き方が理解できる。 |
【読んでみた一言】 正直、入門書はコレ一冊でいいかも。あとは中級者用の参考書に進むべし。 | 【読んでみた一言】 深く書かれているが、少々専門的に書かれていることから、読む前に数冊の入門書を読破したほうが良い。 | 【読んでみた一言】 基礎知識を持っている人が次のレベルに達するきっかけを与えてくれる参考書である。 |
スポンサーリンク