[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『配列数式で平均値を出す』(COCO)
よろしくお願いいたします。 課内のある数字に対しての平均を出そうとしています。 U45には =ROUND(AVERAGE(U25,U27,U29,U31,U33,U35,U37,U39,U41,U43),1) と式が入っていました。 1行おきの配列数式にしようと {=ROUND(AVERAGE(IF($S$25:$S$40="前",U25:U40,"")),1)} と修正したのですが答えが「3.3」になってしまいます。 26を7で割りたいのに8で割って平均が出てしまいます。 (ちなみに配列数式にしないと3.7となります。) なんだかわからなくなり頭がパンク状態です。。
説明がうまく出来ませんがよろしくお願いいたします。
O S U V W 25 Aさん 前 4 26 後 27 Bさん 前 4 4 4 28 後 29 Cさん 前 4 4 4 後 31 Dさん 4 4 4
33 Eさん 3 4 4
35 Fさん 3 4 4
37 Gさん 4 4 4
39 Hさん 3 3 40
45 課平均値 前 46 課平均値 後
実際の表を見ないと何ともいえませんが、 憶測で、空白セルを参照してるためではないでしょうか?
こんな感じで解消できるかな {=ROUND(AVERAGE(IF(($S$25:$S$40="前")*(U25:U40<>""),U25:U40,"")),1)}
こんにちは。 AVERAGE関数のヘルプには、以下のように書かれています。 ・引数として指定した配列またはセル範囲に文字列、論理値、空白セルが含まれている場合、これらは無視されます。 ただし、数値として 0 (ゼロ) を含むセルは計算の対象となります。
> =ROUND(AVERAGE(U25,U27,U29,U31,U33,U35,U37,U39,U41,U43),1) 修正前の数式の場合、 U39以降のセルは空白なので、平均の計算からは除かれます。
>{=ROUND(AVERAGE(IF($S$25:$S$40="前",U25:U40,"")),1)} 一方、修正後の数式の場合、IF(〜)の部分は、 {4;"";4;"";4;"";4;"";3;"";3;"";4;"";0;""} のように計算されていますので、U39セルが空白ではなく、0として計算に含まれるのです。 (たとえ参照元が空白セルでも、参照先では、0になります)
したがって、↑のななしさんのご回答のように、IF関数の条件に、U25:U40が空白でない(U25:U40<>"")という 条件を追加すれば、IF(〜)の部分は以下のように、0ではなく""となり、平均計算から除外されます。 {4;"";4;"";4;"";4;"";3;"";3;"";4;"";"";""}
ちなみに以下のように微修正すると、同じ数式で、後やV列以降のの平均も計算できます。 U45 {=ROUND(AVERAGE(IF(($S$25:$S$44=$S45)*(U$25:U$44<>""),U$25:U$44,"")),1)} ↑Ctrl+Shit+Enterで確定(配列数式) (コタ)
返信遅くなりすみません。 ななしさん、コタさんありがとうございます。
>空白セルが含まれている場合、これらは無視されます。 >ただし、数値として 0 (ゼロ) を含むセルは計算の対象となります。 ↑これは見ていたのですが >(たとえ参照元が空白セルでも、参照先では、0になります) をわかっていませんでした。勉強になりました。
教えていただいた式の中でわからないのですが
>{=ROUND(AVERAGE(IF(($S$25:$S$40="前")*(U25:U40<>""),U25:U40,"")),1)} の中の「*」と「<>」の意味がわかりません。 また、コタさんの微修正の式と ななしさんの式をV,W・・・方向へフィルコピーするのでは V列以降の平均をだす際の意味が違うのでしょうか?
よろしくお願いいたします。
> 「*」と「<>」の意味がわかりません。 単純に答えると、「*」:乗算(掛ける「×」)と、「<>」:不等号(「≠」)ということです。
配列の乗算の場合、それぞれの要素同士の計算になります。
($S$25:$S$40="前")*(U25:U40<>"") = {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0} *{1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0} ※Trueを1,Falseを0としています = {1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0} ^ 1*0=0
> V列以降の平均をだす際の意味が違うのでしょうか? V列以降の方向は同じですね。 V45 {=ROUND(AVERAGE(IF(($S$25:$S$40="前")*(V25:V40<>""),V25:V40,"")),1)} V45 {=ROUND(AVERAGE(IF(($S$25:$S$44=$S45)*(V$25:V$44<>""),V$25:V$44,"")),1)}
「後」の平均を求める場合に、変わってきます。 U46 {=ROUND(AVERAGE(IF(($S$25:$S$40="前")*(U26:U41<>""),U26:U41,"")),1)} U46 {=ROUND(AVERAGE(IF(($S$25:$S$44=$S46)*(U$25:U$44<>""),U$25:U$44,"")),1)} (コタ)
>「*」:乗算(掛ける「×」)はわかりましたが >「<>」:不等号(「≠」)ということです。 がいまいちピンときません(泣)
($S$25:$S$40="前")*(U25:U40<>"") = {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0} *{1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0} ※Trueを1,Falseを0としています = {1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0} ^ 1*0=0 上記の仕組みはわかりました。(とてもわかりやすくしていただきありがとうございます。)
ただ、この部分「(U25:U40<>"")」のU25:U40の値が何と不等号になるのでしょうか? できればもうちょっと言葉で表現していただけると助かります。
初歩的な質問ですみませんがよろしくお願いいたします。
> 「(U25:U40<>"")」のU25:U40の値が何と不等号になるのでしょうか? そのものずばりで、"" と比較しているのですが、つまりは、"" が何か?が 分からないということでしょうか。 これは、「長さ0の文字列」で、 未入力セルと同様のもの(*) です。
どこかのセルに、="" と入力してみてください。 見た目は未入力の場合と、全く同じでしょう。 それだけでなく、あるセルが未入力かどうかも、"" で判定できます。 以下のシートを再現してみてください。
[R/C] [A] [B] [1] 4 1 [2] 0 1 [3] _ 0 ←「_」セルは未入力
B1 =IF(A1<>"",1,0) →B1:B3フィルコピー
・1、2行目は、A列に「4」「0」が入力されているので、B列のIF関数の判定式で A1<>""がTrueとなって(=A1は""ではない)、結果が1になっています。 ・ところが3行目は、A3が未入力なので、A3<>""がFalseとなって(=A3は""である)、 結果が0になります。
同様に、(U25:U40<>"")という式の場合、 ・入力のあるセルはTrue (=1)に、 ・入力のないセルはFalse(=0)に、 なり、 {1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0} という配列になるのです。 (コタ)
(*)補足 もちろん、未入力セルと"" は、同じものではありません。 単に、未入力セル="" という数式を作ると、Trueという結果が返る、という意味で 「同様」と表現してるだけです。
わかりましたぁぁぁ・・!! 感謝・感謝です。
ちなみに式は V45 {=ROUND(AVERAGE(IF(($S$25:$S$44=$S45)*(V$25:V$44<>""),V$25:V$44,"")),1)} こちらを使用して解決しました。
コタさん、本当にありがとうございました。
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.