Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4657 / 13646 ツリー ←次へ | 前へ→

【55365】ユーザー定義関数について YUMI 08/4/30(水) 23:32 質問[未読]
【55369】Re:ユーザー定義関数について ひげくま 08/5/1(木) 9:12 発言[未読]
【55370】Re:ユーザー定義関数について neptune 08/5/1(木) 9:54 発言[未読]
【55379】Re:ユーザー定義関数について YUMI 08/5/1(木) 15:11 質問[未読]
【55380】Re:ユーザー定義関数について Jaka 08/5/1(木) 16:30 発言[未読]
【55382】Re:ユーザー定義関数について Jaka 08/5/1(木) 16:46 発言[未読]
【55385】Re:ユーザー定義関数について YUMI 08/5/1(木) 19:04 お礼[未読]
【55381】Re:ユーザー定義関数について ひげくま 08/5/1(木) 16:31 回答[未読]
【55384】Re:ユーザー定義関数について YUMI 08/5/1(木) 18:59 お礼[未読]

【55365】ユーザー定義関数について
質問  YUMI  - 08/4/30(水) 23:32 -

引用なし
パスワード
   左の列から順に新しい日付のデータが並んだ表があるのですが、このデータの範囲を指定したら、新しい日付のデータから10日間の標準偏差を出して、1日前のデータから10日間の標準偏差の値の変動率が指定した誤差範囲内でしたら、2日前のデータと3日前のデータを考慮した標準偏差を比較していき、変動率が範囲外になったら、そこまでの日数を出力するユーザ定義関数を作ろうと考えています。
VBAを始めて間が無いのですが、漠然と下のような感じになるのではないだろうかと考えているのですが、書式やアルゴリズムがわからないのですが、もしよろしければ、書き方などを教えていただけないでしょうか?恐縮ですが、よろしくお願いします。

Function 変化日数(範囲)
q = Count(範囲)
For s = 1 To q

Do While 10(%)>= ((標準偏差(1日目から)/標準偏差(2日目から)*100)

Loop
End Function

【55369】Re:ユーザー定義関数について
発言  ひげくま  - 08/5/1(木) 9:12 -

引用なし
パスワード
   やりたいことの説明が、1つの長文になっていて、とても解りにくいです。
(私の読解力が足りないせいか、私には解りませんでした)
短い文章で簡潔に説明しようとして、逆に解りにくくなっているように感じます。
アルゴリズムが解らないとご自分でおっしゃるように、もしかしたら、やりたいことが整理されていないのかもしれません。
文字数的にはもっと多くなっても良いので、解り易い説明をしてみませんか?

【55370】Re:ユーザー定義関数について
発言  neptune  - 08/5/1(木) 9:54 -

引用なし
パスワード
   ▼YUMI さん:
こんにちは

ひげくまさんが既に指摘されていますが、私も理解力に乏しいので、
不明点を私なりに具体的に書くと、

>左の列から順に新しい日付のデータが並んだ表があるのですが、
>このデータの範囲を指定したら、新しい日付のデータから10日間の標準偏差を出して、
ここまでは判る。
>1日前のデータから10日間の標準偏差の値の変動率が指定した誤差範囲内でしたら、
・・・・ここも言葉を定義したほうがいいのでは?変動率、指定など。

>2日前のデータと3日前のデータを考慮した標準偏差を比較していき、
意味不明。
>変動率が範囲外になったら、そこまでの日数を出力するユーザ定義関数を作ろうと考えています。

>書式やアルゴリズムがわからないのですが、
何の書式?何のアルゴリズム?が不明。

>もしよろしければ、書き方などを教えていただけないでしょうか?恐縮ですが、よろしくお願いします。
で、結局、何が判らないのか不明です。全部では質問とは言いません。

#箇条書きにして見てはどうですか?
#もし、標準偏差の求め方が判らないなら「VB 標準偏差」でググると沢山サンプルプログラムはヒットしますよ。
#文法がわからないなら、それは本を購入するなり、Webサイトで自分で勉強するしかないです。

【55379】Re:ユーザー定義関数について
質問  YUMI E-MAIL  - 08/5/1(木) 15:11 -

引用なし
パスワード
   A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,01,P1 ←範囲
と一行に並んだデータがあるのですが、これを
10←誤差 =< (STDEV(A1:J1)/STDEV(B1:K1))/100
      ↓OK
10←誤差 =< (STDEV(B1:K1)/STDEV(C1:L1))/100
      ↓OK
10←誤差 =< (STDEV(B1:K1)/STDEV(C1:L1))/100
      ↓OK
10←誤差 =< (STDEV(C1:L)/STDEV(D1:M1))/100
      ↓NO
ずっと、OKなら、データの端までの
1010←誤差 =< (STDEV(F1:O1)/STDEV(G1:P1))/100 で処理は終了。(処理の回数を出力)
この例では、
結果OKが3回続いたので、3を出力する事になります。つまり、処理が成立する回数を数えています。
この処理をユーザー関数として登録したいのですが、
ご指摘を受けて、私なりに考えたのですが以下のようなコードになりました。
///////////////////////////コード/////////////////////////////////////////
Function 日数(範囲,誤差)'まずここの範囲の書き方がわかりません。
               A1:P1みたいな書き方でいいのでしょうか?
Range("A1") "=count(範囲)"
m = Range("A1")
For s = 1 to m
'ここの標準偏差関数はSTDEV(range(cells(,),cells(,)))と言う書き方ではできないですが、どのような書き方に
’なるのでしょうか?
If 誤差 =< (STDEV(Range(cells(1,s),cells(1,s + 9)/STDEV(cells(1,s + 1),cells(1,s + 10))/100 Then
日数 = s         'ここで誤差内で合格したデータの処理回数の合計を数えています。
    If (m-s) = 10 Then 'この計算では最低11のデータがないと成り立たないので処理を終了させる。
    exit For
    end If
Else
exit For         'ここで誤差外が出たら、処理を終了
end If
Next s
end Function
//////////////////////////////////////////////////////////////////////////////////
少し考えましたが、ここまでしかわかりません。もしよろしければ、範囲の書き方と標準偏差の
cellsを使った書き方を教えていただけないでしょうか?
もしよろしければこのコードを補完していただけたら助かります。

【55380】Re:ユーザー定義関数について
発言  Jaka  - 08/5/1(木) 16:30 -

引用なし
パスワード
    偏差値計算は、良く解りません。

関数の書き方という事で1つ。
色付きセルの足し算の場合。

=色付きセルの計算(A7:A12,3)
                     返す答え(色付きセルの計算)変数の型
                               ↓
Function 色付きセルの計算(範囲 As Range, 色No As Long) As Long
Dim Rng As Range
For Each Rng In 範囲
  If Rng.Interior.ColorIndex = 色No Then
   色付きセルの計算 = 色付きセルの計算 + Val(Rng.Value)
  End If
Next
End Function

【55381】Re:ユーザー定義関数について
回答  ひげくま  - 08/5/1(木) 16:31 -

引用なし
パスワード
   > Function 日数(範囲,誤差)'まずここの範囲の書き方がわかりません。

 これでも間違いではありません。とりあえず大丈夫です。

> Range("A1") "=count(範囲)"
> m = Range("A1")

例では、データ範囲は A1:P1 なんですよね?
A1に範囲のデータ数を書き込んじゃうと、データが上書きされますよ。

そもそも、範囲のデータ数を、なぜ何かのセルに書き込もうとしているのでしょうか?
このあとで Range("A1") を「範囲のデータ数」として参照しているわけでもないですし。
直接、変数に代入すれば良いですよ。

m に限らず、後出の s も、変数は Dim で宣言するようにしましょう。

範囲のデータ数、というか、範囲のセル数は、範囲.Count で求められます。

m = 範囲.Count

> For s = 1 to m
> 'ここの標準偏差関数はSTDEV(range(cells(,),cells(,)))と言う書き方ではできないですが、どのような書き方に
> ’なるのでしょうか?

いろいろ書き方はありますが、今回の場合は、あるセルを基準に10個、ということなので、
Cells(1, s).Resize(, 10)
という書き方が良いと思います。
ただ、これだと、どんな範囲の場合でも、A1が基準になってしまうので、
範囲.Cells(1, s).Resize(, 10)
と書きます。

STDEVはワークシート関数なので、そのままVBAで使うことはできません。
WorksheetFunction.StDev(範囲.Cells(1, s).Resize(, 10))
という書き方になります。

> If 誤差 =< (STDEV(Range(cells(1,s),cells(1,s + 9)/STDEV(cells(1,s + 1),cells(1,s + 10))/100 Then

まず、=< という演算子はありません。書くとしたら、<= です。

この比較式だと、誤差 <= 計算式 となり、誤差外になります。
誤差内にしたいのであれば、誤差 >= 計算式 ですね。

100で割ってるのはなぜですか?
百分率値にしたいのであれば、計算式に100を掛けましょう。

標準偏差の計算式は、上記を参考にしてください。

> 日数 = s         'ここで誤差内で合格したデータの処理回数の合計を数えています。
>     If (m-s) = 10 Then 'この計算では最低11のデータがないと成り立たないので処理を終了させる。
>     exit For
>     end If
> Else
> exit For         'ここで誤差外が出たら、処理を終了
> end If
> Next s
> end Function

【55382】Re:ユーザー定義関数について
発言  Jaka  - 08/5/1(木) 16:46 -

引用なし
パスワード
   >Function 色付きセルの計算(範囲 As Range, 色No As Long) As Long
>Dim Rng As Range

Application.Volatile  '← 好みで入れてください。

>For Each Rng In 範囲
>  If Rng.Interior.ColorIndex = 色No Then
>   色付きセルの計算 = 色付きセルの計算 + Val(Rng.Value)
>  End If
>Next
>End Function

【55384】Re:ユーザー定義関数について
お礼  YUMI  - 08/5/1(木) 18:59 -

引用なし
パスワード
   ひげくまさん ご返答ありがとうございます。
解説ものすごくわかりやすかったです。
仕事の休憩中に即興で質問の書き直しをしましたので、
*100が/100になってたり、Dim宣言省略してしまったり、
ケアレスミスが目立ってしまいました。 
たびたび、ご迷惑おかけしてしまいました。
おかげで、なんとか作りたいユーザ定義関数が作れそうです。
ありがとうございました。m(._.)m

【55385】Re:ユーザー定義関数について
お礼  YUMI  - 08/5/1(木) 19:04 -

引用なし
パスワード
   jakaさんご返答ありがとうございます。 

>Function 色付きセルの計算(範囲 As Range, 色No As Long) As Long
>Dim Rng As Range
>For Each Rng In 範囲
こういう書き方もあれんですね。
とても参考になりました。これから、作る時はぜひ参考にさせてもらいますね。

4657 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free