Excel VBA質問箱 IV

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

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


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

【66765】範囲内で一番多い値を取得する方法 かな 10/10/5(火) 10:48 質問[未読]
【66768】Re:範囲内で一番多い値を取得する方法 kanabun 10/10/5(火) 12:47 発言[未読]
【66790】Re:範囲内で一番多い値を取得する方法 かな 10/10/6(水) 17:00 お礼[未読]
【66769】Re:範囲内で一番多い値を取得する方法 Jaka 10/10/5(火) 13:16 発言[未読]
【66791】Re:範囲内で一番多い値を取得する方法 かな 10/10/6(水) 17:03 お礼[未読]
【66770】Re:範囲内で一番多い値を取得する方法 独覚 10/10/5(火) 13:35 回答[未読]
【66773】Re:範囲内で一番多い値を取得する方法 kanabun 10/10/5(火) 16:01 お礼[未読]
【66789】Re:範囲内で一番多い値を取得する方法 かな 10/10/6(水) 16:56 お礼[未読]

【66765】範囲内で一番多い値を取得する方法
質問  かな  - 10/10/5(火) 10:48 -

引用なし
パスワード
   なにか、いいアイデアがあれば教えていただきたいです

例えば、A列の1行目から12行目まで下記の値が入っています
この中で、一番値の多いもの。
この場合は 10 になるのですが・・・
このように10を取得するのにいい方法といいますか、何か適した関数とかあるのでしょうか?
A列
10
10
20
20
20
20
10
50
10
50
10
10

なかなかいい答えが見つからず悩んでます
よろしくおねがいします

【66768】Re:範囲内で一番多い値を取得する方法
発言  kanabun  - 10/10/5(火) 12:47 -

引用なし
パスワード
   ▼かな さん:

>この中で、一番値の多いもの。
>この場合は 10 になるのですが・・・
>このように10を取得するのにいい方法といいますか、
何か適した関数とかあるのでしょうか?

関数では思いつかなかったので、ユーザー定義関数ではいかが?

Function MaxCount(r As Range)
 Dim i As Long, k As Long
 Dim v
 Dim dic As Object
 
 v = r.Value
 Set dic = CreateObject("Scripting.Dictionary")
 For i = 1 To UBound(v)
   dic(v(i, 1)) = dic(v(i, 1)) + 1
 Next
 For Each v In dic.Keys()
  If k < dic(v) Then k = dic(v): MaxCount = v
 Next
 Set dic = Nothing
End Function


どこかのセルに =MaxCount(A1:A12)

【66769】Re:範囲内で一番多い値を取得する方法
発言  Jaka  - 10/10/5(火) 13:16 -

引用なし
パスワード
   難しいですね。
数式に詳しいなら、もっと効率のいいのが書けそうですけど。
何行目の値ぐらいまでしか取れませんでした。
また、例題の場合で10と同数あった物がある場合は無視しました。

MsgBox Application.Evaluate("MATCH(MAX(COUNTIF(A1:A12,A1:A12)),COUNTIF(A1:A12,A1:A12),0)") & "行目の値"


配列数式です。
{=INDIRECT("A" & MATCH(MAX(COUNTIF(A1:A12,A1:A12)),COUNTIF(A1:A12,A1:A12),0))}

【66770】Re:範囲内で一番多い値を取得する方法
回答  独覚  - 10/10/5(火) 13:35 -

引用なし
パスワード
   Application.mode(range("A1:A12"))
または
Worksheetfunction.mode(range("A1:A12"))
はどうでしょうか?

ただし個数が多いものが複数あった場合、最初に出てきたものを返すようです。

また、重複する値がない場合(全て1個の場合)、エラーになりますのでエラー処理に合わせて
どちらを使うか決めてみてください。

【66773】Re:範囲内で一番多い値を取得する方法
お礼  kanabun  - 10/10/5(火) 16:01 -

引用なし
パスワード
   ▼独覚 さん:
いつもお世話になっています

>Application.mode(range("A1:A12"))
>または
>Worksheetfunction.mode(range("A1:A12"))
>はどうでしょうか?

そうでした(org)
前に(別の板で)教えてもらったのに...

【66789】Re:範囲内で一番多い値を取得する方法
お礼  かな  - 10/10/6(水) 16:56 -

引用なし
パスワード
   ▼独覚 さん:

ありがとうございます
MODE関数というものがあるんですね
調べてみたら、最頻値を取得できるということが分かりました

早速、試してみます


>Application.mode(range("A1:A12"))
>または
>Worksheetfunction.mode(range("A1:A12"))
>はどうでしょうか?
>
>ただし個数が多いものが複数あった場合、最初に出てきたものを返すようです。
>
>また、重複する値がない場合(全て1個の場合)、エラーになりますのでエラー処理に合わせて
>どちらを使うか決めてみてください。

【66790】Re:範囲内で一番多い値を取得する方法
お礼  かな  - 10/10/6(水) 17:00 -

引用なし
パスワード
   ▼kanabun さん:

あどばいすありがとうございます

いろいろ試行錯誤して、dictionaryオブジェクトを利用して、
むりくりプログラムを完成させてみました

ヒントを頂きありがとうございました


>▼かな さん:
>
>>この中で、一番値の多いもの。
>>この場合は 10 になるのですが・・・
>>このように10を取得するのにいい方法といいますか、
>何か適した関数とかあるのでしょうか?
>
>関数では思いつかなかったので、ユーザー定義関数ではいかが?
>
>Function MaxCount(r As Range)
> Dim i As Long, k As Long
> Dim v
> Dim dic As Object
> 
> v = r.Value
> Set dic = CreateObject("Scripting.Dictionary")
> For i = 1 To UBound(v)
>   dic(v(i, 1)) = dic(v(i, 1)) + 1
> Next
> For Each v In dic.Keys()
>  If k < dic(v) Then k = dic(v): MaxCount = v
> Next
> Set dic = Nothing
>End Function
>
>
>どこかのセルに =MaxCount(A1:A12)

【66791】Re:範囲内で一番多い値を取得する方法
お礼  かな  - 10/10/6(水) 17:03 -

引用なし
パスワード
   ▼Jaka さん:

アドバイスありがとうございます
配列数式の部分がいまいち理解できないので、今、読解中です
もう少し、勉強します

今回はdictionaryオブジェクトを使って、なんとか完成させました


>難しいですね。
>数式に詳しいなら、もっと効率のいいのが書けそうですけど。
>何行目の値ぐらいまでしか取れませんでした。
>また、例題の場合で10と同数あった物がある場合は無視しました。
>
>MsgBox Application.Evaluate("MATCH(MAX(COUNTIF(A1:A12,A1:A12)),COUNTIF(A1:A12,A1:A12),0)") & "行目の値"
>
>
>配列数式です。
>{=INDIRECT("A" & MATCH(MAX(COUNTIF(A1:A12,A1:A12)),COUNTIF(A1:A12,A1:A12),0))}

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