VBAのTrim・LTrim・RTrim関数で文字列の空白を除去する方法|WorksheetFunction.Trimとの違いも解説

スポンサーリンク

VBAでセルの空白を取りたいけれど、Trim・LTrim・RTrimのどれを使えばいいのか迷っていませんか?さらに「Trimをかけたのに全角スペースが消えない」と詰まった経験がある方も多いはずです。

この記事では、VBAの空白除去でつまずきがちなポイントを 比較表と判断フローチャート で一気に整理します。3つの関数の違いから、全角スペースが消えない本当の原因、WorksheetFunction.Trimとの違いまで、コピペで動くコードつきで解説していきますね。

各関数の詳しい使い方は個別の記事にまとめてあるので、本記事は「結局どれを使えばいいの?」を最短で解決する地図として使ってください。

VBA Trim・LTrim・RTrimの違い【結論】

先に結論からお伝えします。VBAのTrim・LTrim・RTrimは、削除する「位置」だけが違う 3兄弟です。動作そのものはほぼ同じで、空白を消す場所が「前後」「先頭だけ」「末尾だけ」と分かれているだけなんですね。

3関数の比較表(削除位置・構文・使う場面)

3つの関数を「構文・削除位置・戻り値・使う場面」の4軸で横並びにすると、違いが一目でわかります。

関数構文削除位置" VBA 入門 " の戻り値こんなときに使う
LTrimLTrim(文字列)先頭のみ"VBA 入門 "先頭のパディングだけ消したい
RTrimRTrim(文字列)末尾のみ" VBA 入門"末尾の余分な空白だけ消したい
TrimTrim(文字列)先頭+末尾"VBA 入門"前後どちらの空白も不要

3つに共通する大事なポイントが2つあります。

  • 中間(文字列の途中)の空白には一切手をつけない"VBA 入門" のような単語間のスペースはそのまま残ります。
  • 削除できるのは半角スペースだけ。全角スペースは消えません(これが後述する最大の落とし穴です)。

迷ったらどれを使う?1分でわかる選び方

実務で迷ったら、次の3ステップで選べばOKです。

  1. 前後どちらも消したい → Trim。いちばん出番が多いのはこれです。とりあえずTrimを覚えておけば9割の場面に対応できます。
  2. 先頭だけ消したい → LTrim。固定長データの先頭パディングなど、「末尾の空白は残したい」明確な理由があるときだけ使います。
  3. 末尾だけ消したい → RTrim。CSVや基幹システム出力で末尾にスペースが付くケースで活躍します。

LTrimRTrimを両方かけたい」と思ったら、それはTrimを使う場面です。LTrim(RTrim(s))と入れ子にするより、Trim(s)のほうが簡潔でコードの意図も伝わりやすいですよ。

それぞれの関数を深掘りしたい方は、VBA Trim関数の使い方LTrim関数の使い方RTrim関数の使い方で実践コードつきの解説をしています。

VBA Trim関数の基本と使い方

3関数の代表として、まずはTrimの基本動作を押さえておきましょう。Trimさえ理解すれば、LTrim・RTrimは「位置が違うだけ」なのですぐ応用できます。

Trimの構文と基本コード(コピペで動く)

Trimの構文はとてもシンプルです。

Trim(文字列)

引数に文字列を渡すと、前後の半角スペースを取り除いた文字列が返ってきます。まずは動作確認用のコードを試してみましょう。VBE(後述)の標準モジュールに、以下をそのまま貼り付けてF5キーで実行してください。

Sub Trimの動作確認()

    Dim sBefore As String '--- 変換前の文字列 ---
    Dim sAfter As String  '--- 変換後の文字列 ---

    sBefore = "   Excel VBA   "
    sAfter = Trim(sBefore)

    '--- 結果をメッセージボックスで確認 ---
    MsgBox "変換前: [" & sBefore & "]" & vbCrLf & _
           "変換後: [" & sAfter & "]", vbInformation

End Sub

角括弧で囲んでいるので、前後のスペースが消えたことが一目でわかります。前後に空白がない文字列を渡してもエラーにはならず、元の文字列がそのまま返るので、「空白があるか事前にチェックしなきゃ」と心配する必要はありません。

なお、正式にはStrings.Trimと書きますが、StringsはVBAの標準ライブラリ名なので通常は省略できます。もし複数ライブラリを参照していて「あいまいな名前が検出されました」というエラーが出たら、Strings.Trimとフル修飾で書けば解決しますよ。

LTrim・RTrimとの動作の違い

同じ文字列をLTrim・RTrim・Trimに渡すと、削除される位置の違いがはっきり見えます。

Sub 3関数の違いを比較()

    Dim s As String
    s = "   VBA 入門   "

    Debug.Print "[" & LTrim(s) & "]"  '--- 結果: [VBA 入門   ](末尾残る) ---
    Debug.Print "[" & RTrim(s) & "]"  '--- 結果: [   VBA 入門](先頭残る) ---
    Debug.Print "[" & Trim(s) & "]"   '--- 結果: [VBA 入門](前後消える) ---

End Sub

Debug.Printの結果はイミディエイトウィンドウに表示されます。3つを並べると、LTrimは左、RTrimは右、Trimは両方を削っているのがよくわかりますね。どの関数も中間の半角スペース(VBA入門の間)は残したままです。

VBEの起動とコードの準備

ここまでのコードを試すには、VBE(Visual Basic Editor)を開いてコードを書く場所を用意します。すでにVBEに慣れている方は、このセクションは読み飛ばして構いません。

Excelを開いた状態で、キーボードの Alt + F11 を押すとVBEのウィンドウが表示されます。リボンから開く場合は「開発」タブ →「Visual Basic」をクリックしてください。「開発」タブが見当たらないときは、「ファイル」→「オプション」→「リボンのユーザー設定」で「開発」にチェックを入れると表示されます。

VBEが開いたら、コードを書く場所(標準モジュール)を追加します。

  1. メニューバーの「挿入」→「標準モジュール」をクリック
  2. 左側のプロジェクトエクスプローラーに「Module1」が追加される
  3. 右側のコードウィンドウにコードを書く

VBEの画面構成をもっと詳しく知りたい方は、VBEの画面の見方と基本操作も参考にしてみてください。なお、マクロを含むファイルは必ず マクロ有効ブック(.xlsm) 形式で保存してくださいね。通常の.xlsx形式で保存するとコードが失われてしまいます。

Trimで空白が消えないときの原因と対処法

「Trimをかけたのに空白が残っている」——これはVBAの空白処理でいちばん多いつまずきです。原因のほとんどは、Trim系では消せない種類の空白 が混じっていることにあります。

全角スペースはTrimでは消えない

最初に、いちばん大事なファクトをはっきりさせておきます。

VBAのTrim・LTrim・RTrimが削除できるのは、半角スペース(Chr(32))だけです。全角スペース(ChrW(12288))は削除されません。

一部のサイトや解説では「VBA Trimで全角スペースも消える」と書かれていることがありますが、これは誤りです。実際に試すと、全角スペースはそのまま残ります。

Sub 全角スペースは消えないことを確認()

    Dim s As String
    s = " 東京都 "  '--- 前後は全角スペース ---

    Debug.Print "[" & Trim(s) & "]"
    '--- 結果: [ 東京都 ](全角スペースは残ったまま) ---

End Sub

日本語入力の切り替え忘れで先頭に全角スペースが入る、というのは事務作業で本当によく起こります。「Trimしたのに消えない」と感じたら、まずは全角スペースを疑ってください。対処法は後述しますが、Replace関数で個別に消すのが基本です。

タブ・改行・NBSPもTrimの対象外

全角スペース以外にも、Trim系で消えない「空白に見える文字」があります。次の表で整理しておきましょう。

文字文字コードTrim系で消える?主な混入経路
半角スペースChr(32)前後のみ消えるCSV末尾・手入力
全角スペースChrW(12288)消えない日本語入力の切替忘れ
タブChr(9)消えないTSVインポート
改行(LF / CR)Chr(10) / Chr(13)消えないセル内改行・他システム連携
NBSPChr(160)消えないWebページからのコピペ

特に厄介なのが NBSP(ノーブレークスペース) です。Webページからコピーしたデータに紛れ込みやすく、見た目はただの半角スペースなのにTrimでは消えません。VLOOKUPが完全一致のはずなのに #N/A を返す、という原因不明のトラブルの正体がこれだったりします。NBSPの詳しい対策はノーブレークスペース完全対策ガイドで解説しています。

「Trimしても消えない空白」の正体を突き止めたいときは、AscW関数で文字コードを調べるのが確実です。

Sub 消えない空白の正体を調べる()

    Dim s As String, i As Long
    s = Range("A1").Value  '--- 調べたいセル ---

    For i = 1 To Len(s)
        Debug.Print "位置" & i & ": [" & Mid(s, i, 1) & _
                    "] → AscW=" & AscW(Mid(s, i, 1))
    Next i

End Sub

AscWの結果が 32なら半角スペース、160ならNBSP、12288なら全角スペース です。正体さえわかれば、対応するReplace文を書くだけで解決できます。

どの空白をどう消す?判断フローチャート

空白の種類が整理できたら、あとは「どの関数を使うか」を判断するだけです。次のフローで考えると迷いません。

  1. 半角スペースが前後だけ? → そのまま Trim(LTrim / RTrim) でOK。
  2. 半角スペースが文字列の途中で連続している?WorksheetFunction.Trim で1つに圧縮(次のセクションで解説)。
  3. 全角スペースが混ざっている?Replace(s, ChrW(12288), "") で削除。半角に統一したいならStrConv(s, vbNarrow)で全角→半角変換してからTrim。
  4. NBSP・タブ・改行が混ざっている?Replace でそれぞれの文字コードを指定して削除。

つまり、「半角スペースの前後」だけがTrim系の守備範囲 で、それ以外はすべてReplaceや別の関数の出番、と覚えておけば判断に迷いません。具体的なReplaceの使い方はVBA Replace関数の使い方で詳しく解説しています。

WorksheetFunction.TrimとVBA Trimの違い

VBAには、これまで紹介したTrimのほかに WorksheetFunction.Trim という書き方もあります。名前がそっくりなので混同しがちですが、動作はまったくの別物 です。ここを押さえておくと「Trimしたのに中間の空白が残る」トラブルを避けられます。

中間の連続スペースの扱いが違う

2つの最大の違いは、文字列の途中にある連続スペースの扱い です。

比較項目VBA TrimWorksheetFunction.Trim
前後の半角スペース削除する削除する
中間の連続スペースそのまま残す1つに圧縮する
全角スペース削除しない削除しない
NBSP(Chr(160))削除しない削除しない

VBA Trimは前後しか触りませんが、WorksheetFunction.Trim(=ワークシート関数のTRIMと同じ動作)は前後に加えて中間の連続スペースを1つにまとめます。実際に比べてみましょう。

Sub 中間スペースの扱いを比較()

    Dim s As String
    s = "田中  太郎  "  '--- 中間に半角スペース2つ ---

    Debug.Print "[" & Trim(s) & "]"
    '--- VBA Trim → [田中  太郎](中間は2つのまま残る) ---

    Debug.Print "[" & Application.WorksheetFunction.Trim(s) & "]"
    '--- ワークシート版 → [田中 太郎](中間が1つに圧縮される) ---

End Sub

「氏名の途中に余分なスペースが入ってしまったデータを、見栄えよく整えたい」——そんなときはWorksheetFunction.Trimの出番です。逆に「前後だけ確実に消したい」場面ではVBA Trimで十分。中間まで勝手に圧縮されないぶん、データを意図せず変えてしまう心配がありません。

なお、どちらも 全角スペースは消せない 点は共通です。ワークシート関数版だからといって全角に対応するわけではないので注意してください。

VBAからワークシート版Trimを呼ぶ方法

VBAのコード内からワークシート版のTrimを使いたいときは、次のように書きます。

Application.WorksheetFunction.Trim(対象文字列)

Application.は省略してWorksheetFunction.Trim(s)と書いても動きます。VBA Trimとの使い分けは、

  • 前後だけ消せば十分Trim(s)(VBA版)
  • 中間の連続スペースも1つにまとめたいWorksheetFunction.Trim(s)(ワークシート版)

と覚えておくと迷いません。ワークシート上の数式としてのTRIM関数について詳しくは、ExcelのTRIM関数の使い方で解説しています。

実務で使えるTrim・LTrim・RTrimの活用コード

ここからは、3関数の使い分けを実感できる実務コードを3つ紹介します。いずれもVarType判定で文字列セルだけを処理しているので、数値や日付のセルが混ざっていても安全に動きます。

コピペデータの先頭空白を一括削除(LTrim)

他システムや固定長データからコピーしたデータは、桁を揃えるために先頭にスペースが詰められていることがあります。「末尾の空白は意味があるので残したいが、先頭のパディングだけ消したい」——そんなときはLTrimの出番です。

Sub A列の先頭空白を一括削除()

    Dim ws As Worksheet '--- 対象シート ---
    Dim cell As Range   '--- ループ用セル ---

    Set ws = ActiveSheet

    '--- A列の各セルから先頭の半角スペースを削除 ---
    For Each cell In ws.Range("A1:A" & ws.Cells(ws.Rows.Count, 1).End(xlUp).Row)
        If VarType(cell.Value) = vbString Then
            cell.Value = LTrim(cell.Value)
        End If
    Next cell

    MsgBox "A列の先頭空白を削除しました。", vbInformation

End Sub

ここでTrimではなくLTrimを選ぶのがポイントです。前後まとめて消したいならTrimですが、「先頭だけ」という明確な意図があるならLTrimのほうがコードの意図が伝わります。For Eachの基本はLTrim関数の使い方でも触れています。

氏名フィールドの全角スペースを正しく除去する

事務作業で頻発するのが、氏名の前後に全角スペースが入ってしまうケースです。前述のとおりTrimでは全角スペースを消せないので、Replaceで全角スペースを消してからTrimで半角スペースを仕上げる、という二段構えが定番になります。

Sub 氏名の全角スペースを正しく除去()

    Dim ws As Worksheet '--- 対象シート ---
    Dim cell As Range   '--- ループ用セル ---
    Dim sVal As String  '--- セルの値 ---

    Set ws = ActiveSheet

    For Each cell In ws.UsedRange
        If VarType(cell.Value) = vbString Then
            sVal = cell.Value

            '--- Step1: 全角スペースを削除(Trimでは消せない) ---
            sVal = Replace(sVal, ChrW(12288), "")

            '--- Step2: 残った前後の半角スペースを削除 ---
            sVal = Trim(sVal)

            cell.Value = sVal
        End If
    Next cell

    MsgBox "氏名フィールドの空白を除去しました。", vbInformation

End Sub

処理の順番が大切です。先にReplaceで全角スペースを消し、最後にTrimで半角スペースを仕上げます。「Trimだけで済ませようとして全角が残る」という典型的な失敗を、この二段構えで確実に防げます。

シート全体の前後空白をまとめてクレンジング(Trim)

「どの列に空白が混じっているか分からない」というときは、UsedRange全体を走査して前後空白をまとめて削除するのがいちばん手軽です。前後どちらも対象なのでTrimを使います。

Sub シート全体の前後空白をクレンジング()

    Dim ws As Worksheet '--- 対象シート ---
    Dim cell As Range   '--- ループ用セル ---
    Dim lCount As Long  '--- 処理件数カウンタ ---

    Set ws = ActiveSheet

    For Each cell In ws.UsedRange
        '--- 文字列セルかつ数式でないセルだけを処理 ---
        If VarType(cell.Value) = vbString And Not cell.HasFormula Then
            cell.Value = Trim(cell.Value)
            lCount = lCount + 1
        End If
    Next cell

    MsgBox lCount & " 件のセルから前後の空白を削除しました。", vbInformation

End Sub

ポイントはAnd Not cell.HasFormulaの一文です。VLOOKUPやTEXT関数など結果が文字列になる数式セルもVarTypeではvbStringを返すため、これを入れておかないと数式を計算結果の文字列で上書きしてしまう恐れがあります。計算式と手入力データが混在する業務ファイルでは、この一行が事故防止に効いてきますよ。空白処理の全体像はVBAで空白を削除する方法まとめで一覧できます。

まとめ|Trim・LTrim・RTrimの使い分け早見表

最後に、VBAの空白除去の使い分けを早見表でおさらいしましょう。

やりたいこと使う関数・方法
前後の半角スペースを消すTrim
先頭の半角スペースだけ消すLTrim
末尾の半角スペースだけ消すRTrim
中間の連続スペースを1つに圧縮WorksheetFunction.Trim
全角スペースを消すReplace(s, ChrW(12288), “”)
NBSP・タブ・改行を消すReplace で各文字コードを指定

押さえるべきポイントは次の3つです。

  • Trim・LTrim・RTrimの違いは「削除する位置」だけ。迷ったらTrimでOK。
  • 3関数が消せるのは半角スペースだけ。全角スペースやNBSPは消えないので、Replaceを併用する。
  • 中間の連続スペースを整えたいときはWorksheetFunction.Trim。VBA Trimは前後しか触らない。

空白の処理は地味ですが、VLOOKUPの照合ミスや集計ズレを防ぐ大切な前処理です。本記事の比較表とフローチャートを手元の地図にして、クリーンなデータを手に入れてくださいね。各関数の実践コードをもっと見たい方は、VBA Trim関数の使い方LTrim関数の使い方RTrim関数の使い方もあわせてどうぞ。

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