質問: excelvbaでの標準偏差の求め方 excelvbaでの標準偏差の求め方 使用ソフト:excel2003 excelvbaで標準偏差を求めたいのですが、 求めたいデータが複数ファイル(最大31ファイル)に渡り、 また全ての行を一つのファイルにまとめようとすると9万行以上になります。 一ファイルあたりは3000行前後です。 一つのファイルに全てのデータがあれば 下記のようにstdev関数を使うのですが、 今回は複数ファイルに渡るので使えません。 application.worksheetfunction.stdev(.range(.cells(1, 1), .cells(y, 1))) また、1つのファイルにまとめるにもexcel2003なので、 65536行までしか行がなくまとめられません。 このような場合、どのように標準偏差を求めればいいのでしょうか? 出来るだけ速度は犠牲にしたくはありませんが、 速度以前に実装すら出来ません...。 どうか先達の皆様、お知恵をお貸しください。 (同じデータに対して平均、最大値も求めていますが、 それは元ファイルから一つ一つのデータファイルを開いて、 worksheetfunctionのsum関数、max関数を使用して最後に集計、計算をしています)
回答: コードが読めるようでしたら、このようにすれば出来るはずです。 たぶん、数式そのものでも、それぞれの範囲を、引数にすれば取れるはずです。ただ、マクロなら、このようにして、関数を利用しなくても出来るというだけです。 'サンプル '標準モジュール private ar() as variant '先頭に置く sub getstnddevp() dim i as long, cnt as long dim rng as range dim buf as variant dim dmax as double dim dtotal as double dim ddevtotal as double dim daver as double dim ret as double erase ar dmax = -10 ^ 10 with worksheets("sheet1") set rng = .range("a1", .cells(rows.count, 1).end(xlup)) end with call makingarray(rng) with worksheets("sheet2") set rng = .range("b1", .cells(rows.count, 2).end(xlup)) end with call makingarray(rng) '標準偏差の計算 for i = lbound(ar) to ubound(ar) dtotal = dtotal + ar(i) if ar(i) > dmax then dmax = ar(i) end if next i cnt = i daver = dtotal / cnt for i = lbound(ar) to ubound(ar) ddevtotal = ddevtotal + ((ar(i) - daver)) ^ 2 next i ret = (ddevtotal / cnt) ^ (1 / 2) 'メッセージボックス msgbox "合計: " & dtotal & vbcrlf & _ "最大値: " & dmax & vbcrlf & _ "標準偏差: " & ret end sub sub makingarray(rng as range) dim n as long, m as long dim i as long, j as long m = rng.rows.count on error resume next n = ubound(ar) + 1 on error goto 0 redim preserve ar(m + n - 1) for i = 1 to m ar(n + i - 1) = rng.cells(i, 1).value next end sub