いきなり答える備忘録

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

(Excel)COUNTIF関数で複数範囲(飛び飛び)をカウントする

 ExcelのCOUNTIF関数では複数行複数列の範囲を指定してカウントできるものの、基本的に飛び飛びの(離れた)範囲を指定してカウントすることができないため少し工夫が必要になります。
 ここでは2つの例を試してみます。

範囲の数だけCOUNTIF関数を繰り返して足す方法

 次の画像ではH3セルに式を入力し、左側の表のうち英語と国語の列(C,E列)にある「A」の数をカウントしています。

 H3セル

=COUNTIF(C3:C7,"A")+COUNTIF(E3:E7,"A")

 単純にそれぞれの列をCOUNTIF関数でカウントして足し算しています。
 もちろんカウントする各範囲の行数や列数は異なっていても問題ありません。



 1つのCOUNTIFで複数行複数列をカウントすることは可能なので、隣接する列のカウントを1つにまとめることができます。
 次の画像ではC,E,F列の「A」の数をカウントしていますがE,F列は隣接しているので1つにまとめることができ、COUNTIF関数は2つで済んでいます。

 H3セル

=COUNTIF(C3:C7,"A")+COUNTIF(E3:F7,"A")

COUNT/IF/VSTACK関数の併用で対応する方法

 3つの関数を組み合わせて代替する方法です。VSTACKはHSTACKに代えてもOKです。
 次の画像では上記の例と同様にC,E列の「A」の数をカウントしています。

 H3セル

=COUNT(IF(VSTACK(C3:C7,E3:E7)="A",1))

 VSTACK関数を使い2つの範囲を縦に並べたものを取得しています。さらにIF関数で「A」を数値の1に変換し、最後にCOUNT関数で数値(1)の数をカウントしています。カウントする範囲が多くなってもカンマでつなぐだけで指定でき、式が長くなりにくいのがメリットです。
 ただしCOUNTIF関数を使っていないのでワイルドカードが使えません。また、「FALSE」や「#N/A」エラーをカウントするのには使えない(修正は可能)ことが注意点です。後者の理由については以下で補足しています。



 つながっている複数行複数列の範囲は1つの範囲として指定できます。
 これは上記のCOUNTIF関数の例(2番目の画像)と同様です。

 H3セル

=COUNT(IF(VSTACK(C3:C7,E3:F7)="A",1))

 


 それぞれの範囲の行数、列数は一致しなくても問題ありません(COUNTIF関数の例でも同様です)。
 次の画像では上の表の2行3列の範囲と下の行の3行4列の範囲のすべての「A」の数をカウントしています。

 H3セル

=COUNT(IF(VSTACK(C3:E4,C7:F9)="A",1))

 


 ここからは補足ですが、上の式のVSTACK関数の部分だけを実行すると次のようになります。
 2つの表を縦につなげた結果が得られていますが、上の表は3列しかないので右上の2つのセルに表示させるものがなく、「#N/A」エラーで埋められているのがわかります。



 また、上の式のIF関数内を実行した結果(COUNT関数だけを除いた結果)は次のようになります。
 IF関数により「A」は数値の1に変換されています。「B」「C」はFALSEに変換されています(IF関数内で変換先の値を指定していないため)。また、#N/Aエラーはそのままになっています。
 FALSEや#N/Aをカウントするのに使えないというのはこのためで、これらの値をカウントしたい場合はさらに別の値に変換しておく必要があります。ただし実例は省略します。



 なお、VSTACK関数をHSTACK関数に代えると次のようになります。
 表を横に並べた結果が得られますがそれ以外の点は変わりません。よって上記の式中のVSTACK関数はHSTACK関数に交換可能です。