無色無味無臭の毒を除去:VBAとワークシートのTrim関数の違い

先日から、「賞状印刷用データ作成マクロ」に挑戦している。
前回は、一位から四位までの選手の氏名を取得する関数を作成してみた。
infoment.hatenablog.com
今日も、前回の続きから。
ja.wikipedia.org
※毒:Poisonとポアソン:Poissonを絡めた駄洒落。今回の内容にポアソン分布等は登場しませんので、悪しからずm(_ _)m。



前回登場したトーナメント表について。

こちらに使用される選手の名前は、各支部から提出される名簿を元に作成される。
初見で読めない名前も散見されるため、名簿を見ながらの転記は非常に危険だ。
そこで、トーナメント表作成の際は、提出されたデータからそのままコピペする。
しかし、全ての支部の先生方が、同じ方法でデータを作成くださるとは限らない。
特に、スペースの使い方が複数あったりする。

例)

  1. 山田 花子 ← 姓と名の間に、半角スペースが一つある。
  2. 山田 花子 ← 姓と名の間に、半角スペースが二つある。
  3. 山田 花子 ← 姓と名の間に、全角スペースが一つある。
  4. 山田 花子  ← 名前の後に、半角スペースが一つある。

上記1. のパターンを想定してマクロを作成して、それ以外のものが偶にあって
上手くいかないケースを、誰もが一度は体験しているのではないだろうか。

特に4. の、文字列最後の半角スペースの存在は、まず見た目で気づけない。
業務中、これに何度か苦しめられたことがある。その気づけなさ具合から、
私は個人的にこれを「無色無味無臭の毒」と呼んでいる。

文字列前後の空白を取り除くには、Trim関数が便利だ。ただし、VBAとワーク
シート関数では挙動が少し違うので、注意が必要になる。

  • VBAの場合:文字列前後のスペース文字を除去(半・全角を問わず)。
  • ワークシートの場合:文字列前後のスペース文字を除去。文字列内に連続する
    スペース文字がある場合、連続するグループ毎に一文字残してこれも除去。
    半・全角が混在する場合、半角スペースが優先的に残される(らしい)。
Sub テスト()
    Dim Src As String
        Src = "    山田          花子    "
        MsgBox "元の文字:" & Src & vbNewLine & _
               "VBA:" & Trim(Src) & vbNewLine & _
               "ワークシート:" & WorksheetFunction.Trim(Src)
End Sub


両者に一長一短ありそうで、状況に合わせて使い分けることが望ましい。
今回は上記1. のパターンにしたいので、以下の作戦で処理する。

  1. 姓名内のスペース文字を、全て半角スペースに置換する。
  2. ワークシートのTrim関数で、前後の半角スペースがあれば除去。

↓ 昨日の「生徒の名前」関数を改修。

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)) = WorksheetFunction. _
                                    Trim(Replace(r.Value, " ", " "))
            End If
        Next
        
        生徒の名前 = arr
End Function

傾向として全文字数が3の場合、スペース文字で調整されることが多いようだ。

次回は、賞状用データ(Word)を作成します。

参考まで。