「みんな教えて! 選手権!!」開催のお知らせ

お世話になります。

A列に通し番号(最下行不定)、B列にデータがあるリスト(空欄なし)があります。
A列で№1~№50のグループと51以上のグループでそれぞれB列データの標準偏差を求めたいのですが、よくわかりません。
通常の連続データですと「Application.Round(Application.StDev」を用いればよいのはわかるのですが、条件を加えるとなるとどうすればいいのでしょうか?
IF等があるのでしょうか?

教えてください
よろしくお願いします。

A 回答 (2件)

StDevメソッドの引数には配列も指定できるようなので、条件に合う値だけを配列に溜め込んで、それを渡してやれば、行きそうですね。

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

お礼が遅くなり申し訳ありません
ありがとうございました

お礼日時:2018/03/22 22:47

こんばんは。



標準偏差で、STDEV とお書きになっていますが、ふつうは、標本標準偏差として、
STDEVP を使いますので、以下は、それに合わせています。
ただし、No.1 と文字列になっている場合は、文字列から数字を取り出さないといけません。


'// 標準モジュール
Sub Main()
Dim Rng As Range
Dim Ret As Double
Dim Ret2 As Double
'条件セル A1からA列の最後の行まで
Set Rng = Range("A1", Cells(Rows.Count, "A").End(xlUp))
'A列で№1~№50のグループ
Ret = condiSTDEVP(Rng, Rng.Offset(, 1),51, 0)
Ret = Application.Round(Ret, 3)
'51以上のグループ
Ret2 = condiSTDEVP(Rng, Rng.Offset(, 1),51, 1)
Ret2 = Application.Round(Ret2, 3)
End Sub
Function condiSTDEVP(ByVal cndiRng1 As Range, ByVal Rng2 As Range, _
ByVal condi As Variant, Optional cmp As Integer = 0) As Variant
'引数は、条件列, 計算列, 条件値, 小なり=0, 大なり・等しい=1か、0以外
Dim c As Range
Dim dblSum As Double
Dim avrg As Double
Dim difSum As Double
Dim Ar() As Variant
Dim difSumAvrg As Double
Dim i As Long, j As Long
Dim flg As Boolean
'開始
For Each c In cndiRng1
 If cmp = 0 Then
 flg = Val(c) < condi '小なり-比較条件
  ElseIf cmp <> 0 Then
 flg = Val(c) >= condi '小なり-比較条件
  End If
  If flg Then
  ReDim Preserve Ar(i)
  '計算
  If Not IsNumeric(Rng2.Cells(i + 1).Value) Then condiSTDEVP = "Err!": Exit Function
  Ar(i) = Rng2.Cells(i + 1).Value
  dblSum = dblSum + Rng2.Cells(i + 1).Value
  i = i + 1
  End If
Next
avrg = dblSum / i
For j = 0 To i - 1
  difSum = difSum + (Ar(j) - avrg) ^ 2
Next
 difSumAvrg = difSum / i
 condiSTDEVP = difSumAvrg ^ (1 / 2)
End Function
    • good
    • 0
この回答へのお礼

お礼が遅くなり申し訳ありません
ありがとうございました
コードを入力してみたもののうまく走りませんでした。
もう少し頑張ってみます

お礼日時:2018/03/22 22:48

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

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報