- ベストアンサー
Excelで行列範囲のトップ10を表示させたい
Excelのオートフィルタを使うと列単位でトップ10を表示させる事が可能ですが、これと同じような感じで、行列範囲でトップ10を表示させる方法はありませんでしょうか? ※行列範囲にある文字を1列に整理すれば済む話なのですが、データ数が非常に多い&行によって列幅が異なるため、出来れば行列範囲でトップ10を表示させたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
VBAでやってみました。 データの範囲をA1~H10 ランキングを表示するのがJ1以下~ それぞれの個数をK1以下に表示するものとします。 Sub TEST01() Dim myDic As Object Dim arOut As Variant Dim c As Range, Rng As Range Dim i As Long Set myDic = CreateObject("Scripting.Dictionary") With ActiveSheet Set Rng = .Range("A1:H10") For Each c In Rng If Not myDic.exists(c.Value) Then myDic.Add c.Value, Application.CountIf(Rng, c.Value) End If Next arOut = myDic.Keys .Range("J1").Resize(myDic.Count).Value = WorksheetFunction.Transpose(arOut) For i = 1 To myDic.Count .Cells(i, "K").Value = myDic.Item(Cells(i, "J").Value) Next i .Range(.Range("J1:K1"), .Range("J1:K1").End(xlDown)).Sort Key1:=Range("K1"), Order1:=xlDescending, Header:=xlNo End With Set myDic = Nothing Set Rng = Nothing End Sub
その他の回答 (2)
- hotosys
- ベストアンサー率67% (97/143)
トップ10が大きい順か小さい順かわからないが、 G1:G10にA1:E10の範囲の大きい順のトップ10を表示する場合。 G1:=LARGE($A$1:$E$10,ROW()) これをG2:G10の範囲にコピー。 H1:H10にA1:E10の範囲の小さい順のトップ10を表示する場合。 H1:=SMALL($A$1:$E$10,ROW()) これをH2:H10の範囲にコピー。
お礼
ご回答頂きどうもありがとうございます。 質問の仕方が間違っていた事に気付きました、すみません・・・。オートフィルタで出来るトップテンは恐らく数字の大小なのですね。 私が行いたいトップテンというのは文字であり、行列範囲に書かれた文字のうち、数の多い文字のトップテンを表示させたいと考えています。 ※イメージとしては以下のような感じです。 東京 大阪 札幌 東京 大阪 東京 仙台 東京 大阪 東京 東京 福岡 札幌 東京 東京 大阪 東京 札幌 東京 大阪 大阪 東京 大阪 東京 ・・・ ⇒1位=東京、2位=大阪、3位=札幌、・・・ 始めはCOUNTIFを使おうかとも思ったのですが、項目数が非常に多いため断念しました。無理なようでしたらVBAで作る事にしますが、もしExcelの機能だけで出来るようでしたら教えて頂けませんでしょうか?
- imogasi
- ベストアンサー率27% (4737/17069)
出来ないものはあきらめること。エクセルの標準的な入力方式に反した使い方をしておいて、仕様が無い。 (1)エクセルの操作(フィルタのような備わった機能)では該当のない (2)関数などでは単純に簡単には出来ない ランクー>並べ替え? (3)VBAならできるでしょう。 1行分だけなら 作業行を確保しそこにコピーし、ソートし、左から10個取り出せばどうですか。マクロの記録だけで大筋のところはコードがわかると思う。 >表示させる方法はありませんでしょうか 「表示」ってどうするの?実例を書いて説明しないと。ここでも注文によっては手間取るよ。
お礼
意図した動作をしました!! VBAは多少理解しているつもりでいましたが、こんな簡単なプログラムで出来るとは思いませんでした。本当にどうもありがとうございます。