Function 文字頻度(文字列 As String, Optional 順位 As Integer = 0, Optional 出力 As Integer = 0) ' 入力 文字列:対象の文字列 ' 順位:出力する文字の頻度順位(省略可) ' 出力: 0:文字(省略可:既定) ' 1:使用されている個数 ' 戻り値 ' 順位省略時は文字種別個数 ' 順位指定時 ' 出力 0:指定順位の文字を返す ' 1:指定順位の文字数を返す Dim tmp() '作業用配列 1:文字 2:個数 3;処理済みフラグ Dim Ub As Integer '配列添え字上限 Dim i As Integer, k As Integer '作業用カウンタ Dim flg As Boolean '作業用フラグ Dim Dt As String '作業用文字格納用 ReDim tmp(3, 0) '重複を排除して作業用配列に格納 For i = 1 To Len(文字列) Dt = Mid(文字列, i, 1) flg = False '新規判定 格納済み配列内を検索 For k = 1 To UBound(tmp, 2) If Dt = tmp(1, k) Then '有ったら tmp(2, k) = tmp(2, k) + 1 'カントアップ flg = True Exit For End If Next k If Not flg Then '無かったら新規追加 Ub = UBound(tmp, 2) + 1 ReDim Preserve tmp(3, Ub) tmp(1, Ub) = Mid(文字列, i, 1) tmp(2, Ub) = 1 tmp(3, Ub) = False End If Next i '順位付け Dim TblRank() '結果格納用配列 1:文字 2:個数 Dim mV As Double, v As Double Dim idx As Integer Dim cnt As Integer ReDim TblRank(2, UBound(tmp, 2)) cnt = 0 Do flg = False mV = -1 idx = -1 For i = 1 To UBound(tmp, 2) If Not tmp(3, i) Then v = tmp(2, i) + 1 - AscW(tmp(1, i)) / 100000 If v > mV Then idx = i mV = v '最大値更新 flg = True End If End If Next i If idx > 0 Then '候補あり? (必ず有るはず!無ければバグ!) cnt = cnt + 1 TblRank(1, cnt) = tmp(1, idx) TblRank(2, cnt) = tmp(2, idx) tmp(3, idx) = True End If Loop While flg '戻り値 If 順位 = 0 Then 文字頻度 = UBound(TblRank, 2) Else Select Case 出力 Case 0: 文字頻度 = TblRank(1, 順位) Case 1: 文字頻度 = TblRank(2, 順位) End Select End If End Function