- ベストアンサー
エクセルでの集計関数No.2
- 前回の質問より複雑なデータの集計が飛び込んで困っています。
- データの範囲内で最頻値の文字列を検出する関数の組み合わせを教えてください。
- 鈴木と佐藤が同じ場合にメッセージを表示させる方法も知りたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
通常の関数ではメッセージを表示させることはできないので、 ユーザー定義関数を使いましょう。 ---------------------------------------------------------------- '一番重複しているデータを返す 'mode()があるが、数値しか対応していないため Public Function modea(r As Range) Dim objList, x, maxCount, maxKey Set objList = CreateObject("Scripting.Dictionary") For Each x In r If Not objList.Exists(x.Value) Then '新しいオブジェクト objList.Add x.Value, 1 Else '重複出現時カウント+1 objList.Item(x.Value) = objList.Item(x.Value) + 1 End If Next maxCount = 0: maxKey = "" For Each x In objList.Keys If objList.Item(x) > maxCount Then maxCount = objList.Item(x) maxKey = x End If Next For Each x In objList.Keys If objList.Item(x) = objList.Item(maxKey) Then '同一個数のものがある MsgBox "同一件数のデータ:" & x End If Next modea = maxKey End Function ---------------------------------------------------------------- 使い方 =modea(A1:J3) 問題点、入力されないセルは、0値としてカウントされる。 入力されないセルが多い場合には、それが、最頻出値として選ばれる。 善し悪しなので、問題になる場合は、変更してください。
その他の回答 (1)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#1では、他に同一のものが無い場合自分をメッセージで表示してしまうので、そこと、入力が無いモノをスキップするように変更してみました。 ---------------------------------------------------------------- Public Function modea(r As Range) Dim objList, x, maxCount, maxKey Set objList = CreateObject("Scripting.Dictionary") For Each x In r If IsEmpty(x) Then GoTo continue If Not objList.Exists(x.Value) Then '新しいオブジェクト objList.Add x.Value, 1 Else '重複出現時カウント+1 objList.Item(x.Value) = objList.Item(x.Value) + 1 End If continue: Next maxCount = 0: maxKey = "" For Each x In objList.Keys If objList.Item(x) > maxCount Then maxCount = objList.Item(x) maxKey = x End If Next For Each x In objList.Keys If objList.Item(x) = objList.Item(maxKey) And x <> maxKey Then '同一個数のものがある MsgBox "同一件数のデータ:" & x End If Next Set objList = Nothing modea = maxKey End Function '問題点:色んな場所で使った場合、どこの処理ででたメッセージなのかわからん!、やたらでるとうるさい。
お礼
前回に続きありがとうございます。おかげで解決できました。 勉強不足を痛感しております。有難うございました。