人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

間違いをご指摘ください。
選択範囲の標準偏差の計算を求めようとと以下のマクロを作ってみました。

Sub test()
Dim Dsum As Variant
Dim Msum As Variant
Dim cnt As Integer
Dim myi As Range
cnt = 0
Dsum = 0
Msum = 0
For Each myi In selection
If myi.Value <> "" Then
Msum = Msum + myi.Value
Dsum = Dsum + myi.Value ^ 2
cnt = cnt + 1
End If
Next
If cnt <> 0 Then
Cells(11,1) = Msum / cnt '平均
Cells(11,1).NumberFormatLocal = "0.00_ "
If cnt > 1 Then
Cells(12,1) = ((Dsum * cnt - Msum ^ 2) / (cnt * (cnt - 1))) ^ 0.5 ’標準偏差
Cells(12,1).NumberFormatLocal = "0.00_ "
Else
Cells(12,1) = 0
End If
End If
End Sub


8.35,8.35,8.35,8.35,8.35,8.35,8.35,8.35
と入力された8個のセルを選択しマクロを実行すると標準偏差で

実行時エラー '5':
プロシージャの呼び出し、または引数が不正です。

と出てきてしまします。
原因・間違いをご指摘お願いします。
標準偏差の計算式が間違っているのでしょうか?

●質問者: zuguimo
●カテゴリ:ビジネス・経営 コンピュータ
✍キーワード:as CNT NeXT sub test
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● airplant
●35ポイント

例題の数値では、分散が0になっています。

0の場合でも、Excelの内部処理の誤差で(Dsum * cnt - Msum ^ 2)がマイナスになることがあります。平方根が求められないエラーですので、絶対値にすれば大丈夫です。

Cells(12,1) = ((Dsum * cnt - Msum ^ 2) / (cnt * (cnt - 1))) ^ 0.5
' ↓
Cells(12,1) = (abs(Dsum * cnt - Msum ^ 2) / (cnt * (cnt - 1))) ^ 0.5

ちなみに、プログラム変更前を見ると、次の値でした。

? Dsum * cnt - Msum ^ 2

-9.09494701772928E-13

蛇足ですが、標準偏差はマクロを組まなくても、関数STDEVAやピボットテーブルで簡単に求めることができます。

◎質問者からの返答

ありがとうございます。今回マクロを使う必要からworksheetfunktion.stdevも使いませんでした。


2 ● きゃづみぃ
●35ポイント

Cells(12, 1) = Abs((Dsum * cnt - Msum ^ 2) / (cnt * (cnt - 1))) ^ 0.5 '標準偏差


平方根( ^ 0.5 ) をとる場合、0以上じゃないとエラーになります。

計算結果は マイナスとなってしまうので、Absでマイナスをとるか

途中の計算で マイナスにならないようにするかのどちらかですね。

標準偏差を 求めるには STDEVPというワークシート関数でもできます。

http://www.pursue.ne.jp/Document_xls/xls0023.htm

◎質問者からの返答

Dsum * cnt - Msum ^ 2がマイナスになる理由がわかりませんが(コンピューター計算の都合上でしょうが)マクロの答えと関数の答えが微妙に違わないか心配ですが。とにかくありがとうございました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ