プロが教える店舗&オフィスのセキュリティ対策術

配列変数X(99)にそれぞれ100人の100点満点のテストの結果が入っています。
この平均点数を求めたいのです。ただし0点の人は対象外としたいです。
Sub Test()
For Cnt = 0 To 99
If X(Cnt) <> 0 Then Seito_Cnt = Seito_Cnt + 1
PTotal = PTotal + X(Cnt)
Next Cnt
MsgBox "平均点は、" & PTotal / Seito_Cnt
End Sub

で平均点は、求められるのですが、Application.WorksheetFunction.Averageを
使って一発で求める方法を探しています。

For Cnt = 0 To 99 の中で0点でない場合のみ新しい配列変数に代入していけば
平均点を一発で求めるための配列変数ができるのですが、この場合その配列変数
をReDimで宣言する必要がありますが、0点以外の生徒が何人いるかわかりません。

For Cnt の中で
一旦 If X(Cnt) <> 0 Then Seito_Cnt = Seito_Cnt + 1でその数を求めてから
ReDimして、再度For Cnt = 0 To 99で新しい配列変数に代入していき、終わっ
ったあと、Application.WorksheetFunction.Averageとする以外に方法はないの
でしょうか?
もっとスマートな方法はないものかと質問させていただきました。
よろしくお願いします。

A 回答 (1件)

データを入れる配列をVariant型にして、配列に入れる時に0点だったら空文字列""にしておきます。

その配列をAverage関数に渡せば、そこはノーカンの平均が求められます。以下の超安直な例がわかりやすいかと。

Sub test()
Dim aa(10) As Variant

aa(0) = 5
aa(1) = 5
aa(2) = 5
aa(3) = 5
aa(4) = 5
aa(5) = 5
aa(6) = 5
aa(7) = 5
aa(8) = 5
aa(9) = ""

MsgBox WorksheetFunction.Average(aa)

End Sub
    • good
    • 0
この回答へのお礼

配列宣言をVariant型にすること。ゼロの場合""を代入すること。了解しました。
まったく思いつきませんでした。ありがとうございます。

お礼日時:2019/04/30 16:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!