VBAで自動化 VBA一覧 フィルタリング 抽出・検索処理

【VBA】フィルター後の可視セルに入力する方法|非表示行を除外する安全な実装例

Excel業務では、オートフィルターでデータを抽出したあと、
「表示されている行だけに値を入力したい」「抽出結果にだけフラグやコメントを入れたい」
といった場面が頻繁に発生します。

しかしVBAで実装しようとすると、次のような問題に直面しがちです。

  • フィルター後に入力したつもりが、非表示行にも書き込まれている
  • 可視セルにまとめて入力したらエラーが出る
  • 1行目だけ書き換わり、他の行は反映されない
  • 抽出件数が0件でマクロが停止する

この記事では、VBAでフィルター後の「可視セル」にだけ入力する方法を、
基礎から実務で安全に使える設計まで、コード例とともに徹底解説します。

✅ VBAで「可視セルに入力」が難しい理由

※ここを理解していないと、コードが必ず不安定になります。

オートフィルターで抽出された行は、
削除されているのではなく「非表示」になっているだけです。

そのため、次のようなコードを書くと問題が発生します。

Range("D2:D100").Value = "完了"

このコードは、

  • 表示行
  • 非表示行

すべてに値を書き込んでしまう ため、
「抽出結果だけに入力したい」という要件を満たせません。


✅ 可視セルにだけ入力する基本原則

※この記事全体の前提となる考え方です。

VBAで可視セルを扱うときは、必ず次を意識します。

  • フィルター後は SpecialCells(xlCellTypeVisible) を使う
  • 可視セルが0件の可能性を考慮する
  • 連続範囲として扱えないケースがある

この前提を踏まえたうえで、具体的な実装方法を見ていきます。


✅ 可視セルに同じ値を一括入力する基本パターン

※最も使用頻度が高いケースです。

・基本コード例

Sub InputToVisibleCells_Basic()

    Dim rng As Range
    
    On Error Resume Next
    Set rng = Sheet1.Range("D2:D100").SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    
    If rng Is Nothing Then
        MsgBox "入力対象のデータがありません"
        Exit Sub
    End If
    
    rng.Value = "完了"

End Sub

・コード解説

  • SpecialCells(xlCellTypeVisible)
    → フィルター後に表示されているセルのみ取得
  • 可視セルが0件の場合はエラーになるため、Nothing判定が必須
  • rng.Value = "完了" で、可視セルすべてに同じ値を入力

✅ 可視セルに入力できない代表的な失敗例

※多くの人がここでつまずきます。

・失敗例:エラー1004が発生する

Sheet1.Range("D2:D100").SpecialCells(xlCellTypeVisible).Value = "完了"

なぜ失敗するのか

  • 可視セルが「不連続な範囲」になることがある
  • Excelの内部仕様上、一括代入ができないケースがある

対策

  • 事前にRangeオブジェクトとして受ける
  • または1セルずつ処理する



✅ 可視セルを1行ずつ処理して入力する方法

※柔軟性が最も高い方法です。

・For Eachを使った基本例

Sub InputToVisibleCells_ByRow()

    Dim cell As Range
    Dim rng As Range
    
    On Error Resume Next
    Set rng = Sheet1.Range("D2:D100").SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    
    If rng Is Nothing Then Exit Sub
    
    For Each cell In rng
        cell.Value = "完了"
    Next cell

End Sub

・実務でのメリット


✅ 可視セルの行番号を使って別列に入力する方法

※「抽出行だけ別の列を更新したい」場合に必須です。

・行番号を基準に入力する例

Sub InputByVisibleRowNumber()

    Dim r As Range
    
    On Error Resume Next
    Set r = Sheet1.Range("A2:A100").SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    
    If r Is Nothing Then Exit Sub
    
    For Each r In r
        Sheet1.Cells(r.Row, "E").Value = "対象"
    Next r

End Sub

・ここが重要


✅ ヘッダー行を除外して可視セルに入力する考え方

※実務ではほぼ必須です。

・Offsetでヘッダーを避ける

Set rng = Sheet1.Range("A1:A100").Offset(1).Resize(99)

これを可視セル取得と組み合わせます。
参考:【Excel】OFFSET関数の使い方をわかりやすく解説|基礎から応用まで


・ヘッダー除外版コード例

Sub InputToVisibleCells_WithoutHeader()

    Dim rng As Range
    
    On Error Resume Next
    Set rng = Sheet1.Range("A2:A100").SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    
    If rng Is Nothing Then Exit Sub
    
    rng.Value = "チェック済"

End Sub

✅ 可視セルが0件のときの正しい対処

※自動処理では必須の設計です。

・安全な判定パターン

If rng Is Nothing Then
    MsgBox "対象データがありません"
    Exit Sub
End If

・なぜ重要か


✅ 複数列の可視セルに同時入力する方法

※フラグ+日付などでよく使います。

・例:状態と更新日を同時に入力

Sub InputMultipleColumns()

    Dim r As Range
    
    On Error Resume Next
    Set r = Sheet1.Range("A2:A100").SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    
    If r Is Nothing Then Exit Sub
    
    For Each r In r
        Sheet1.Cells(r.Row, "D").Value = "完了"
        Sheet1.Cells(r.Row, "E").Value = Date
    Next r

End Sub

✅ 可視セル入力後の状態管理(実務向け)

※処理後の混乱を防ぎます。

・フィルター解除の例

If Sheet1.FilterMode Then
    Sheet1.ShowAllData
End If

・なぜ必要か

  • 次の処理への影響を防ぐ
  • ユーザー操作時の誤解を防止

✅ 処理速度と安定性を高める設定

※データ量が多い場合は必須です。

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

' 可視セル処理

Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

✅ 可視セル入力が活躍する実務シーン

※応用イメージを持つことが重要です。

  • 抽出対象への一括ステータス付与
  • 対応済みフラグの更新
  • レビュー結果の書き込み
  • 処理済みデータのマーキング

これらの処理は、
UiPathなどのRPAと組み合わせることで完全自動化 が可能です。


✅ 実務でよくある失敗例

※避けるだけで品質が一段上がります。

  • 可視セル取得前のエラー未対策
  • ヘッダー行への誤入力
  • ActiveCell依存の処理
  • フィルター解除忘れ
  • 一括代入によるエラー

✅ まとめ:VBAでフィルター可視セルに入力する正解設計

  • フィルター後は必ず可視セルを取得
  • SpecialCells(xlCellTypeVisible) が基本
  • 0件チェックは必須
  • 行番号を使えば柔軟な入力が可能
  • 実務では1行ずつ処理する設計が安定

「可視セルにだけ入力する」という処理は、
一見シンプルに見えて 実務品質が強く問われるVBA処理 です。

正しい考え方と安全なコード構成を身につけることで、
ミスのない、再利用性の高いExcelツールを構築できます。

ぜひ、日々の業務に活用してください。

参考:【VBA】条件に一致するセルを複数取得する方法|Find・For Each・SpecialCells

    -VBAで自動化, VBA一覧, フィルタリング, 抽出・検索処理