• 締切済み

エクセルで数えるには

A A B B B C D D D D  (ひとつのセルに値は一個入力) という表があった時にその表自体に含まれる値の個数の 順番に並べ替えてみたいのですが、どのような作業が ひつようでしょうか? こんな結果になればよいのですが・・・ C A A B B B D D D D いろいろ試してみたのですが うまくいきません どなたか詳しい方よろしく御回答願います。

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.2

何列・何行にもなっているデータを対象にVBAで考えて見ました。 ツール-マクロ-VBEで出てくる画面で、メニューの挿入-標準モジュールをクリックして出てくる画面に下記を 貼りつけて下さい。 Sub test01() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("sheet2") Set sh2 = Worksheets("sheet3") sh1.Activate Dim h(1000) Dim c(1000) Dim cl As Range Set rng = sh1.Range("a1:d3") cc = rng.Columns.Count n = 1 '----文字列と出現頻度の配列作成 For Each cl In rng For i = 1 To n If cl = c(i) Then '----既出 h(i) = h(i) + 1 GoTo p01 End If Next i '--新出 c(n) = cl h(n) = 1 n = n + 1 p01: Next '-----出現頻度順にソート For i = 1 To n - 1 For j = i + 1 To n If h(i) < h(j) Then Else w = h(i) h(i) = h(j) h(j) = w w = c(i) c(i) = c(j) c(j) = w End If Next j Next i '-----別シートに結果出力 sh2.Activate k = 1: l = 1 For i = 1 To n For j = 1 To h(i) sh2.Cells(k, l) = c(i) l = l + 1 If l > cc Then l = 1 k = k + 1 End If Next j Next i End Sub そして質問者のデータの範囲で、Set rng = sh1.Range("a1:d3")のa1:d3を置換えてください。 Set sh1 = Worksheets("sheet2")はデータのあるシート 名で、Set sh2 = Worksheets("sheet3")は結果を出すシート名でsheet2、sheet3のところを置換えてください。 そして実行してください。 (例データ)Sheet2のA1:D3 a c c d b a b d c c d e (結果)Sheet3のA1:D3 e b b a a d d d c c c c になりました。結構難しくて、バグ無きことを祈りつつ。 上記のままでは、1000セルが限度です。

ennkai
質問者

お礼

力作マクロありがとうございます! 早速はりつけた試してみますね^^ ただ惜しむべきは こっちの扱うデータが 3000行くらいなんですよ。 ともあれありがとうございました

回答No.1

A1セルからJ1セルに、A A B B B C D D D Dと入っている前提でお話しします。 まず、COUNTIF関数で、値の個数を求めます。 A2セルに、 =COUNTIF($A$1:$J$1,A1) と入力します。 A2セルをコピーして、B2セルからJ2セルに貼り付けます。これで、各値の個数が表示されました。 次に、並べ替えをします。A1セルからJ2セルまでを洗濯して、データ→並べ替えを選びます。 「オプション」ボタンを押して、方向を列単位にしてOKを押します。 最優先されるキーに、行2を指定し、昇順を指定してOKを押します。 これにて完了です。

ennkai
質問者

補足

早速ためしてみました ありがとうございます 質問の内容を縦に入力して 式を多少変えてみたところ うまく出来ました!!。 追加質問ですが・・・ 並べ替え後の結果はこれですが 「CAABBBDDD] これを最終的に 「CADB]とだけ表示できますか? (個数の順番に値の名前を表示) お手数ですが よろしくおねがいします

関連するQ&A