• 締切済み

VBAでMODE関数をつくる

VBA初心者です。VBAを使ってMODE関数をつくるにはどのようなプログラムを書けばよいのでしょうか?わたしは、同じ数字が出てきたら足していく→合計を元の数字で割る→割った答えが最大になるとき、元の値が最頻値。というイメージをもったのですが、これをプログラム化することは可能でしょうか?教えてください!!!

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

データ範囲がそれほど広くないなら カウンタ用の配列とそのときまでのカウント最大値を記憶しておけば良いように思います データ範囲が0から1000程度なら   Dim d(1000) as Integer, Max as integer, n as Iteger   dim v   ' 仮の最頻値を0に設定   MAX = 0   ' ワークシートからデータを取得   v = Range("A1:A4096").Value   for n = 1 to 4096     ' データを使って カウンタ配列を更新     d(v(n,1)) = d(v(n,1)) + 1     ' 更新されたデータと最頻値カウンタを比較     if d(v(n,1)) > d(Max) then       Max = v(n,1)     end if   next   ' 結果出力   MsgBox Max といった具合です

mountain3
質問者

補足

redfox63さん、ありがとうございます。重ねて質問なのですが、データ範囲が1000ほどであるのに、ワークシートから得るデータは4096とかなり大きくても大丈夫なのでしょうか?ここも1000にするべきなのではないですか?

すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.2

#1で伍指摘の通り、VBAで使えます。 A1:A10のデータ例 3 5 6 4 5 3 5 5 1 4 ーー Sub test01() MsgBox Application.WorksheetFunction.Mode(Range("A1:A10")) End Sub を標準モジュールに入れて実行してみてください。 えらーにならず 5 が表示されます。 ーーー どうしてもプログラムで、なら (1)データを配列に入れる (2)配列データをソートし、配列に戻す。 (3)そのときまでの最大頻度数をもつ変数Mを設ける。 配列要素順に調べていって、配列で直前データと同じデータ(連)の数を調べ、連なりが切れたとき、今までの連なり(M)より、多ければ、Mを大きい方で置き換え、同じか少なければ、次に進む。 配列のデータの終わりまで行くと変数Mの値がNODEである。

mountain3
質問者

補足

ありがとうございます。imogasiさんの回答の後半にあるように、"Mode"という言葉を使わず、それと同じ機能持つプログラムを完成させなくてはなりません。しつこくて申し訳ありませんが、後半部分をプログラムにするとどうなるか教えていただけないでしょうか?

すると、全ての回答が全文表示されます。
  • deecyan
  • ベストアンサー率38% (89/233)
回答No.1

EXCELに mode という関数があるのに なぜ? 関数を作らないといけないの? Dim aaa As Double Dim bbb() ReDim bbb(6) bbb(1) = 5 bbb(2) = 3 bbb(3) = 5 bbb(4) = 5 bbb(5) = 7 bbb(6) = 5 aaa = Application.WorksheetFunction.Mode(bbb)

mountain3
質問者

補足

回答ありがとうございます。EXCELにMODE関数が備わっていることは承知していますが、今回はVBAの演習の一環で「Mode」という言葉を使わないでMODE関数と同じ機能をもつプログラムを書きたいと思っています。言葉足らずでスミマセン。

すると、全ての回答が全文表示されます。

関連するQ&A