和風スパゲティのレシピ

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

セル範囲から不要な範囲をカットする - Intersect

セル範囲から不要な範囲をカットする方法を解説します。

CurrentRegionやUsedRangeから上部の不要部分を消して、
データエリアだけにする
ときなどに使用します。

セル範囲同士の交差範囲(重複エリア)を取得する、
Intersectメソッドを使用します。

サンプルコード

Dim ws対象シート As Worksheet: Set ws対象シート = Worksheets("○○")
Dim 元のセル範囲 As Range: Set 元のセル範囲 = ws対象シート.Range("A1:E9")

Dim 目的セル範囲 As Range

' セル範囲のうち3行目より上をカット(除外)
Set 目的セル範囲 = Intersect(元のセル範囲, Range(ws対象シート.Rows(4) _
                                                                   , ws対象シート.Rows(ws対象シート.Rows.Count)))

' セル範囲のうちB列より左をカット(除外)
Set 目的セル範囲 = Intersect(元のセル範囲, Range(ws対象シート.Columns(2) _
                                                                   , ws対象シート.Columns(ws対象シート.Columns.Count)))

解説

セル範囲から不要な部分をカットするには、
セル範囲同士の交差範囲を取得するIntersectメソッドを使用します。

例えば「3行目より上を範囲から除外」したい場合は、
「元のセル範囲」と「シートの4行目以降全体」の交差範囲を取得します。


元のセル範囲に4行目以降が存在しなかった場合は、
Intersectメソッドの結果はNothingになります。

汎用関数化

この処理で左の不要列をカットすることはそこまでなさそうですが、
上部の不要列をカットすることは結構頻繁にあります。

この表のデータ部を「CurrentRegionの4行目以降」で取得する場合などですね。

CurrentRegionデータ部


この処理をよくやる場合は、汎用関数にして持っておきましょう。

' セル範囲の上側不要行をカット
Function GetRangeセル範囲の指定行より下部分(元のセル範囲 As Range, 指定行 As Long) As Range
    With 元のセル範囲.Worksheet
        Set GetRangeセル範囲の指定行より下部分 = Intersect(元のセル範囲 _
            , Range(.Rows(指定行), Rows(.Rows.Count)))
    End With
End Function

 
さらにこの関数はUsedRangeやCurrentRegionで実行することが多いため、
これらから実行した場合のラップ関数も用意してしまうのが便利です。

' UsedRangeの上側不要行をカット
Function GetUsedRangeの指定行より下部分(対象シート As Worksheet, 指定行 As Long) As Range
    Set GetUsedRangeの指定行より下部分 = GetRangeセル範囲の指定行より下部分 _
        (対象シート.UsedRange, 指定行)
End Function

' CurrentRegionの上側不要行をカット
Function GetCurrentRegionの指定行より下部分(起点セル As Range, 指定行 As Long) As Range
    Set GetUsedRangeの指定行より下部分 = GetRangeセル範囲の指定行より下部分 _
        (起点セル.CurrentRegion, 指定行)
End Function

先ほどの関数にUsedRange/CurrentRegionを渡しているだけと、
ラップ関数は作るのが簡単な割に便利でいいですね。


このように「簡単だけど書くのが面倒なコード」は、
関数化が簡単な割に、汎用関数にするメリットが大きいです。

汎用関数集を作っている方は、ぜひそのメンバーに加えてあげてください。


汎用関数集の作り方・使い方についてはこちらをどうぞ。