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