選んだ順で一位から四位の名前を取得したい

前回は、「小学3年生女子組手」などを「小学生三年女子 組手の部」のように
一定のルールで成形することに挑戦した。
infoment.hatenablog.com
今日は、前回の続きから。

前回も少し述べたように、一連の作業は賞状印刷用データを作成するためのもの。
賞状のレイアウトに合わせて調整されたWordファイルがあって、そこに下記情報を
反映・印刷する。各項目の後ろには、今までの運用を記載。

  1. 部門 ← 手入力
  2. 順位 ← 手入力
  3. 名前 ← Excel側のトーナメントで選択コピーののち、Wordでペースト

↓ こんな感じのExcelシートから、一位~四位までの情報を得る必要がある。


試合は各コートで同時に始まり、終わり次第表彰となるので、試合終わりには
大至急データを作成して印刷する必要があった(今まで)。そこで、その作業
支援をExcel VBAでできないかと考えた次第。

作戦は、こんな感じだ。

  1. 一位から四位までの選手を、Excel上で順に選択する。
  2. マクロ実行。
  3. 一位から四位までの選手名と部門名、順位を反映した賞状用Word作成。
  4. 各データの内容を確認ののち、手動で印刷。

最後に手動で印刷するのは、レイアウトの乱れが無いかを確認するため。
中には日本在住の外国人のお子さんもおられて、例えば
ジャン・リュック・ピカード」さん
が優勝した場合、「山田花子」さん用にレイアウト調整された賞状データは
見直しが必要なわけで。折角優勝したのだから、奇麗にレイアウトを整えて
渡してあげたい。

まず、選手の名前取得について。

For Each 変数 In Selection

でループすると、選択した順に処理が進む。これを利用して、選手の名前を
入賞順に取得することとした。

Function 生徒の名前() As Variant
    Dim r As Range
    ' 名前格納用配列。
    Dim arr As Variant
        arr = Array()
        
    ' 選んだ順に配列に格納。
    ' 団体戦などは3チームしか出ない場合もあるため、配列のサイズは可変とする。
        For Each r In Selection
            ' セルが結合されている場合に備えて、空白判定を行う。
            If r <> vbNullString Then
                ReDim Preserve arr(UBound(arr) + 1)
                arr(UBound(arr)) = r.Value
            End If
        Next
        
        生徒の名前 = arr
End Function

次に順位について、1~4位を以下のとおり変換する必要がある。

  1. 1位 ⇒ 優勝
  2. 2位 ⇒ 二位
  3. 3位 ⇒ 三位
  4. 4位 ⇒ 敢闘賞

4位は四位ではなく、ここでは敢闘賞としている。よく頑張ったと労いたい。

Public Function 順位(i As Long) As String
    ' 選んだ順で順位を決定。
    Select Case i
        Case 0: 順位 = "優勝"
        Case 1: 順位 = "二位"
        Case 2: 順位 = "三位"
        Case 3: 順位 = "敢闘賞"
    End Select
End Function

以上を組み合わせて、テストしてみよう。

Sub テスト()
    Dim arr(0 To 3) As Variant
    Dim i As Long
        For i = 0 To 3
            arr(i) = 順位(i) & ":" & 生徒の名前(i)
        Next
        
        MsgBox Join(arr, vbNewLine)

End Sub

結果がこちら。※選手の名前は、Ctrlキーを押しながら選択している。

上手くいった?いえいえ、何事にも「例外」は付きものなわけで。

次回に続きます。