エクセルで単語がたくさんあるシートがあるとします(同じ単語が重複することがある)

このシート内のの単語の頻出ランキングを作りたいと考えているのですが、

1行1列から総当たりでカウントしていくと。。。。ランキングにできません(-"-)

シート2などに、一旦出現する単語リスト(重複しない)なるものを作ればランキングを作ることはできるんですが。。。シート2.( )=シート1の総当たり then カウント++ みたいな感じで。
でもその単語リスト(重複しない)を作るのがたいへんなんです。

伝わったでしょうか??どのようにしたらいいでしょうか?? よろしくお願いします(+_+)

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/10/11 19:53:31
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:doxas No.3

回答回数13ベストアンサー獲得回数4

ポイント50pt

動的配列をうまく活用すれば、できるとは思いますが……どうでしょう。

質問者さんの書かれている内容だけを見ると、いまいち状況がわかりませんが、憶測で書いてみました。


Option Explicit

Type RankingData    'ランキング用構造体
    Items As String 'ランキングのアイテム
    Values As Long  'アイテムの個数
End Type

Sub test()

    Dim V As Variant 'セル範囲のデータ取得用
    Dim R As Variant 'ForEachNext 用カウンタ
    Dim L As Long    '汎用データ用
    Dim C As Long    '汎用カウンタ
    Dim Ranking() As RankingData
    
    V = Worksheets("Sheet1").UsedRange      '使用されているセル範囲を取得
    ReDim Ranking(0)
    Ranking(0).Items = V(1, 1)
    
    For Each R In V
        L = UBound(Ranking)
        For C = 0 To L
            If R = Ranking(C).Items Then    '既出アイテムかどうかチェック
                Ranking(C).Values = Ranking(C).Values + 1
                Exit For
            Else
                If C = L Then
                    ReDim Preserve Ranking(L + 1)
                    Ranking(L + 1).Items = R
                    Ranking(L + 1).Values = 1
                    Exit For
                End If
            End If
        Next
    Next
    L = UBound(Ranking)
    With Worksheets("Sheet2")               'Sheet2 に集計した情報を吐き出す
        For C = 0 To L
            .Cells(C + 1, 1).Value = Ranking(C).Items
            .Cells(C + 1, 2).Value = Ranking(C).Values
        Next
        .Columns("A:B").Select              '結果をソート(降順)
        Selection.Sort Key1:=.Range("B1"), Order1:=xlDescending
        .Range("A1").Select
    End With
    
End Sub

これでレコード数を順次更新しながらカウントはできます。

上記のコードですと、ひとつめのシート(Sheet1)にデータがあり、ふたつめのシート(Sheet2)に結果が出力されます。

id:yayaya1130

.Columns("A:B").Select '結果をソート(降順)

Selection.Sort Key1:=.Range("B1"), Order1:=xlDescending

.Range("A1").Select

のところでエラーが起きちゃったんで、とりあえず消してみて実行したら

私の欲しい結果が返った来ました。(ソートされてない状態)ありがとうございます。

これを見て少し勉強したいと思います。

2010/10/11 19:41:13

その他の回答2件)

id:yossiy7 No.1

回答回数778ベストアンサー獲得回数96

ポイント15pt

データ→集計

で駄目なんでしょうか?

一度別シートにコピーして

データ→集計

で、個数でソートしてコピーして

別シートを消して

ペースト

という感じで。

id:yayaya1130

集計をもう少し詳しく教えてください^^

2010/10/11 19:10:22
id:hiko4karasu No.2

回答回数106ベストアンサー獲得回数1

ポイント15pt

データ>フィルタ>フォルダオプションの設定

重複するレコードは無視するとして、同じ単語を表示しないようにします。

countifで単語を数えて、単語数でソートするれば、出来上がり。

 

これでどうでしょう?

id:yayaya1130

たとえば10行10列で単語が入ってるとき1列にまとめないとだめですか??

重複するレコードを無視して一旦何種類の単語が出るかを把握して

countif をその回数分するということでしょうか??


行、列のことなるいろんなエクセルのシートがあり、それぞれ、ボタンひとつでランキングのカウントができるとうれしいのですが。。。 

2010/10/11 19:32:18
id:doxas No.3

回答回数13ベストアンサー獲得回数4ここでベストアンサー

ポイント50pt

動的配列をうまく活用すれば、できるとは思いますが……どうでしょう。

質問者さんの書かれている内容だけを見ると、いまいち状況がわかりませんが、憶測で書いてみました。


Option Explicit

Type RankingData    'ランキング用構造体
    Items As String 'ランキングのアイテム
    Values As Long  'アイテムの個数
End Type

Sub test()

    Dim V As Variant 'セル範囲のデータ取得用
    Dim R As Variant 'ForEachNext 用カウンタ
    Dim L As Long    '汎用データ用
    Dim C As Long    '汎用カウンタ
    Dim Ranking() As RankingData
    
    V = Worksheets("Sheet1").UsedRange      '使用されているセル範囲を取得
    ReDim Ranking(0)
    Ranking(0).Items = V(1, 1)
    
    For Each R In V
        L = UBound(Ranking)
        For C = 0 To L
            If R = Ranking(C).Items Then    '既出アイテムかどうかチェック
                Ranking(C).Values = Ranking(C).Values + 1
                Exit For
            Else
                If C = L Then
                    ReDim Preserve Ranking(L + 1)
                    Ranking(L + 1).Items = R
                    Ranking(L + 1).Values = 1
                    Exit For
                End If
            End If
        Next
    Next
    L = UBound(Ranking)
    With Worksheets("Sheet2")               'Sheet2 に集計した情報を吐き出す
        For C = 0 To L
            .Cells(C + 1, 1).Value = Ranking(C).Items
            .Cells(C + 1, 2).Value = Ranking(C).Values
        Next
        .Columns("A:B").Select              '結果をソート(降順)
        Selection.Sort Key1:=.Range("B1"), Order1:=xlDescending
        .Range("A1").Select
    End With
    
End Sub

これでレコード数を順次更新しながらカウントはできます。

上記のコードですと、ひとつめのシート(Sheet1)にデータがあり、ふたつめのシート(Sheet2)に結果が出力されます。

id:yayaya1130

.Columns("A:B").Select '結果をソート(降順)

Selection.Sort Key1:=.Range("B1"), Order1:=xlDescending

.Range("A1").Select

のところでエラーが起きちゃったんで、とりあえず消してみて実行したら

私の欲しい結果が返った来ました。(ソートされてない状態)ありがとうございます。

これを見て少し勉強したいと思います。

2010/10/11 19:41:13
  • id:taknt
    L = UBound(Ranking)
    With Worksheets("Sheet2") 'Sheet2 に集計した情報を吐き出す

    の間に
    Worksheets("Sheet2").Activate
    を入れればいいんじゃないかな?
  • id:kia_44
    出てない範囲で。一列なら、ピボットテーブルを作成、ピボットテーブルからコピーしてVlookupなどで引っ張る。
    なんてこともありかも。

    エクセルって自由にデータを扱えますが、データベースと同じようなルールで運用すると集計などはかなり楽になりますよ。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません