【ExcelVBA】上下左右連続して表示しているデータ範囲の行を取得

上下左右連続するデータやデータをフィルターで抽出して上下左右連続して表示しているデータ範囲をセル単位ではなく行単位で処理する操作

A列に設定されている値から値を探して見つかった行のD列に値を設定

処理の方法

いくつかやり方が考えられる

  1. A列に探したい値でフィルターをかけ、表示しているD列に値を設定する
  2. A列から探したい値を上から順番に探していく

1のやり方:もともとフィルターがかかっていなければ、一度で値が設定できるので便利。やり方はこちらの記事(フィルターで抽出した行に対する操作)を参照。ただ、フィルターがかかっていて元のフィルターに戻したい場合はフィルター情報を保存して元に戻す処理が必要なのでかなりめんどくさい

今回は、表示している上の行から順番に探していく2のやり方を説明

A列から探したい値を上から順番に探していく

上下左右連続するセル範囲
A2セルから上下左右連続したセル範囲を取得する。 フィルターがかかっていれば、フィルターで抽出している行が範囲となる
Range(“A2").CurrentRegion
表示しているセル範囲を取得
フィルターがかかっていてもかかっていなくても、現在表示しているセルを対象
SpecialCells(xlCellTypeVisible)
範囲をセル単位ではなく、行単位にする
そのままでは、セル単位になるので取得する単位を行単位にする
Range(“A2").CurrentRegion.SpecialCells(xlCellTypeVisible).Rows

Rowsをつけなければ、For Eachで取り出す時に、セル単位となり範囲が2行5列であれば2×5の10セル繰り返される
Rowsをつけると、行単位となるので2行5列であれば2回の繰り返しとなる

サンプルソースコード

Sub VisibleRowSearch()
    Dim line As Long        '行番号を格納する変数
    Dim target As Range     'Visibleセル範囲を格納する変数
    Dim r As Range          '行単位で格納
    
    'Range("A2").CurrentRegion:A2~上下左右連続しているセル範囲
    'SpecialCells(xlCellTypeVisible):表示されているセルのみを対象とする
    
    Set target = Worksheets("Sheet2").Range("A2").CurrentRegion.SpecialCells(xlCellTypeVisible).Rows
    
    For Each r In target
        '選択セルの行を取得
        line = r.Row
        'Visible行の行番号を出力
         MsgBox line
    Next
End Sub