オーロラさんの勉強帳

IT企業勤務。データベース、Excel、Excel VBA、ネットワーク、LinuxなどIT関連のことを主に書いていきます。少しでもお役に立てたら幸いです。

【Excel】COUNTIFS関数の使い方 ~複数の検索条件に一致するデータの件数を数える。データの存在確認、重複確認をする。~

本記事ではExcelCOUNTIFS関数の使用方法を説明します。

以下の記事で紹介したCOUNTIF関数では1つの条件しか指定ができませんが、COUNTIFS関数は複数の条件を指定して、その条件に一致する件数を数えることができます。

auroralights.jp


COUNTIFS関数とは。COUNTIFS関数の書式

COUNTIFS関数は、指定した範囲の中で検索条件に一致するデータの件数を数える関数です。(検索条件に一致するデータがなければ0を返します)

COUNTIF関数1つの条件に一致する件数を数える関数なのに対して、COUNTIFS関数2つ以上の条件に一致する件数を数える関数です。
検索条件には、比較演算子やワイルドカードを使うことができます。

COUNTIFS関数の書式は以下の通りです。

COUNTIFS関数の書式
=COUNTIFS(範囲1,検索条件1,範囲2,検索条件2,...)

範囲1、検索条件1、範囲2、検索条件2は必須となります。範囲3、検索条件3以降は省略可能です。


以下画像では、COUNTIFS関数を使って、住所が兵庫県神戸市の男性、女性の件数を数えています。
f:id:auroralights:20211217212549p:plain

性別が男性かつ住所が兵庫県神戸市のデータ件数は『=COUNTIFS($C$3:$C$17,"男",$E$3:$E$17,"兵庫県神戸市")』で求めています。

範囲1、検索条件1には、『$C$3:$C$17,"男"』、範囲2、検索条件2には『$E$3:$E$17,"兵庫県神戸市"』を指定して、性別が男性かつ住所が兵庫県神戸市のデータ件数を数えています。

性別が女性かつ住所が兵庫県神戸市のデータ件数は『=COUNTIFS($C$3:$C$17,"女",$E$3:$E$17,"兵庫県神戸市")』で数えています。

COUNTIFS関数のセル範囲を指定するポイント

COUNTIFS関数で範囲を指定する際は、以下のポイントを意識します。

  • 範囲1、範囲2...のセル範囲は、検索条件に一致するデータがある1つの列で範囲を指定する (複数の列にまたがる範囲を指定しない)
  • 範囲1、範囲2...のセル範囲は、開始行、終了行をあわせる

f:id:auroralights:20211219160820p:plain

上記画像の場合は、「性別が男性かつ住所が兵庫県神戸市かつ購入回数が10回以上」という3つの範囲、検索条件で件数を数えています。
範囲1~3はそれぞれ、検索条件に一致するデータがある該当の1列を指定しています。
範囲1~3は開始行3、終了行17を指定しており、範囲1「$C$3:$C$17」、範囲2「$E$3:$E$17」、範囲3「$H$3:$H$17」をして指定ます。

複数の検索条件に一致するデータの存在を確認する方法

COUNTIFS関数でデータ群の中に複数の検索対象に一致するデータが存在するかどうかを確認することができます。COUNTIFSで0を返すか、1以上を返すかで存在確認をします。

f:id:auroralights:20211219163437p:plain
上記画像では、セルB3:D17の部品一覧の中にセルF3:H9のデータが何件存在しているかどうかを、COUNTIFS関数を使って数えて、I列に件数を返しています。
I列の数値が0のデータは、部品一覧に存在しないことを表しています。

※部品一覧は、部署コード、部品コード、仕入先コードの組み合わせで一意となります。

セルI3の数式は以下のようになっています。
=COUNTIFS($B$3:$B$17,F3,$C$3:$C$17,G3,$D$3:$D$17,H3)
範囲1「$B$3:$B$17」で検索条件「F3」かつ、範囲2「$C$3:$C$17」で検索条件「G3」かつ、範囲3「$D$3:$D$17」で検索条件「H3」に一致するデータが何件あるかをCOUNTIFS関数で数えています。
I列が「0」の場合はデータが存在いないことを表しています。I列が「1」以上の場合はその数値分のデータが存在することを表しています。


複数の検索条件に一致するデータの重複を確認する方法

COUNTIFS関数で、データ群の中で重複しているデータを探すことができます。COUNTIFS関数は条件を複数指定できるため、複数の条件で一意になるデータが重複しているかどうかを調べることができます。
COUNTIFS関数で2以上の値が返ってきたら重複している状態です。

f:id:auroralights:20211219165231p:plain

上記画像では、部署コード、部品コード、仕入先コードで一意となる部品一覧で、部署コード、部品コード、仕入先コードを組み合わせたデータが、一覧の中で重複しているかどうかを確認しています。

セルE3では以下の数式で、部署コード(B3)、部品コード(C3)、仕入先コード(D3)を組み合わせたデータが部品一覧で重複しているかどうかを調べています。
=COUNTIFS($B$3:$B$25,B3,$C$3:$C$25,C3,$D$3:$D$25,D3)

範囲1「$B$3:$B$25」検索条件1「B3」、範囲2「$C$3:$C$25」、検索条件2「C3」、範囲3「$D$3:$D$25」、検索条件3「D3」に一致するデータの件数を返しています。
E列の値が「0」の場合はそのデータ存在しない。「1」の場合は重複せずに1件のみ存在している。「2」以上の場合はその数値だけ重複していることを表しています。

ポイントは、数式をコピーして利用するので検索範囲を絶対参照、検索対象を相対参照とすることです。

COUNTIFS関数の検索条件に使える『比較演算子』・『ワイルドカード』

COUNTIFS関数の引数の『検索条件』には、以下の比較演算子・ワイルドカードを使うことができます。比較演算子・ワイルドカードを使用する場合は検索条件とあわせて『"(ダブルクォーテーション)』で囲みます。

比較演算子 説明 使用例
= 等しい "=10"
<> 等しくない "<>男"
より大きい ">19"
< より小さい "<20"
>= 以上 ">=20"
<= 以下 ”<=19"

ワイルドカード 説明 検索条件の使用例
* 任意の文字列 "A*"
? 任意の1文字 "?田"

比較演算子、ワイルドカードの使い方については、以下のCOUNTIF関数の記事で説明していますので、ご参照ください。
auroralights.jp

【Excel VBA スタンダード】参照渡し(ByRef)と値渡し(ByVal)の分かりやすい使い方の解説 (試験対策)

本記事ではVBA エキスパート『Excel VBA スタンダード』の試験範囲でもある『参照渡し』『値渡し』の使い方について、分かりやすく解説します。

参照渡しと値渡しのポイント

  1. 参照渡しはByRef 、値渡しはByValReference(参照)のRef、Value(値)のValと覚えましょう〉
  2. 参照渡し(ByRef):呼び出し元から呼び出し先に参照渡しで引数(変数)を渡した場合、呼び出し先で引数の値を変更すると、呼び出し元の変数の値も変更されます。
  3. 値渡し(ByVal):呼び出し元から呼び出し先に値渡しで引数(値)を渡した場合、呼び出し先で引数を変更しても、呼び出し元の変数は変更されません。
  4. 参照渡しは呼び出し先で引数が変更されると呼び出し元の変数も変更されるが、値渡しは呼び出し先で引数が変更されても呼び出し元の変数は変更されない。
  5. 呼び出し先が参照渡しで受け取るのか、値渡しで受け取るのか、引数の定義が重要です。
  6. 引数の定義にByRef、ByValを指定しなかった(定義を省略した)場合は、ByRef(参照渡し)が指定されます。

参照渡しと値渡渡しの動作 (呼び出し先でExcel⇒Wordに変更した場合の呼び出し元の変数の状況)


画像の通り、呼び出し先の引数を変更した場合、参照渡しでは呼び出し元の変数も変更されます。値渡しでは呼び出し元の引数は変更されません



実際のコードで参照渡し値渡しの動作を見てみましょう。

参照渡しの動作を確認するVBAのサンプルコード

以下のコードではsampleRef1からsampleRef2を呼び出しています。
その際に変数bufを引数として渡しており、sampleRef2ではByRef(参照渡し)で受け取っています。

Sub sampleRef1()
    
    Dim buf As String
    buf = "Excel"
    Call sampleRef2(buf)
    MsgBox buf
    
End Sub
Sub sampleRef2(ByRef A As String)
    
    MsgBox A
    A = "Word"
    MsgBox A

End Sub

結果は以下の通りです。

1回目のMsgBox:Excel ※参照渡しで受け取った引数を表示
2回目のMsgBox:Word ※受け取った引数を変更して表示
3回目のMsgBox:Word ※参照渡しのため呼び出し元のbufも変更されている


値渡しの動作を確認するVBAのサンプルコード

以下のコードではsampleVal1からsampleVal2を呼び出しています。
その際に変数bufを引数として渡しており、sampleVal2ではByVal(値渡し)で受け取っています。

Sub sampleVal1()
    
    Dim buf As String
    buf = "Excel"
    Call sampleVal2(buf)
    MsgBox buf
    
End Sub
Sub sampleVal2(ByVal A As String)
    
    MsgBox A
    A = "Word"
    MsgBox A

End Sub

結果は以下の通りです。

1回目のMsgBox:Excel ※値渡しで受け取った引数を表示
2回目のMsgBox:Word ※受け取った引数を変更して表示
3回目のMsgBox:Excel ※値渡しのため呼び出し元のbufは変更されない


以上、参照渡しと値渡しの解説でした。
お読みいただきありがとうございました。

【Excel】COUNTIF関数の使い方 ~検索条件に一致するデータの件数を数える。データの存在確認、重複確認をする~

本記事ではExcelCOUNTIF関数の使用方法を説明します。

COUNTIF関数とは。COUNTIF関数の書式

COUNTIF関数とは、指定した範囲の中で検索条件に一致するデータの件数を数える関数です。(検索条件に一致するデータがなければ0を返します)
検索条件には、比較演算子やワイルドカードを使うことができます。
COUNTIF関数の書式は以下の通りです。

COUNTIF関数の書式
=COUNTIF(範囲, 検索条件)


以下画像では、COUNTIF関数を使って顧客名簿で男性の件数、女性の件数を求めています。
f:id:auroralights:20211204213613p:plain
男性の件数は「=COUNTIF($D$3:$D$11,"男")」、女性の件数は「=COUNTIF($D$3:$D$11,"女")」で求めています。
COUNTIF関数で、範囲「$D$3:$D$11」検索条件「男」もしくは「女」が何件あるかを求めています。


データの存在を確認する方法

COUNTIF関数でデータ群の中に検索対象のデータが存在するかどうかを確認することができます。

f:id:auroralights:20211204232654p:plain
上記画像では、D列の検索対象のデータが、範囲「B3:B33」の中に何件存在するかどうか確認しています。

以下数式はB3:B33のセル範囲の中にセルD3の『A100』が何件あるか存在るかを求めています。
=COUNTIF($B$3:$B$33,D3)


データの重複を確認する方法

COUNTIF関数でデータ群の中で重複しているデータを探すことができます。
f:id:auroralights:20211204233459p:plain
上記画像では、B3:B33の管理番号が何件あるかを調べて2件以上の値が返っていれば、データが重複していることを表しています。
範囲を絶対参照で固定し、検索対象を相対参照とすることで、固定した範囲「$B$3:$B$33」の中に検索対象が何件あるかを調べています。

以下数式は、B3の検索対象『A100』がセル範囲『B3:B33』の中で何件存在しているかを求めています。
=COUNTIF($B$3:$B$33,B3)
検索対象をB3、B4、B5・・・とすることで、セル範囲の中にそれぞれのデータが何件あるかを調べることができます。


ポイントは、数式をコピーして利用するので検索範囲を絶対参照、検索対象を相対参照とすることです。

COUNTIF関数の検索条件に『比較演算子』を使って件数を求める

COUNTIF関数の引数の『検索条件』には、以下の比較演算子を使うことができます。比較演算子を使用する場合は検索条件とあわせて『"(ダブルクォーテーション)』で囲みます。

比較演算子 説明 使用例
= 等しい "=10"
<> 等しくない "<>男"
より大きい ">19"
< より小さい "<20"
>= 以上 ">=20"
<= 以下 ”<=19"


以下画像ではCOUNTIF関数検索条件に『比較演算子』を使い件数を求めています。
f:id:auroralights:20211204221604p:plain

COUNTIF関数の検索条件に『=』を使った使用例

住所が兵庫県神戸市の顧客件数を以下数式で求めています。
=COUNTIF($F$3:$F$11,"=兵庫県神戸市")
※=を省略した「=COUNTIF($F$3:$F$11,"兵庫県神戸市")」でも結果は同じです。

COUNTIF関数の検索条件に『<>』を使った使用例

性別が男以外の顧客件数を以下数式で求めています。
=COUNTIF($D$3:$D$11,"<>男")

COUNTIF関数の検索条件に『>』を使った使用例

年齢が19歳より大きい顧客件数を以下数式で求めています。
=COUNTIF($E$3:$E$11,">19")

COUNTIF関数の検索条件に『<』を使った使用例

年齢が20歳より小さい顧客件数を以下数式で求めています。
=COUNTIF($E$3:$E$11,"<20")

COUNTIF関数の検索条件に『>=』を使った使用例

年齢が20歳以上の顧客件数を以下数式で求めています。
=COUNTIF($E$3:$E$11,">=20")

COUNTIF関数の検索条件に『<=』を使った使用例

年齢が19歳以下の顧客件数を以下数式で求めています。
=COUNTIF($E$3:$E$11,"<=19")


COUNTIF関数の検索条件に『ワイルドカード』を使って件数を求める

COUNTIF関数の引数の『検索条件』に以下のワイルドカードを使うことができます。ワイルドカードを使用する場合は検索条件とあわせて『"(ダブルクォーテーション)』で囲みます。


演算子 説明 検索条件の使用例
* 任意の文字列 "A*"
? 任意の1文字 "?田"


以下画像ではCOUNTIF関数検索条件に『ワイルドカード』を使い件数を求めています。
f:id:auroralights:20211204225804p:plain

COUNTIF関数の検索条件に『*』を使った使用例

顧客IDがAから始まる件数、顧客IDがBから始まる件数を以下数式で求めています。
=COUNTIF($C$3:$C$11,"A*")
=COUNTIF($C$3:$C$11,"B*")

Mailにdocomoを含む件数を以下数式で求めています。
=COUNTIF($G$3:$G$11,"*docomo*")
※上記の条件だとdocomo@ezweb.ne.jpも含まれるので、キャリアがdocomoのメールアドレスの件数を調べるためには、条件を「*@docomo*」や「*@docomo.ne.jp」とした方がいいですね。記事を書いているときには気が付きませんでした。

COUNTIF関数の検索条件に『?』を使った使用例

顧客名が「○田」のデータ件数を調べています。※○は任意の1文字のことです。
=COUNTIF($B$3:$B$11,"?田")


COUNTIF関数の使用方法について、紹介しました。
私はデータの存在確認、重複確認でよく使います。ぜひいろいろな使い方をマスターしてみてください。
お読みいただきありがとうございました。