• ベストアンサー

EXCELで0を除いた平均値を求めるには?

表記内容の例題として、A1からA10まで数字があります。   A    1 10 2 12 3 0 4 0 5 15 6  0 7 10 ・ ・ ・ ・ ・ ・ 10 12 上記内容の場合、0を除いた平均値は SUM(A1:A10)/COUNTIF(A1:A10,"<>0")となるかと思います。しかし、例えばA2からA4までを非表示にした場合も内容が変わりません。表示されている項目のみで且つ、0を除外した計算式はどのような関数が良いのでしょうか? よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
noname#24921
noname#24921
回答No.2

まず XXwaiwaiXX さんが書かれた計算式では分母が"8"になり、非表示にする前の計算も正しい答えは出ないと思います。8~9行もカウントされるからです。 分母は COUNTIF(A1:A10,">0") とします。 次に「例えばA2からA4までを非表示にした場合」と書かれていますが、どのような操作で非表示にするのでしょうか。推定としては次の2つの方法が考えられますが、それについてこう言う方法もありますということで書いてみます。非表示の方法がもし違ってたらごめんなさい。 (1) A2からA4を行ごと(2~4行)非表示にする場合。   A  B    1  1  10 2  0  12   3  0   0   4  0   0 5  1  15 6  1   0   7  1  10 ・     ・      ・     ・ 10  1  12 上記のようにA列の前に新たに列をもうけ例えば非表示にする行には"0"を、また表示させたい列には"1"入れる。合計を表示させるセル(B11)に次の式を入れます。 式 =SUMIF(A1:A10,1,B1:B10)/COUNTI(B1:B10,">0") これにより2~4行を非表示にしても答えは同じ。 (2)非表示にするのにオートフィルターを用いる場合。   A  B    1  a  b 2  1  10 3  0  12   4  0   0   5  0   0 6  1  15 7  1   0   8  1  10 ・     ・      ・     ・ 11  1  12 上記のように1行目の前に行を1行追加し、列の項目に名前をつける(a,b)表中の任意のセルをクリックし「データ」「フィルター」「オートフィルター」をクリックし、a の矢印をクリックし"1" を選ぶ。  B12 には次の式を入れる   =SUBTOTAL(9,B2:B11)/COUNTIF(B2:B11,">0")

XXwaiwaiXX
質問者

お礼

非常に解りやすくご案内頂きありがとうございます。 非表示の方法ですが、1・2の両方を試してみたのですが 肝心な絞込みを理解していませんでした。 =SUMIFと=SUBTOTALの使い方が違うのですね。すいません。 こんな知識レベルで答えを求めていたので非常に助かりました。 もう一度データを整理してみます。 ありがとうございました。

その他の回答 (1)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 これは、汎用性のあるユーザー定義関数SUMTOTALです。 使用法は、 'VSUM(集計方法,範囲,ゼロオプション) で、集計方法は、 1 は AVERAGE 2 は COUNT 3 は COUNT 9 は SUM です。 ゼロオプションは、デフォルトはFALSE ですが、TRUE を入れると0を勘定にいれません。また、文字列も、現在の場合、勘定には入れません。(ゼロの扱いはしない、ということです) なお、とりわけ、質問のみということではなく、汎用性や発展性を考えた関数です。 こういうスタイルをお望みでない場合は、また、ご相談ください。他の方法を考えてみます。 '----------------------------------------- '<標準モジュール登録> Function VSUM(集計方法 As Integer, _  範囲 As Range, _  Optional ゼロオプション As Boolean) As Double  'VSUM(集計方法,範囲,ゼロオプション)  '非表示になっている行は集計しない  Dim c As Variant, i As Long, Sum As Double, Z As Boolean  If ゼロオプション = True Then Z = True  Select Case 集計方法   Case 1 '平均    For Each c In 範囲     If c.EntireRow.Hidden = False Then      If Z = True And c.Value <> 0 And VarType(c) = vbDouble Then       Sum = Sum + c.Value       i = i + 1      ElseIf Z = False And VarType(c) = vbDouble Then       Sum = Sum + c.Value       i = i + 1      End If     End If    Next    Sum = Sum / i   Case 2 'Count    For Each c In 範囲     If c.EntireRow.Hidden = False Then      If VarType(c) = vbDouble Then       If Z = True And c.Value <> 0 Then        i = i + 1       ElseIf Z = False Then        i = i + 1       End If      End If     End If    Next    Sum = i   Case 3 'Counta    For Each c In 範囲     If c.EntireRow.Hidden = False Then      If Z = True And c.Value <> 0 Then       i = i + 1      ElseIf Z = False Then       i = i + 1      End If     End If    Next    Sum = i   Case 9 '合計    For Each c In 範囲     If c.EntireRow.Hidden = False Then      If VarType(c) = vbDouble Then       Sum = Sum + c.Value      End If     End If    Next  End Select  VSUM = Sum End Function

関連するQ&A

専門家に質問してみよう