いきなり答える備忘録

Google Workspace・Microsoft 365・LibreOfficeなどに関するメモ

(Gスプレッドシート)空白セルを上にある値で埋める

 Googleスプレッドシートで、表内の空白セルをすべて「上にある直近の値」に置き換える方法についてです。
 1つ1つ手作業でやると非常に面倒ですが、少し工夫すれば一括で処理することができます。

  • 関数を使って空白セルを「上にある値」で埋めた結果を得ることができます。
  • フィルタを使って実現することもできます。

関数を使う方法

IF関数を使う方法

 もっとも簡単な方法です。
 次の画像ではB2:B12の範囲が表になっていますが、空白セルが多数含まれています。
 そこでD2セルに「=IF(B2="",D1,B2)」という式を入力します。

 D2セル

=IF(B2="",D1,B2)

 B2セルが空白なら1つ上のD1セルを参照し、そうでなければB2セルの値をそのまま出力するという式です。
 B列の値が空白であるときの参照先が(B列の値ではなく)D列であるというのがポイントです。



 確定するとD2セルの値は「青森県」となりました。



 そのままD2セルの右下にある青いマル(フィルハンドル)をD12セルまでドラッグすると…



 式がコピーされ、空白セルが「上にある値」で埋められた結果を得ることができました。

SCAN/LAMBDA関数を使う方法

 ここではD2セルに式を入力するだけで、表内の空白セルを「上にある値」で埋めた結果を得ています。

 D2セル

=SCAN(B2,B2:B12,LAMBDA(a,b,IF(b="",a,b)))

 SCAN/LAMBDA関数を使ったやや難解な式ですが、これは次のように機能します。

  • B2セルの値をaと、B2:B12の範囲をbと名付ける
  • bの1つ1つの値について空白かどうかIF関数でチェックする
  • 空白ならaをそのまま表示する。空白でなければその値を表示してその値を新たなaとする
これによりB3セル以降に空白が続くなら「青森県」が表示され続け、空白でないセルがあれば今度はその値に置き換えられ表示されていく、というわけです。



 なお、最初のIF関数の例では各セルから上方のセルを参照しているので1行目に式を置くことができません(ただし単に「=B1」などとすれば済みます)が、このやり方の場合は上方のセルを参照しているわけではないので、1行目に式を置いても破綻しません。

 D1セル

=SCAN(B1,B1:B11,LAMBDA(a,b,IF(b="",a,b)))

フィルタを使う方法

 フィルタを使うことで表内の空白セルに直接入力する方法です。
 まずは表の範囲(B2:B12)を選択して、メニューから「データ」→「フィルタ表示」→「新しいフィルタ表示を作成」と選択します。
(※この例の場合、表が小さいため表の範囲を自動選択してくれません。よって表を全選択した状態でメニュー操作をする必要があります)


 フィルタがかかった状態となります。
 B2セルが見出しとして扱われていますが、特に気にする必要はありません。


 B2セルの右側にあるマークをクリックして、メニューから「条件でフィルタ」→「空白」と選択します。


 メニューを下にスクロールさせていきOKボタンをクリックします。


 空白セルが選択された状態になります(見出しとして扱われているB2セルも残っています)。
 ここで、最初の空白セルであるB3セルに、その1つ上のセル番地を入力します。つまり「=B2」と入力すればOKです。
 フィルタがかかっている状態だと「最初の空白セル」の番地を間違えやすいので注意が必要です。



 確定したら、いま入力したばかりのB3セルの右下にある青いマル(フィルハンドル)を最後の空白セル(B12セル)までドラッグします。
 これにより値が入っているセルを書き換えることなく、空白セルだけを「1つ上のセルを参照する式」で置き換えることができます。



 空白セルがすべて値で埋まりました。


 あとはメニューから「データ」→「フィルタ表示」→「フィルタ表示をすべて削除」と選択してフィルタを解除します。



 以上で完了です。
 ただし、表内は文字列と関数が混在する状態になっていますので、コピーして「値のみ貼り付け」を行い、すべて文字列に置き換えておくのがよいでしょう。

 また、表が複数列にわたる場合は1列ずつ作業しなければならず効率が悪いため、関数を使うやり方の方が簡単です。