質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

442閲覧

vba functionプロシージャの扱いと計算

SORAshining

総合スコア13

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/12/20 07:36

編集2018/12/20 08:18

前提・実現したいこと

乱数をn個生成し、その和Fを求め
Fe=(√(12/n))*(F-(n/2))
の結果を関数値で返すfunctionプロシージャを作る
Feを複数回呼び出しFeの値を複数発生させ
さらにそれらFeの合計と平均を計算するサブプロシージャを作成する

平均はゼロに近づいているが分散は8.何々など1に近づいている様子がない

該当のソースコード

vba

1Sub heikin() 2 3Dim n As Long, mmm As Double, ma As Double, aver As Double 4 5Dim f As Long 6 7Randomize 8n = InputBox("n") 9v = InputBox("v") 10 11For y = 1 To v 12mmm = sh(n) + mmm 13Next y 14 15ma = ma + mmm 16 aver = ma / v 17 18mau = mau + mmm ^ 2 19 aver2 = mau / v 20 21variance = aver2 - (aver) ^ 2 22 23MsgBox "平均; " & aver & vbCrLf _ 24 & "分散; " & variance 25End Sub 26 27 28 29Function sh(n As Long) As Double 30Dim f As Double, fe As Double 31 32For o = 1 To n 33 34 f = f + Rnd 35 36Next o 37 38fe = Sqr(12 / n) * (f - (n / 2)) 39sh = fe 40 41End Function 42 43

###試したこと

functionプロシージャ内のfor文をサブプロシージャに変えたり
式を変えたりしてみた
漠然としていてすみません

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/12/20 07:55

コードはマークダウンのcode機能をご利用ください。 また、「考えられること」は今のところ質問者さんしか知りません。 書かれていないことを読み取るのは不可能ですので、可能な範囲で記述いただけませんか?
m.ts10806

2018/12/20 07:56

「うまくいきません」では起きている問題が分かるわけではないので、起きている現象、どういう結果となったか、エラーが出ていないか 等々 詳細記述してください。
SORAshining

2018/12/20 08:19

ごめんなさい。初めての利用でよくわかっていませんでした。
hatena19

2018/12/20 09:53 編集

コードの分散の計算方が間違っています。 分散は平均と各値の差の2乗の平均なので、ループで回して計算する必要があります。
guest

回答3

0

ベストアンサー

コード中の分散の計算法が間違っています。
分散は平均と各値の差の2乗の平均なので、ループで回して計算する必要があります。

まず、sh(n) の計算結果をループさせて配列にいれます。
その配列からループで平均を求めます。
さらに配列をループさせて平均と各値の差の2乗の平均を求めます。これが分散です。

下記を参考に。

Excel VBAの「配列にn個のデータを読み込み、その平均と分散... - Yahoo!知恵袋


コード例

vba

1Sub heikin() 2 3 Randomize 4 5 Dim n As Long, v As Long 6 n = InputBox("n") 7 v = InputBox("v") 8 9 Dim ary() As Double '結果格納用配列 10 ReDim ary(1 To v) '配列のサイズを決定 11 12 Dim y As Long 13 For y = 1 To v 14 ary(y) = sh(n) 'shの結果を配列に格納。 15 Next y 16 17 Dim ma As Double '総計 18 For y = 1 To v 19 ma = ma + ary(v) 20 Next y 21 Dim aver As Double '平均 22 aver = ma / v 23 24 Dim variance As Double '分散 25 For y = 1 To v 26 variance = variance + (ary(v) - aver) ^ 2 27 Next y 28 variance = variance / v 29 30 MsgBox "平均; " & aver & vbCrLf _ 31 & "分散; " & variance 32End Sub

投稿2018/12/20 09:55

編集2018/12/20 10:37
hatena19

総合スコア33782

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Doubleを使用しているから、精度誤差によるものじゃないでしょうか。

Doubleの代わりにCurrencyを使ってみてはどうでしょう。
それでも精度に問題があるなら、整数部と小数部を分けるしか無いかと。

投稿2018/12/20 08:23

sazi

総合スコア25206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SORAshining

2018/12/20 08:40

試してみます。ありがとうございます。
guest

0

たくさん問題点がありますが、一番の問題は乱数を使っていない事です。

For o = 1 To n  f = f + Rnd Next o

で乱数の和を計算したつもりでしょうが、乱数を発生する関数の呼び出しは Rnd()であって、Rndではありません。
f=f+Rndは、変数fに変数fと変数Rndの値の和を代入していますが、変数Rndは定義されていないので値は0です。 f=f+0を何度繰り返しても、fは0のままです。

このようなエラーは、コードの最初に"Option Explicit"と指定する事で避けられます。
このオプションは、定義されていない変数が使われた時に警告を出します。

投稿2018/12/20 08:17

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SORAshining

2018/12/20 08:23

初歩的なミスですみません。ありがとうございます
hatena19

2018/12/20 08:37

VBAの場合、引数のない場合は、() は省略できるので、  f = f + Rnd と  f = f + Rnd() は同じです。
SORAshining

2018/12/20 08:40

あ、だから乱数取得は普通にできてたんですね。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問