「小学3年男子形」を「小学生三年男子 形の部」にしたい

先日、「小学1年生」を「小学一年生」に変換すべく、文字列に
含まれるアラビア数字を漢数字に置き換える関数を作ってみた。
infoment.hatenablog.com

ところがよくよく確認してみると、要件はもう少し複雑だった。
修正してみよう。

【要 件】

  1. 小学生、中学生、高校生、一般の4区分がある。
  2. それぞれに「男子」「女子」を表記する。
  3. それぞれに「団体」(団体戦の意)が加わる場合がある。
  4. 小学生、中学生のみ、学年まで表記する。
  5. 「形」または「組手」を、「形の部」のように表記する。
  6. 元の文字列は、「小学3年生男子形」のように表記されている。

実は、空手の試合記録に使用するデータだったわけで。
ということで、次のとおり修正してみた。

Function 部門変換(src As String) As String
    Dim myReg As Object
    Set myReg = CreateObject("VBScript.RegExp")
        myReg.Pattern = "(小学|中学|高校|一般)生?([0-90-9]?)年?(男子|女子)(団体)?(形|組手)"
    Dim MC As Object
    Dim SM As Object
        If Not myReg.Test(src) Then
            部門変換 = src
            Exit Function
        End If
        
    Set MC = myReg.Execute(src)
    Set SM = MC(0).SubMatches
    
    Dim Dict As Object
    Set Dict = CreateObject("Scripting.Dictionary")
        ' 「一般」以外は、「小学生」「中学生」「高校生」で表記統一。
        Select Case SM(0)
            Case "一般": Dict(1) = SM(0)
            Case Else: Dict(1) = SM(0) & "生"
        End Select
        ' 高校生は学年表記無し。
        ' 表記は漢数字で「〇年」とする(〇年生としない)。
        If SM(0) <> "高校" And SM(1) <> vbNullString Then
            Dict(1) = Dict(1) & _
                      WorksheetFunction.Text(SM(1), "[DBNum1]0年")
        End If
        
        ' 男子または女子を追加。
        Dict(1) = Dict(1) & SM(2)
        
        ' 団体表記があれば追加。
        If SM(3) <> vbNullString Then
            Dict(1) = Dict(1) & SM(3)
        End If
        
        ' 形の部/組手の部
        Dict(2) = SM(4) & "の部"
        
        部門変換 = Join(Dict.Items, " ")
End Function

Collectionは値の変更ができないので、今回はDictionaryを使用した。
辞書(連想配列)としてではなく、最後に全角スペースで結合する
ためだけの用途。

ということで、今回の結果がこちら。

ところで、なぜこんな変換が必要になったのか。これらの文字列は、
実は試合の入賞者の、賞状印刷のためのものだったわけで。

ということで次回は、賞状を作る工程のご紹介。

参考まで。