残業を減らす!Officeテクニック
知らぬ間にエクセルの「条件付き書式」が増殖!? ブックが重くなるのを回避するテク
2025年9月8日 06:55
Excelの「条件付き書式」は、業務の効率化に欠かせない機能ですよね。例えば「売上が目標未達なら赤字で表示」、「納期が近づいたら背景を黄色にする」など、自動的に書式が変更されるので、ひと目で状況を把握できるようになります。
ところが、実際の現場では「知らないうちにルールが増えている」、「いつも使っているファイルの動作が遅くなった」という声もよく聞きます。この現象には理由があります。条件付き書式の“条件式”に相対参照を使っていることが原因です。
条件付き書式は“書式”であるため、コピー&ペーストを繰り返しているうちに増殖してしまうのは仕方ないのですが、条件式まで勝手に書き換わるのは困ります。この例では、TODAY関数と比較していたのはセルD2でした。いつの間にか「D12」「D13」と比較する条件式が発生してしまっています。
この問題の解決策は“条件式”に相対参照を使わないこと。今回は、勝手に増殖する条件付き書式を、INDEX関数を利用して増殖を回避し、メンテナンスしやすくする方法を紹介します。
条件付き書式が増える現象を確認する
条件付き書式が増殖する主な原因は、コピー&ペーストの繰り返しです。数式を利用した条件付き書式で、関数と組み合わせている場合や上のセルと比較する論理式などで起こりがちです。
以下は、条件付き書式を使って「期限が本日より前、かつステータスが未完了」の行を強調しています。条件式は以下の通りです。
=AND($D2<TODAY(), $E2="未完了")
この表に条件付き書式が設定されていることを知っていて、新しい行を追加する場合、入力済みの行をコピーして内容を書き換えるのではないでしょうか。試しに操作して、条件付き書式の状態を見てみましょう。
ありがちな現象ですよね。運用している時間が長い場合、書式の適用先までずれてしまい、定期的なメンテナンスに苦労している人もいるのではないでしょうか。INDEX関数を使ってみてください。
条件式をINDEX関数に書き換える
INDEX関数は、配列(セル範囲)のうち、指定した行番号や列番号の位置にある値を取り出せる関数です。条件付き書式の条件式として利用するなら「特定の列のうち、その書式を適用する行」を取り出すことが多いでしょう。前述の条件式を以下のように書き換えます。
=AND(INDEX($D:$D,ROW())<TODAY(),INDEX($E:$E,ROW())="未完了")
TODAY関数と比較する式と、「未完了」かどうかを判定する式をINDEX関数に置き換えています。「$D:$D」は、D列のことです。「ROW()」は、現在の行番号を返します。つまり、D列のうち、現在の行の値が取り出されます。
実際に置き換えて、先ほどと同様に行のコピー&ペーストを繰り返してみましょう。
適用範囲は広めに設定しておく
行のコピー&ペーストに伴って、条件付き書式もコピーされてしまいますが、条件式は変化していません。メンテナンスの負荷はかなり減らせますよね。あらかじめ[適用先]を広めに設定しておけば、その手間も省けます。
INDEX関数は引数も少なく、条件式に組み込みやすいと思います。条件付き書式の増殖に悩んでいる方は、INDEX関数を取り入れて運用の安定性を高めてみてはいかがでしょうか。