• 締切済み

エクセル名簿の中で使用頻度の多い漢字はどの漢字?

エクセル2013、初心者です。「名簿表の中で使われている漢字一文字の使用頻度順にランキングで抽出したい。」その場合、任意の文字を指定してこの漢字は何位?ではなく、「1位、2位、3位・・・はどの漢字?という風にランキング表で抽出したい。」のです。一つのセルに英数字はなく、漢字だけが7文字から15文字程あり2000セル程ある表から、50文字(50位まで)程、抽出したいです。ご教示よろしくお願いします。

みんなの回答

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.10

No.9の訂正です。 50位を5位としてました。 If i > 5 Then ↓ If i > 50 Then

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.9

No.7、No.8の追加です。 セルに抽出したデータを全て書き込むと時間がかかりそうなので With Sheets("Sheet2")以降を以下に変更してください。 With Sheets("Sheet2") LastRow = .Cells(Rows.Count, "A").End(xlUp).Row .Range(.Cells(1, "A"), .Cells(LastRow, "B")).ClearContents Dim tmp As mList For i = UBound(mBuf) To 1 Step -1 For j = 1 To i - 1 If mBuf(j).mCnt < mBuf(j + 1).mCnt Then tmp = mBuf(j) mBuf(j) = mBuf(j + 1) mBuf(j + 1) = tmp End If Next j Next i For i = 1 To UBound(mBuf) If i > 5 Then Exit For End If .Cells(i, "A").Value = mBuf(i).mStr .Cells(i, "B").Value = mBuf(i).mCnt Next End With End Sub

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.8

No.7の一部訂正です。 一部ドットがなかったのと、結果が50個以下の場合、最終行のセルデータが削除されるのを訂正しました。 With Sheets("Sheet2") 以降に一部訂正があるのでWith Sheets("Sheet2")以降を以下に変更してください。 With Sheets("Sheet2") LastRow = .Cells(Rows.Count, "A").End(xlUp).Row .Range(.Cells(1, "A"), .Cells(LastRow, "B")).ClearContents For i = 1 To UBound(mBuf) .Cells(i, "A").Value = mBuf(i).mStr .Cells(i, "B").Value = mBuf(i).mCnt Next LastRow = .Cells(Rows.Count, "A").End(xlUp).Row .Sort.SortFields.Clear .Sort.SortFields.Add Key:=.Range(.Cells(1, "B"), .Cells(LastRow, "B")) _ , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal .Sort.SetRange .Range(.Cells(1, "A"), .Cells(LastRow, "B")) .Sort.Header = xlGuess .Sort.Apply If LastRow > 50 Then .Range(.Cells(51, "A"), .Cells(LastRow, "B")).ClearContents End If End With End Sub

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.7

VBAだとこれでいけるかも Sheet1の指定した範囲の漢字を、Sheet2のA列に漢字、B列に出現数を、出現数順に記載します。 必ず標準モジュールにコピペしてください。 Sheet1、Sheet2は実際のシート名に A1:U94は実際のセル範囲に変更してください。 Type mList mStr As String mCnt As Long End Type Sub Test() Dim mBuf() As mList Dim i As Long, j As Long, LastRow As Long Dim c As Range, mDic As Object Dim mChar As String Set mDic = CreateObject("Scripting.Dictionary") j = 0 For Each c In Sheets("Sheet1").Range("A1:U94") For i = 1 To Len(c.Value) mChar = Mid(c.Value, i, 1) If Not mDic.Exists(mChar) Then j = j + 1 ReDim Preserve mBuf(j) mDic.Add mChar, j mBuf(j).mStr = mChar mBuf(j).mCnt = 1 Else mBuf(mDic.Item(mChar)).mCnt = mBuf(mDic.Item(mChar)).mCnt + 1 End If Next Next With Sheets("Sheet2") LastRow = .Cells(Rows.Count, "A").End(xlUp).Row .Range(.Cells(1, "A"), Cells(LastRow, "B")).ClearContents For i = 1 To UBound(mBuf) .Cells(i, "A").Value = mBuf(i).mStr .Cells(i, "B").Value = mBuf(i).mCnt Next LastRow = .Cells(Rows.Count, "A").End(xlUp).Row .Sort.SortFields.Clear .Sort.SortFields.Add Key:=.Range(.Cells(1, "B"), .Cells(LastRow, "B")) _ , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal .Sort.SetRange .Range(.Cells(1, "A"), .Cells(LastRow, "B")) .Sort.Header = xlGuess .Sort.Apply .Range(.Cells(51, "A"), Cells(LastRow, "B")).ClearContents End With End Sub

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

#5です。中途になりました、すみません。 漢字ごとの頻度表は、#5の例で、 挿入ーピボットテーブルーピボットテーブルのフィールドで 行ーー>氏名漢字、Σ値ーー>データの個数・氏名漢字、にします。 C列に 氏名漢字 植 田 金 之 介 中 川 末 次 植 村 直 次 で ーーー 下記のような表ができます。 行ラベル データの個数 / 氏名漢字 金 1 介 1 次 2 植 2 川 1 村 1 中 1 直 1 田 1 之 1 末 1 (空白) 総計 13 元データ例は A1:A3 氏名 植田 金之介 中川 末次  植村 直次 でした。 並び順を思い通り(どうするか?)にするのが難しいと思う。 ーー 初歩的なVBAでも、文字ごとに分解するのは簡単に出来るのですが。 文字(漢字、その他文字でも)コードが、それに適したものとなっている、ようだ。

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

・1名の氏名について、漢字以外はないものとする。でも最近は、カタカナの「ケンジ」などあるよね。どうする?漢字を使う、キラキラネームはどうする。 ・1漢字文字について、姓と名の中は区別しないものとする。 ・漢字かどうか判別がエクセルVBAでは難しい。 ・上村 XXが先にあって、上田 YY の行に来た時、漢字「上」の出現頻度の係数に+1する方式はやりたいが、難しい。Findメソッドで検索すればできるが。 ーー 例えば、簡単さ優先で、 1文字ずつC列に下行に並べる。 Sub test01() k = 1 For i = 1 To 2 ’2の行数を氏名数だけ増やす x = Cells(i, "A") For j = 1 To Len(x) If Mid(x, j, 1) = " " Then '全角空白は飛ばし、カウントしない。 Else Cells(k, "c") = Mid(x, j, 1) k = k + 1 End If Next j Next i End Sub (2)C列で、この後、データー重複の削除 操作で重複文字を削除で。、    出てくる文字の例がわかる。 (3)C列で、ソート (4)同じ字は、行的に、まとまるので、カウントプログラムを作り、統計表を作成。 (5)読みの順に漢字を並べるのは、フリガナが要るので、どうする? 時間がないので途中で略。漢字ごとの頻度表は機会があれば。 元々、本件は趣味的なニーズだよな。何に使うのかな?

回答No.4

クエリというのがあるのか。昔あったかな? それを使うのが良いね。 私がVBAで関数を作ったら、派遣従業員がそれはすでにエクセルにありますって指摘があったのを思いだした・・・。

回答No.3

エクセルの達人ならVBAなしでできるのかもしれないな。私はできないので、やるならVBAを使う。 (1) セルの読み書き関数を最初に作る。 例 s = シート名.cells(y, x)だったっけ? (2) セルから文字列を読み込んだら、端の1文字から最後まで順番に読みながら、漢字リストシートと1文字1文字照合しながら文字をカウント・新規追加する。 t = mid(s, 2, 1)とか、こんなっぽいやつ。 (3) 最後に漢字リストシートをソート 処理をVBAステートメント1個1個まで分解すれば、その1個1個は簡単である。

  • f272
  • ベストアンサー率46% (8467/18129)
回答No.2

1)セル中の漢字を1文字づつに分ける。 2)その漢字の頻度分布を計測する。 という手順で行います。作業列を使えばワークシート関数でも可能ですが,VBAを使うのが簡単です。

  • Chiquilin
  • ベストアンサー率30% (94/306)
回答No.1

名簿にテーブル書式を設定してクエリ(クエリ名「名簿」)を作成。 続いて新規クエリを作成して詳細エディタに下記を貼り付け let 文字列結合 = Text.Combine(名簿[氏名]), 文字列分割 = Text.ToList(文字列結合), テーブル変換 = Table.FromList(文字列分割, Splitter.SplitByNothing(), {"文字"}), 行のグループ化 = Table.Group(テーブル変換, {"文字"}, {"件数", each Table.RowCount(_)}), 行の並べ替え = Table.Sort(行のグループ化,{"件数", Order.Descending}), 行数を調整 = Table.FirstN(行の並べ替え,50) in 行数を調整 以上