[[20260516151633]] 『sumproductで該当するセルの個数を数えたい。』(俺) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『sumproductで該当するセルの個数を数えたい。』(俺)

A2:A50に文字列 (ex 山か川)
B2:B50に文字列 (ex 水か火)
C1:N1にそれぞれの1月から12月の月末の日付
C2:N50にランダムに数字か空白
O1にランダムの日付
という状態で
A列が山、B列が水、C1:N1の月の値がO1と同じ列を満たすセルの個数をカウントする方法を教えていただきたいです。
sumproductで該当するセルに入っている値を合計するところまではできたのですが、セルの個数をカウントする方法はないでしょうか?
countifs等も調べてみましたが、やり方がわかりませんでした。
よろしくお願いします。

< 使用 Excel:Excel2019、使用 OS:Windows10 >


 C1:N1の月の値がO1と同じ列は必ず1列になりますから、O1の日付が何であれ検査対象セルは49個。
 =INDEX(C2:N50,,MONTH($O$1))  で表現出来ます。

 でももし「(C2:N50がどうであれ) A列が山、B列が水」の数っていう条件なら、結局
  =SUMPRODUCT((A2:A50="山")*(B2:B50="水"))  って事になりません?

 「A列が山、B列が水、C2:N50が空白以外」なら
  =SUMPRODUCT((A2:A50="山")*(B2:B50="水")*(INDEX(C2:N50,,MONTH(O1))<>""))   みたいな感じでイケそうですね。

(白茶) 2026/05/16(土) 16:33:21


返信ありがとうございます。
ご提案いただいた数式でやってみましたが、0になってしまいました。

ちなみに自分が値を合計するところまでの関数は
=SUMPRODUCT((A2:A50="山")*(C1:N1=EOMONTH(O1,0))*(B2:B50="水"),C2:N50)
でA列に山、B列に水に該当するG列(O1が5月なので)のセルが3つありそのセルに入っている値が83.90.81で254が返ってきています。
この場合に3(該当するセルの個数)を返すための方法が知りたいです。

説明が分かりにくくて申し訳ございません。
(俺) 2026/05/16(土) 19:16:55


 =SUMPRODUCT((A2:A50="山")*(C1:N1=EOMONTH(O1,0))*(B2:B50="水"),--(C2:N50<>""))   とか?

(白茶) 2026/05/16(土) 19:40:03


できました!ありがとうございます。
もしよろしければ、最後の--にはどういう意味があるのか教えていただけないでしょうか?
(俺) 2026/05/17(日) 11:35:40


 ヘルプによると、 
 > SUMPRODUCT は、数値以外の配列エントリを 0 のように扱います。
 ということなので、

 =SUMPRODUCT((A2:A50="山")*(C1:N1=EOMONTH(O1,0))*(B2:B50="水"),C2:N50<>"")
 としてしまうと、
 第二引数(C2:N50<>"")が TRUE,FALSE要素なので、0と扱われてしまいます。

 これを避けるために、下記のように工夫されたもの(と思われます)。

  C2:N50<>""    は TRUEかFALSEを要素とする配列
  -(C2:N50<>"")  は -1か0を要素とする配列
  --(C2:N50<>"") は  1か0を要素とする配列
 と言う意味です。
 =1*(C2:N50<>"")と書いても同じです。
 (なお、いずれもカッコが必要なことに注意してください。)

(xyz) 2026/05/17(日) 13:33:03


 > もしよろしければ、最後の--にはどういう意味があるのか教えていただけないでしょうか?
 回答者を指定することはできません。というより、質問に対して時間がある人が回答するのが普通です。
 # 少し質問から間が空いていたようだったので、代理でコメントしました。
 # 補足的な質問でしたしね。

 回答を受けたら返事するくらいするのが常識であり、マナーだと思いますよ。
(xyz) 2026/05/19(火) 22:39:10

>=1*(C2:N50<>"")と書いても同じです。

1の前の「=」は必要ですか?
(素人質問) 2026/05/20(水) 12:39:14


xyzさん、すみません
体調が悪くて確認するのが遅くなってしまいました。
ご不快な思いをさせてしまい申し訳ございませんでした。

白茶さんに代わって回答していただきありがとうございました。
(俺) 2026/05/20(水) 12:59:37


 (俺)さん 了解しました。

 (素人質問)さん   入力ミスでした。ご指摘ありがとうございます。

 これだけだとナンなので以下、蛇足です。
 ちなみに、こうしたjargon(決まり文句)は、ああそれね、と視覚的にも分かりやすいものが
 好まれます。
 (データはなく、雑駁な個人的印象ですが、欧米では前者が多く使われているような印象です)
 その点で、--(Boolean配列)と 1*(Boolean配列) とを比較すると、 通常は - を二つ続ける
 ことはまずないので、目立ちやすい、すぐにそれとわかるという観点から、
 前者が好まれているのかもしれません。

 ということで生成AIに訊いてみました。以下、結果です。

 【生成AIの回答】
 ExcelでBoolean配列を0や1に変換する際、使用頻度が高いのは --(Boolean配列)(ダブルマイナス) です。
 可読性が高く、配列数式(数式の全体に演算を適用する形式)を組む際の標準的なテクニックとして広く普及しています。

 各手法の特徴と比較
 ■--(Boolean配列)(ダブルマイナス・単項演算子)
 ・使用頻度: 高
 ・特徴: 論理値(TRUE/FALSE)を数学的に「マイナス(負)のマイナス(正)」に変換することで、
 元の数値を維持したまま強制的に「1と0」の数値データに変換します。
 主に古いバージョンのExcelで配列数式(Ctrl+Shift+Enterで確定するもの)を作成する際、
 最も定番の記述として使われてきました。
 ・メリット: 視覚的に「数値化・フラグ化」の意図が伝わりやすく、数式の誤作動も起きにくいです。

 ■1*(Boolean配列)(1の乗算)
 ・使用頻度: 中
 ・特徴: どんな数値でも1を掛けると値が変わらない数学的性質を利用し、
    論理値に1を乗算することで0と1に変換します。
 ・メリット: 初心者にも仕組みが直感的でわかりやすいです。
 ・注意点: 乗算という演算子を明示的に挟むため、複雑な配列数式の中でカッコの付け方によっては
  計算順序のエラーなどを招くリスクがゼロではありません。

 まとめ
 どちらを使用しても結果({1; 0; 1; 0...} など)は全く同じになります。
 しかし、実務やWeb上の解説(Microsoft サポートや各Excel解説サイトなど)では、
 シンプルでスッキリと記述できる --(Boolean配列) のほうが標準的なイディオムとして
 定着しています。 
(xyz) 2026/05/20(水) 13:19:17

 私はN関数を使うようにしています。
 何をしているのか意図が明確なので。

 ただし、N関数は配列を渡すと配列が返ってくるのですが、
 セル参照を渡すと最初のセルの結果だけが返ってくるのがちょっと困ります
(´・ω・`) 2026/05/20(水) 15:51:46

 なるほどN関数に言及する必要がありましたね。ご指摘感謝します。

(xyz) 2026/05/20(水) 18:12:40


たびたびすみません。
追加の質問になるので、ここで書かせていただきます。

同じデータでC2:N50の数字の値を条件にして個数を絞ることは出来るのでしょうか?

2レス目の内容を例にしてA列に山、B列に水、C1:N1でG1が対象となった場合にG2:G50から80以上90未満を条件にして2を返す様にしたいということなのですが。

分かりにくくてすみませんが、よろしくお願いします。
(俺) 2026/05/24(日) 13:11:30


 # ご自分でなんらかのトライをしたうえで質問して下さいね。
 # このような式にしてみたが結果が得られない、といった説明をしてください。

 白茶さんの 2026/05/16(土) 19:40:03 の回答について、
 第二引数を、二つの条件式を掛け算にしたものに変更すればよいと思います。
 そうすれば二つの条件を満たしたものが 1 となりますから、それらが合計されて個数になりますよね。

(xyz) 2026/05/24(日) 22:01:47


ありがとうございます、なんとかできました。

今後質問する時は気をつける様にします。

ご回答、ご指導いただきありがとうございました。
(俺) 2026/05/25(月) 12:03:08


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.