Excel業務では、オートフィルターでデータを抽出したあと、
「表示されている行だけに値を入力したい」「抽出結果にだけフラグやコメントを入れたい」
といった場面が頻繁に発生します。
しかしVBAで実装しようとすると、次のような問題に直面しがちです。
- フィルター後に入力したつもりが、非表示行にも書き込まれている
- 可視セルにまとめて入力したらエラーが出る
- 1行目だけ書き換わり、他の行は反映されない
- 抽出件数が0件でマクロが停止する
この記事では、VBAでフィルター後の「可視セル」にだけ入力する方法を、
基礎から実務で安全に使える設計まで、コード例とともに徹底解説します。
目次
- ✅ VBAで「可視セルに入力」が難しい理由
- ✅ 可視セルにだけ入力する基本原則
- ✅ 可視セルに同じ値を一括入力する基本パターン
- ・基本コード例
- ・コード解説
- ✅ 可視セルに入力できない代表的な失敗例
- ・失敗例:エラー1004が発生する
- ✅ 可視セルを1行ずつ処理して入力する方法
- ・For Eachを使った基本例
- ・実務でのメリット
- ✅ 可視セルの行番号を使って別列に入力する方法
- ・行番号を基準に入力する例
- ・ここが重要
- ✅ ヘッダー行を除外して可視セルに入力する考え方
- ・Offsetでヘッダーを避ける
- ・ヘッダー除外版コード例
- ✅ 可視セルが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
・実務でのメリット
- 行ごとに条件分岐ができる
- 入力内容を動的に変えられる
- エラーが起きにくい
参考:【VBA】条件に一致するセルを複数取得する方法|Find・For Each・SpecialCells
✅ 可視セルの行番号を使って別列に入力する方法
※「抽出行だけ別の列を更新したい」場合に必須です。
・行番号を基準に入力する例
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
・ここが重要
- 可視セルの「行番号」は元データの行番号
- 別列への入力も安全に行える
参考:【VBA】最終行番号を取得する方法
✅ ヘッダー行を除外して可視セルに入力する考え方
※実務ではほぼ必須です。
・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
・なぜ重要か
- 0件はエラーではなく「正常な結果」の場合が多い
- RPA連携時は特に重要
参考:【VBA】フィルター結果が0件のときに安全に処理する方法|エラーを出さずにスキップする
✅ 複数列の可視セルに同時入力する方法
※フラグ+日付などでよく使います。
・例:状態と更新日を同時に入力
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ツールを構築できます。
ぜひ、日々の業務に活用してください。