2つのグループを比較し、片方にしか存在しない値に「×」を表示する数式の作成方法について解説していきます。
前半は、「「×」を表示する可能性がある全てのセルに数式を入力して実現する方法」について解説し、後半は、「スピルを活用して、それぞれのグループに対し、1つずつの数式のみで増減にも対応させる方法」について解説していきます。
後半の方法ですと、誤って数式を削除することが減るため、スピルに対応している場合はおすすめです。
全てのセルに数式を入力する
まずは、「「×」を表示する可能性がある全てのセルに数式を入力して実現する方法」について解説していきます。
初めに、どのような条件の時に、値の隣に「×」を表示するのかを明確にする必要があります。
まずは、以下のAグループの先頭行について考えていきます。
セルC3に「×」を表示するかどうかは、以下の条件から判断できます。
・セルB3の値がE列に1つも存在していない場合に「×」を表示する
指定した値が指定した範囲内にいくつ含まれているのかは、COUNTIF関数を用いて求めることができます。
=COUNTIF(範囲, 検索条件)
// 範囲:確認する範囲
// 検索条件:範囲から数える条件
実際に、COUNTIF関数を用いて数えてみると、以下のような数式になります。
=COUNTIF(E:E,B3)
この数式の結果が0の時に、「×」を表示していきます。
そのため、この結果を元にIF関数で分岐させる必要があります。
=IF(論理式, 値が真の場合, 値が偽の場合)
// 論理式:TRUEもしくはFALSEを表す式
// 値が真の場合:論理式がTRUEの場合に表示する内容
// 値が偽の場合:論理式がFALSEの場合に表示する内容
実際に、先ほどのCOUNTIF関数と組み合わせたものが以下になります。
=IF(COUNTIF(E:E,B3)=0,"×","")
ちなみに、数値の0はFALSE、0以外はTRUEという意味にもなるため、以下のようにも表現することができます。
=IF(COUNTIF(E:E,B3),"","×")
// 「×」の位置が逆になる
この数式を表の最終行までコピーすることで、相対参照で反映することができます。
※E列に関して、E3:E14などと行番号を指定している場合は、「$E$3:$E$14」のように絶対参照にする必要があります。
次は、Bグループの判定になります。
Bグループに関しても先ほどと同様に、以下のような数式で実現することができます。
=IF(COUNTIF(B:B,E3),"","×")
それぞれ1つのセルのみに数式を入力する
次に、「スピルを活用して、それぞれのグループに対し、1つずつの数式のみで増減にも対応させる方法」について解説していきます。
スピルというのは、数式を入力したセルから数式の結果を溢れて表示させる機能のことになります。
Excelのバージョンが2019以前のものに関しては対応していないため、実現することができません。
では、そんなスピルを活用して、以下の黄色のセルのみに数式を入力して実現する方法について解説していきます。
まずは、先ほど作成した数式から実現方法を考えていきます。
一度、先ほどの数式に関して、セルC3のみに残します。
=IF(COUNTIF(E:E,B3),"","×")
こちらの数式に関しては、セルB3のみを確認しています。
スピルを活用する場合、このセルB3を複数範囲にします。
例えば、100行目までデータの増減に対応させる場合、以下のような数式になります。
=IF(COUNTIF(E:E,B3:B100),"","×")
実際に数式を入力すると、以下のように表示され、16行目以降が「×」になってしまいます。
COUNTIF関数の検索条件に関しては、空白のセルを指定した場合、「0」という数値として扱われてしまいます。
そのため、E列には空白のセルを含んでいたとしても、「0」という値が存在しないため、「×」が表示されたということになります。
「×」を表示しない対策として、条件を加えていきます。
その条件は、以下の内容になります。
・セルB3からB100に関して空白の場合は何も表示しない
そのため、更に、外側にIF関数で分岐させます。
=IF(B3:B100="","",IF(COUNTIF(E:E,B3:B100),"","×"))
IF関数を繰り返し使いたくない場合は、IFS関数がおすすめです。
=IFS(論理式1, 値が真の場合1, [論理式2, 値が真の場合2], [論理式3, 値が真の場合3], …)
// 論理式:TRUEもしくはFALSEを表す式
// 値が真の場合:論理式がTRUEの場合に表示する内容
// → FALSEの場合は次の条件が確認される(論理式1 → 論理式2 → 論理式3 → …)
// 全ての条件を満たさない場合は、「#N/A」というエラーになる
実際に活用すると、以下のような数式になります。
=IFS(B3:B100="","",COUNTIF(E:E,B3:B100),"",TRUE,"×")
// 最後の論理式をTRUEにすることで、「その他」という条件を指定できる
この数式を入力すると、以下のように表示されます。
ただ、この状態ですと、3行目を削除した場合に数式も消えてしまいます。
そのため、より数式が消されてしまう可能性を減らすため、数式をセルC2に移動します。
移動する際に、条件の範囲に関しても、以下のように変更する必要があります。
=IFS(B2:B100="","",COUNTIF(E:E,B2:B100),"",TRUE,"×")
ただ、このままですと、先頭行に関してもBグループ内容と比較され、「×」が表示されてしまいます。
そのため、以下のいずれかの条件を加える必要があります。
①B列の値が「A」の場合は何も表示しない
②2行目の場合は何も表示しない
①の場合は、項目名を変更する度、数式を修正する必要が出てくるため、こちらでは、②の方法について解説していきます。
行番号を確認するには、ROW関数を活用します。
=ROW(参照)
// 参照:行番号を取得したいセルを指定
実際にROW関数を組み合わせて表現した数式は、以下になります。
=IFS(ROW(B2:B100)=2,"",B2:B100="","",COUNTIF(E:E,B2:B100),"",TRUE,"×")
このようにして、Aグループに関しては1つの数式のみで実現することができました。
次は、Bグループの判定になります。
Bグループに関しても先ほどと同様に、以下のような数式で実現することができます。
=IFS(ROW(E2:E100)=2,"",E2:E100="","",COUNTIF(B:B,E2:E100),"",TRUE,"×")
まとめ
こちらのシートを利用する人が全員スピルに対応している環境の場合は、後者のスピルを活用した方法の方が、数式が少なく、より保守的で良いかと思います。
スピルを使用する際、検索が必要な数式に関して、必要以上に範囲を広くしてしまうと、処理が重たくなる原因に繋がります。
そのため、指定する範囲に関しては、必要に応じて、今回のように「B2:B100」などと限られた範囲のみを指定した方が良いかと思います。