和風スパゲティのレシピ

日本語でコーディングする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

おまけ:より即席に

せっかくならスピードを極めましょう。
 

For Each cell In CtrlShift↓(Range("B3"))

これを、

For Each cell In CtrlShift↓([B3])

こう書き替えることができます。

Evalueteメソッドというもので、Range("")を[]に省略出来ます。

多用は禁物で、私はきっちり作るマクロでは絶対に使わないようにしていますが、
目の前の単発作業を瞬殺するためだけのマクロを書く際には、強い味方になります。


ついでに、

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

という変換をユーザー辞書に入れておけばOK。


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