VBA WorksheetFunction.Trim の使い方|VBA Trim との違いと使い分けを解説

スポンサーリンク

VBA の Trim 関数を使ったのに、文字列の途中にある余分なスペースが消えなくて困ったことはありませんか。実は、VBA の標準 Trim 関数は先頭と末尾のスペースしか削除しません。単語の間にある連続スペースを1つにまとめたいときは、WorksheetFunction.Trim を使います。

この記事では、WorksheetFunction.Trim の使い方を、VBA 標準の TrimLTrimRTrim との違いとあわせて解説します。4つの空白処理の挙動は、入力と出力の比較表で整理します。CSV やシステム出力のデータクリーニングに使える実務コードも紹介します。最後に、Trim 系をどれだけ使っても消えないノーブレークスペース(Chr(160))の落とし穴と対処法も取り上げます。

VBA の WorksheetFunction.Trim とは?

WorksheetFunction.Trim は、ワークシート関数の TRIM を VBA から呼び出すメソッドです。文字列の先頭と末尾のスペースを削除します。さらに、単語の間にある連続したスペースも1つだけ残して圧縮します。

VBA には標準の Trim 関数もあります。ただし標準の Trim 関数は、中間の連続スペースには手を付けません。「単語間のスペースを1つに詰める」処理は、VBA 標準関数にはない機能です。

そこで WorksheetFunction オブジェクトを経由して、ワークシート関数の TRIM を借りてくるわけです。具体的な挙動を見てみましょう。

result = WorksheetFunction.Trim("A   B   C")
'--- 結果は "A B C"(単語間スペースが1つに圧縮される)---

入力 "A B C" の単語間には、それぞれ3つのスペースがあります。WorksheetFunction.Trim を通すと、すべて1つにまとめられて "A B C" になります。

NOTE: ワークシート関数を VBA から呼ぶ仕組み全般については、VBAでWorksheetFunctionを使う方法で詳しく解説しています。

WorksheetFunction.Trim の使い方

まずは基本の構文と、実際に動かすための準備を確認します。

WorksheetFunction.Trim(Arg1)

引数は次のとおりです。

引数必須/省略データ型説明
Arg1必須String余分なスペースを削除したい文字列

戻り値は String 型です。Application.WorksheetFunction.Trim(Arg1) と書いても同じ動作になります。Application. は省略できます。

VBE の起動と標準モジュールの準備

コードを書くには、まず VBE(Visual Basic Editor)を開きます。Excel で Alt + F11 キーを押すと VBE が起動します。

リボンから開くこともできます。「開発」タブの「Visual Basic」ボタンをクリックする方法です。「開発」タブが表示されていない場合は、次の手順で追加します。

  1. 「ファイル」→「オプション」を開きます。
  2. 「リボンのユーザー設定」を選びます。
  3. 右側の一覧で「開発」にチェックを入れます。

VBE が開いたら、メニューの「挿入」→「標準モジュール」をクリックします。表示されたコード入力欄に、これから紹介するコードを貼り付けてください。

基本コード

実際に WorksheetFunction.Trim を動かす基本コードです。変換前と変換後をメッセージボックスで見比べられるようにしています。

Sub WorksheetFunctionTrimSample()
    Dim sBefore As String '変換前の文字列
    Dim sAfter As String  '変換後の文字列

    '--- 変換前の文字列を用意 ---
    sBefore = "  Excel   VBA   入門  "

    '--- 連続スペースを1つに圧縮し、先頭末尾も削除 ---
    sAfter = WorksheetFunction.Trim(sBefore)

    '--- 変換前後を確認 ---
    MsgBox "変換前:[" & sBefore & "]" & vbCrLf & _
           "変換後:[" & sAfter & "]"
End Sub

このコードを実行すると、変換後は [Excel VBA 入門] と表示されます。先頭と末尾のスペースが消え、単語間の連続スペースも1つに詰まりました。[ ] で囲んでいるのは、両端のスペースが消えたことを目で確認しやすくするためです。

VBA Trim・LTrim・RTrim との違い|4関数の比較表

ここがこの記事の核心です。VBA には空白を扱う関数が複数あります。それぞれ削除する範囲が異なります。

関数先頭のスペース末尾のスペース中間の連続スペース
Trim削除する削除する残す
LTrim削除する残す残す
RTrim残す削除する残す
WorksheetFunction.Trim削除する削除する1つに圧縮する

同じ文字列に4つの関数を通すと、結果は次のように変わります。入力は " A B " とします。先頭に2つ、中間に3つ、末尾に2つのスペースがある文字列です。

関数出力結果
Trim(" A B ")"A B"
LTrim(" A B ")"A B "
RTrim(" A B ")" A B"
WorksheetFunction.Trim(" A B ")"A B"

TrimLTrimRTrim はいずれも、中間の連続スペースをそのまま残します。中間スペースを1つに詰めるのは WorksheetFunction.Trim だけです。ここが最大の違いです。

「先頭と末尾だけ消えればいい」場合は VBA 標準の Trim で十分です。「単語間の余分なスペースも整えたい」場合は WorksheetFunction.Trim を選びます。

TIP: 各関数の単体の使い方は、VBA Trim関数VBA LTrim関数VBA RTrim関数の各記事で解説しています。空白処理全体の使い分けはVBAで空白を削除する方法まとめも参考にしてください。

WorksheetFunction.Trim が活躍する実務シーン

WorksheetFunction.Trim の出番は、間隔がそろっていないデータを受け取ったときです。代表的なのが、システムから出力されたレポートや CSV ファイルです。項目の区切りが複数スペースになっていることがよくあります。実務で使えるコードを2つ紹介します。

実務コード1: 1つのセルをクレンジングする

A 列のセルに入った文字列を整え、B 列に書き出すコードです。

Sub CleanSingleCell()
    Dim sRaw As String   '元の文字列
    Dim sClean As String '整形後の文字列

    '--- A2セルの値を取得 ---
    sRaw = Range("A2").Value

    '--- 先頭末尾+中間スペースを正規化 ---
    sClean = WorksheetFunction.Trim(sRaw)

    '--- 整形結果をB2セルに出力 ---
    Range("B2").Value = sClean
End Sub

A2 に " 山田 太郎 " のような値が入っていても、B2 には "山田 太郎" ときれいに出力されます。

実務コード2: セル範囲を一括クレンジングする

実務では1セルだけでなく、列全体を一気に処理したい場面が多いはずです。A 列のデータを最終行まで順番に整えるコードです。

Sub CleanRangeWithTrim()
    Dim lastRow As Long '最終行の行番号
    Dim i As Long       '行カウンター

    '--- A列の最終行を取得 ---
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row

    '--- 2行目から最終行まで繰り返す ---
    For i = 2 To lastRow
        '--- 文字列のセルだけを対象に正規化 ---
        If VarType(Cells(i, 1).Value) = vbString Then
            Cells(i, 1).Value = WorksheetFunction.Trim(Cells(i, 1).Value)
        End If
    Next i

    MsgBox "クレンジングが完了しました。"
End Sub

VarType でセルの値が文字列かどうかを確認しています。数値や日付のセルに Trim をかけると、意図しない型変換が起きることがあるためです。文字列のセルだけを対象にすると安全です。

ノーブレークスペース(Chr(160))が削除できない落とし穴と対処法

WorksheetFunction.Trim には1つ大きな落とし穴があります。それが「ノーブレークスペース」です。Web ページや一部のシステムからコピーしたデータに混ざっていることがあります。

ノーブレークスペースは、文字コードの値が160の空白文字です。HTML では   として使われます。見た目は普通のスペースとそっくりですが、別の文字です。

WorksheetFunction.Trim が削除できるのは、値が32の半角スペース(Chr(32))だけです。これは公式ドキュメントにも明記されています。VBA 標準の TrimLTrimRTrim も同じく、ノーブレークスペースには反応しません。

Sub TrimCannotRemoveNbsp()
    Dim sText As String '元の文字列

    '--- 単語の間にノーブレークスペースを含む文字列 ---
    sText = "A" & Chr(160) & Chr(160) & "B"

    '--- Trimをかけてもノーブレークスペースは残る ---
    MsgBox "[" & WorksheetFunction.Trim(sText) & "]"
End Sub

このコードを実行しても、A と B の間のノーブレークスペースは消えません。「Trim を試したのに空白が消えない」という現象の正体は、たいていこれです。

対処法は、ノーブレークスペースを先に半角スペースへ変換することです。Replace 関数を使います。半角スペースに変えてから WorksheetFunction.Trim を通すと、区切りのスペースを残しつつ正規化できます。

Sub CleanWithNbsp()
    Dim sRaw As String   '元の文字列
    Dim sClean As String '整形後の文字列

    '--- A2セルの値を取得 ---
    sRaw = Range("A2").Value

    '--- ノーブレークスペースを半角スペースに変換 ---
    sClean = Replace(sRaw, Chr(160), " ")

    '--- 連続スペースを1つに圧縮し先頭末尾も削除 ---
    sClean = WorksheetFunction.Trim(sClean)

    '--- 整形結果をB2セルに出力 ---
    Range("B2").Value = sClean
End Sub

Chr(160) を半角スペースに変換 → WorksheetFunction.Trim」の順番がポイントです。いきなり全削除すると、本来必要な区切りスペースまで失われることがあります。

NOTE: ノーブレークスペースの正体と消し方は、Excelで消えない空白の正体と消し方でさらに詳しく解説しています。

WorksheetFunction.Trim を使うときの注意点・よくあるエラー

最後に、つまずきやすいポイントを整理します。

1つ目は、タブや改行は削除されないことです。削除対象はあくまで半角スペースだけです。タブ(Chr(9))や改行(Chr(10)、Chr(13))が混じっている場合は、Replace で個別に処理する必要があります。

2つ目は、全角スペースの扱いです。WorksheetFunction.Trim は半角スペースを対象に設計されています。全角スペースを確実に消したいときは、Replace(s, " ", " ") で半角に変換してから処理するのが安全です。

3つ目は、空セルや数値セルへの適用です。空のセルや数値のセルを直接渡すと、思わぬ型変換が起きることがあります。実務コード2のように VarType で文字列かどうかを確認してから渡すと、トラブルを防げます。

つまずきポイント原因対処法
中間スペースが残るVBA 標準の Trim を使っているWorksheetFunction.Trim を使う
ある空白だけ消えないノーブレークスペース(Chr(160))Replace で半角スペースに変換してから処理
全角スペースが残る対象は半角スペースのみReplace(s, " ", " ") で半角に変換
タブ・改行が残る対象は半角スペースのみReplace で Chr(9)/Chr(10)/Chr(13) を処理

まとめ

WorksheetFunction.Trim は、文字列の先頭・末尾のスペースに加えて、単語間の連続スペースも1つに圧縮できるメソッドです。VBA 標準の Trim 関数が中間スペースを残すのに対し、こちらは中間スペースを詰めてくれます。この違いが両者の最大のポイントです。

システム出力や CSV インポート後のデータで、間隔が不規則な文字列を整えたいときに役立ちます。ただし、ノーブレークスペース(Chr(160))は Trim 系では消せません。Replace で半角スペースに変換してから処理する、という流れを覚えておくと安心です。

空白処理の関数はそれぞれ役割が違います。先頭・末尾だけなら Trim、片側だけなら LTrim/RTrim、中間も整えるなら WorksheetFunction.Trim、と使い分けてみてください。

関連記事

タイトルとURLをコピーしました