Excelで「上と同じ値なのに空白セル」を埋めてフィルター可能にするVBAマクロ

VBA

はじめに

業務で受け取るExcelの一覧表って、見た目を優先して同じ値のセルが空白になっていることありませんか?

例えばこんな表です。

部署担当者
営業A
B
C
開発D
E

人間が見る分には問題ないのですが、この状態でExcelのフィルターやピボットを使おうとすると、

  • 空白セルは「営業」として扱われない
  • 条件で絞り込んでも期待通りに抽出できない
  • PowerQuery前処理が面倒になる

といった問題がよく起きます。

毎回手作業でコピーして埋めるのも非効率なので、
空白セルを上のセルの値で埋めるVBAマクロを作りました。


やりたいこと

  • 選択範囲を対象
  • 列単位で上から下へ処理
  • 空白セルがあれば1つ上のセルの値をコピー
  • 複数列対応

マクロコード

Sub FillBlankWithAboveCell()
    Dim rng As Range
    Dim col As Range
    Dim cell As Range
    
    ' 選択範囲を取得
    Set rng = Selection
    
    ' 列ごとに処理
    For Each col In rng.Columns
        ' 上から順にセルを確認
        For Each cell In col.Cells
            ' 空白セルなら1つ上のセルをコピー
            If cell.Value = "" Then
                If cell.Row > col.Cells(1).Row Then
                    cell.Value = cell.Offset(-1, 0).Value
                End If
            End If
        Next cell
    Next col
    
    MsgBox "空白セルを上のセルで埋めました。"
End Sub

使い方

  1. Alt + F11 でVBAエディタを起動
  2. 「挿入」→「標準モジュール」
  3. コードを貼り付け
  4. Excelに戻って対象範囲を選択
  5. マクロを実行

これで選択範囲内の空白セルが上の値で埋まります。


処理仕様

  • 値のみコピー(数式はコピーしない)
  • 先頭セルが空白の場合はスキップ
  • 複数列の同時処理に対応
  • 選択範囲ベースなので対象制御が簡単

想定ユースケース

  • 帳票系Excelの前処理
  • CSVインポート後の整形
  • フィルター・ピボット前のデータ補完
  • PowerQuery投入前の正規化
  • RPA前処理

補足(運用で気をつけた点)

  • 「見た目上は同じ値」という前提なので、意味的に空白が正しい列には使わない
  • 元データはバックアップ推奨(Undo効かない場合あり)
  • 数万行以上は高速化版(配列処理)を作ると快適

まとめ

Excelは見た目よりも「セルの中身」がすべて。
人間には同じに見えても、空白は空白として扱われます。

フィルターや分析前に値を埋めておくだけで、後続作業がかなり安定するので
似たような帳票Excelに悩んでいる方の参考になれば幸いです。

コメント

タイトルとURLをコピーしました