テーブル機能で抽出したデータだけ選択状態にする

'対象のテーブルと列を指定(1つ目のテーブルの1列目)
With ActiveSheet.ListObjects(1).ListColumns(1)
    .Range.AutoFilter 1, "=002*"  '列数は1行上と同じにする:フィルタ条件(002から始まる文字列)
    .Range.SpecialCells(xlCellTypeVisible).Select  '可視セルのみの選択
    ActiveSheet.ShowAllData  'フィルタの全解除
    
    'フィルタ条件一致有無の判定(集計行がある場合は3にする)
    If Selection.Cells.Count >= 2 Then
        '選択をデータ範囲のみにする
        Intersect(.DataBodyRange, Selection).Select
        '抽出データがある場合の処理
    Else
        '抽出データがない場合の処理
        Debug.Print "抽出データなし"
    End If
End With

このコードを使用すると、テーブル機能でフィルタをかけていない状態でも、フィルタを適用した際に抽出されたデータのみを選択状態にすることができます。

さらに、抽出結果が存在するかどうかの判定も行っています。
このコード単体では「選択する」だけなので、その後に選択範囲を処理するためには、この判定が必要となります。

コード実行時の実際の動き

主な使用場面としては、テーブル内のデータのうち提出や集計に不要なデータを削除したり、必要なデータを転記したりする場合です。
フィルタをかけた状態を維持せずに、対象データだけを選択できるようになります。

この処理では仕様として、可視セル選択時に必ず見出しセルが選ばれるようになっています。(集計行がある場合は集計行セルも選択されます。)
これは、抽出条件に一致するデータが存在しない場合に可視セル選択でエラーが発生するのを避けるためです。
エラー処理を組み込むよりも、必ず選択セルが存在するようにしてエラーを回避する方が分かりやすいと考えています。
ただし、そのままではデータ範囲外のセルまで選択されてしまうため、一致するデータがある場合にはデータ範囲外のセルを選択から除外するようにしています。

コード解説

'対象のテーブルと列を指定(1つ目のテーブルの1列目)
With ActiveSheet.ListObjects(1).ListColumns(1)

・・・

End With

ここでは、アクティブシートにある1つ目のテーブルの1列目のセル範囲を With に指定しています。
これにより、見出しや集計列を含めた列全体のセル範囲を With ブロック内で使用できるようになります。

この処理の性質上、同じシートに複数のテーブルがあることは想定していませんが、対象となる列が必ずしも1列目とは限りません。
その場合は「ListColumns(1)」の数字部分を任意の列番号に変更すれば問題ありません。
また、見出し名を文字列で指定することも可能ですが、その場合は見出しが変更されないように使用者へ注意を促す必要があります。

    .Range.AutoFilter 1, "=002*" '列数は1行上と同じにする:フィルタ条件(002から始まる文字列)
    .Range.SpecialCells(xlCellTypeVisible).Select  '可視セルのみの選択

1行目では、抽出条件を指定しています。
最初の引数「1」は、フィルタを適用する列番号の指定です。処理としては、直前の行にある「ListColumns(1)」の数字と同じものを指定してください。
次の引数「”=002*”」が具体的な条件で、ここでは「002」で始まる文字列を抽出対象としています。
この部分を任意に変更することで、他の条件を設定することも可能です。
なお、条件の指定方法には、他にもさまざまなパターンがあります。

2行目では、可視セルを選択状態にしています。
抽出結果の可視セルが対象となるため、抽出条件に一致するセルとテーブル範囲の列全体が選択状態になります。

ActiveSheet.ShowAllData  'フィルタの全解除

ここでは、かけたフィルタを全て解除しています。
このコードは、フィルタがかかっていない状態で実行するとエラーになる点に注意が必要です。
ただし、処理上は「フィルタがかかっていない」という前提がないため、エラー処理を入れる必要はありません。
詳しくは以下の記事で解説しています。

ちなみに、処理をステップ実行で確認すると分かりますが、この時点では画面上の選択状態と実際の選択セルに違いが生じます。
これは画面更新が行われていないために発生する現象です。

その後のセル選択によって画面更新が行われるため処理上は問題ありませんが、もし処理を変更して画面更新が行われなくなる場合には、画面更新のコードを1行追加することで対策できます。

'選択状態の画面更新(処理上は不要でOK)
'Application.ScreenUpdating = True

具体的には、このコードを直後に挿入するだけで画面更新が行われます。

    'フィルタ条件一致有無の判定(集計行がある場合は3にする)
    If Selection.Cells.Count >= 2 Then
        '選択をデータ範囲のみにする
        Intersect(.DataBodyRange, Selection).Select
        '抽出データがある場合の処理

ここでは、フィルタ条件に一致するデータが存在するかどうかを判定しています。
仕様上、見出しセルは必ず選択されるため、選択セルの個数が2以上であれば条件一致のデータが存在すると判断します。
逆に選択セルが1個のみの場合は、条件に一致するデータがなかったと判断します。
なお、集計行があるテーブルでは選択セルが1つ増えるため、条件式の「2」の部分を「3」に修正してください。

抽出条件に一致するデータが選択されている場合は、実際の選択範囲とデータ範囲を Intersect メソッドで突き合わせ、データ範囲のみを選択状態にしています。
この後は、選択状態のセルに対して必要な処理を作成してください。

    Else
        '抽出データがない場合の処理
        Debug.Print "抽出データなし"
    End If

ここでは、抽出条件に一致するデータが存在しなかった場合の処理を作成します。
特に処理が不要であれば、この部分の追加処理は省略して構いません。
また、例コードにあるイミディエイト出力も削除して問題ありません。