和風スパゲティのレシピ

日本語でコーディングするExcelVBA

Ctrl+Shift+↓のセル範囲取得をVBAで行う方法

Ctrl + Shift + ↓によるセル範囲の選択はとても便利です。

CtrlShift↓によるセル範囲取得


VBAでも使いたいですよね。


さてこれをVBAで取得する方法ですが、
残念ながら一発でやるプロパティは無い様です。


専用のプロパティはないですが、地道に取得するコード自体は簡単で、

Set 目的のセル範囲 = Range(始点セル, 始点セル.End(xlDown))

これでOKです。


このコードで使用したように、Ctrl + ↑←↓→はプロパティが用意されています。
最終行取得でもおなじみの、Endプロパティですね。


しかし、これに「Shiftキー」の効果も付け足したプロパティは、
私の知る限りありません。

ResizeEndプロパティみたいなものが、あったらいいんですけどね。


無いものはしょうがないので、スタートのセルと、Endプロパティで取得したセルを、ストレートにRangeプロパティで繋げましょう。
おそらくこれが、このセル範囲を取得する一番簡単な方法だと思います。

この操作をマクロ記録しても、これが出てきますしね。

無ければ作ればいい

上記のコードはそこそこ簡単ですが、Excel上でやる「Ctrl+Shift+↓」の手軽さと比べると、ちょっと面倒に感じてしまいます。

同じセルを2回書くから、セルの指定がCells(R, C)だとゴチャゴチャしますし。


ということで、Ctrl+Shift+↓を本家に劣らず簡単に実行できるように、汎用関数にしちゃいましょう。

Function CtrlShift↓(始点セル As Range) As Range

    If 始点セル.Value = "" Or 始点セル.Offset(1).Value = "" Then
        Set CtrlShift↓ = 始点セル
    Else
        Set CtrlShift↓ = Range(始点セル, 始点セル.End(xlDown))
    End If

End Function

ほとんど先ほどのコードそのままです。

自分自身や、1つ下のセルが空セルで、Endプロパティがシートの終端まで飛んでしまうことを防ぐコードだけ追加しています。


この関数を作っておけば、

' 例:B列のマイナス値を赤字に
Dim cell As Range
For Each cell In CtrlShift↓(Range("B3"))
    If cell < 0 Then cell.Font.Color = RGB(255, 0, 0)
Next

みたいに、即席のコードを高速コーディングできます。

しかもすごく読みやすい!


ぜひ活用してみてください。


ついでにどうぞ。

Function CtrlShift→(始点セル As Range) As Range

    If 始点セル.Value = "" Or 始点セル.Offset(, 1).Value = "" Then
        Set CtrlShift→ = 始点セル
    Else
        Set CtrlShift→ = Range(始点セル, 始点セル.End(xlToRight))
    End If

End Function

余談ですが、関数名には日本語だけでなく、今回のように記号も使えます。
流石に矢印以外はめったに使いませんけどね。

例えば「Sub データ→請求書」みたいに、↑→↓←を使うと読みやすくなる場面は結構あります。

気が向いたら使ってみてください。

おまけ:即席コーディングを補助する機能

こういう即席コードを早く書く関数を作ったらなら、
さらに書くスピードを極めてみるとよいです。


あるセルからCtrl+Shift+↓で取得できるエリアの全セルをループ処理
はかなり頻出のコードなので、このコードをまるごとユーザー辞書に登録してしまいましょう。

ふぇcs ⇒ Dim cell As Range:For Each cell In CtrlShift↓()

という変換をユーザー辞書に入れておけばOK。
これでこのコードを数キーのタイプで作り始めることができます。


読みはFor Each Ctrl Shift の頭文字ですが、くしゃみみたいな読みですね(´∀`)