cr(カレントリージョン)で、2つおきの行を削除する。
cr(カレントリージョン)の普及活動!
cr(カレントリージョン)って何?と思われるでしょう。一言でいうと、セルの範囲操作が容易になります。
この記法は「ほえDX塾」で教わったものです。ブログへの記載OKということなので、この便利さを伝えたいなと思います。
気が向いたら、シリーズ化します。
1 閲覧対象者
crの記法を学んで、セルの範囲操作の幅を広めたい人。
2 得られる効果
セルの範囲(Range)を簡単に操作することができる。
3 演習問題
以下のような表があります。
演習問題
・この表から2つおきの行を選択してください。
正直、この問いへの答えが出せませんでした。For Nextでループさせても、Selectしたままにできんな~(;^ω^)とお手上げでした。
そんなときcr(カレントリージョン)がすごく便利なのです。久々にコードを見て感動しました。
ちなみにこの問いに対する正解は、以下の画像の状態です。
2,4,6、~12の行を選択します。ここまでみなさんは回答のコードを作れますか?
ではでは、回答のコードは次の章です。
4 コードの解説
Sub cr_Union() Dim cr As Range: Set cr = Range("A1").CurrentRegion Dim i As Long Dim myRange As Range For i = 2 To cr.Rows.Count Step 2 If i = 2 Then If myRange Is Nothing Then Set myRange = cr.Rows(i) End If Else Set myRange = Union(myRange, cr.Rows(i)) End If Next myRange.Select End Sub
変数crにRange("A1").CurrentRegionの範囲をセットします。
初期値2で「For next Step 2」でループ処理します。
変数myRangeにcrの行を格納していきます。ポイントは、myRangeの初期状態は「Nothing」となっているので、1回目のSetで範囲を設定するときはNothingかどうかの判定が必要です。
2回目以降は、myRangeに「Union(myRange, cr.Rows(i))」で追加格納していきます。
このようにして、2行おきのデータを格納していきます。
そして、最後の「myRange.Select」で選択します。
これが問題の回答コードとなります。
5 2行おきのデータを削除する
ここからは、crを応用した処理です。
crからmyRangeでセルを選択できました。次に、myRangeを削除してみましょう。削除するには、以下のコードです。
Sub cr_Union() Dim cr As Range: Set cr = Range("A1").CurrentRegion Dim i As Long Dim myRange As Range For i = 2 To cr.Rows.Count Step 2 If i = 2 Then If myRange Is Nothing Then Set myRange = cr.Rows(i) End If Else Set myRange = Union(myRange, cr.Rows(i)) End If Next myRange.Select myRange.Delete End Sub
「myRange.Delete」を追加するだけです。
処理した状態が以下の画像です。
myRangeの範囲のデータが削除されます。
普通、2行おきのデータを削除するというと「For next Step -1」でDeleteしていくのではないでしょうか?
しかし、crを使えば指定の範囲を分かりやすいイメージで削除できます。
6 感想
いかがだったでしょうか?セルの範囲選択といっても奥が深いと思いました。cr(カレントリージョン)を使うことで指定の範囲への操作が容易となります。
次回は、複数のmyRangeを取得して並び替える処理について記事を書こうと思います。
ではでは、この辺で(^^)/~~~