「小学3年男子形」を「小学生三年男子 形の部」にしたい
先日、「小学1年生」を「小学一年生」に変換すべく、文字列に
含まれるアラビア数字を漢数字に置き換える関数を作ってみた。
infoment.hatenablog.com
ところがよくよく確認してみると、要件はもう少し複雑だった。
修正してみよう。
【要 件】
- 小学生、中学生、高校生、一般の4区分がある。
- それぞれに「男子」「女子」を表記する。
- それぞれに「団体」(団体戦の意)が加わる場合がある。
- 小学生、中学生のみ、学年まで表記する。
- 「形」または「組手」を、「形の部」のように表記する。
- 元の文字列は、「小学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を使用した。
辞書(連想配列)としてではなく、最後に全角スペースで結合する
ためだけの用途。
ということで、今回の結果がこちら。
ところで、なぜこんな変換が必要になったのか。これらの文字列は、
実は試合の入賞者の、賞状印刷のためのものだったわけで。
ということで次回は、賞状を作る工程のご紹介。
参考まで。