アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (3件)

#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である。

この回答への補足

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

補足日時:2007/10/07 14:26
    • good
    • 0

データ範囲がそれほど広くないなら


カウンタ用の配列とそのときまでのカウント最大値を記憶しておけば良いように思います

データ範囲が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
といった具合です

この回答への補足

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

補足日時:2007/10/08 11:37
    • good
    • 0

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)

この回答への補足

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

補足日時:2007/10/07 14:12
    • good
    • 1

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

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