VBAで空白を削除する方法|Trim・Replace・全角スペースの対処法まとめ

スポンサーリンク

ExcelのVBAでセルの空白を削除しようとしたのに、Trimをかけても消えない空白が残っていた。そんな経験はありませんか?

空白が残ったままだと、VLOOKUPで#N/Aエラーが出たり、集計結果がずれたりします。放置するほど手戻りが増えて厄介です。

VBAには空白を削除する関数が4つあります。空白の位置と種類に応じて使い分ければ、どんな空白トラブルも解決できますよ。

この記事では、Trim・LTrim・RTrim・Replaceの使い方と使い分けを、コピペで動くコード付きで解説します。

NOTE

この記事のコードを実行するには、VBE(Visual Basic Editor)を開いて標準モジュールにコードを貼り付けます。Alt + F11 でVBEを起動し、挿入標準モジュール で編集画面を表示してください。VBEの詳しい使い方は VBEの画面の見方と基本操作 で解説しています。

VBAで空白を削除する4つの方法を整理しよう

Excel VBAで空白を削除する方法は、大きく4つあります。まずは全体像を把握しておきましょう。

関数削除対象特徴
Trim前後の半角スペースもっとも基本的な空白除去
LTrim先頭の半角スペース左側だけ削除したいときに
RTrim末尾の半角スペース右側だけ削除したいときに
Replace指定した文字すべて全角スペースやNBSPにも対応

ポイントは、Trim系の3関数は半角スペース(Chr(32))しか消せないということです。「VBA Trimで全角スペースも消せる」という情報を見かけますが、これは誤りなので注意してください。

全角スペースや特殊な空白を消すには、Replace関数の出番になります。

Trim関数 ── 前後の半角スペースをまとめて削除

Trim関数は、文字列の先頭と末尾にある半角スペースをまとめて削除します。

Sub TrimExample()
    Dim s As String
    s = "  Hello World  "
    Debug.Print "[" & Trim(s) & "]"
    ' 結果: [Hello World]
    ' ※ 文字列中間のスペースはそのまま残る
End Sub

前後だけ削除したいなら、Trimが一番シンプルです。詳しい使い方は Trimで前後の空白を一括削除する方法 で解説しています。

LTrim関数 ── 先頭の半角スペースだけ削除

LTrimは、文字列の先頭(左側)にある半角スペースだけを削除します。

Sub LTrimExample()
    Dim s As String
    s = "   Hello World   "
    Debug.Print "[" & LTrim(s) & "]"
    ' 結果: [Hello World   ]
    ' ※ 末尾のスペースは残る
End Sub

基幹システムから出力された固定長データなど、先頭のパディングだけ消したい場面で役立ちますよ。詳しくは LTrimで先頭の空白を一括削除する方法 をご覧ください。

RTrim関数 ── 末尾の半角スペースだけ削除

RTrimは、文字列の末尾(右側)にある半角スペースだけを削除します。

Sub RTrimExample()
    Dim s As String
    s = "   Hello World   "
    Debug.Print "[" & RTrim(s) & "]"
    ' 結果: [   Hello World]
    ' ※ 先頭のスペースは残る
End Sub

CSVインポート時に末尾へ付く余分なスペースを消すときに便利です。詳しくは RTrimで末尾の空白を一括削除する方法 を参考にしてください。

Replace関数 ── 指定した文字をすべて削除

Replace関数は、文字列の中から指定した文字をすべて置換(削除)できます。

Sub ReplaceExample()
    Dim s As String
    s = "Hello World"
    Debug.Print "[" & Replace(s, " ", "") & "]"
    ' 結果: [HelloWorld]
    ' ※ 文字列中のすべての半角スペースが消える
End Sub

Trim系では対応できない全角スペースノーブレークスペース(NBSP)も、Replace関数なら削除できます。

ただしReplace関数には注意点があります。第4引数(start)を指定すると、その位置より前の文字が戻り値から切り捨てられます

Sub ReplaceStartTrap()
    Debug.Print Replace("ABCABC", "A", "X", 3)
    ' 結果: CXBC
    ' ※ 3文字目以降が処理対象になり、1〜2文字目の"AB"が消える
End Sub

start引数を使う場面は少ないですが、知らないとハマるポイントです。基本的には省略して使いましょう。

VBA TrimとワークシートTRIM関数の違い

VBAのTrimと、ワークシート関数のTRIMは名前が同じですが動作が違います。ここを混同すると「消えるはずの空白が消えない」トラブルの原因になります。

比較項目VBA TrimワークシートTRIM
前後の半角スペース削除する削除する
連続する中間スペースそのまま残す1つに詰める
全角スペース削除しない削除しない
NBSP (Chr(160))削除しない削除しない

最大の違いは中間スペースの扱いです。ワークシートTRIMは連続する半角スペースを1つにまとめますが、VBA Trimは中間のスペースに一切触れません。

VBAからワークシートTRIMを使いたい場合は、次のように書きます。

Sub WorksheetTrimExample()
    Dim s As String
    s = "Hello    World"

    ' VBA Trim → 中間スペースはそのまま
    Debug.Print "[" & Trim(s) & "]"
    ' 結果: [Hello    World]

    ' ワークシートTRIM → 中間スペースを1つに
    Debug.Print "[" & WorksheetFunction.Trim(s) & "]"
    ' 結果: [Hello World]
End Sub

中間の余分なスペースもまとめて処理したいときは、WorksheetFunction.Trim を使ってみてください。ワークシートのTRIM関数について詳しくは TRIM関数の使い方 で解説しています。

空白トラブル3パターン別の使い分けガイド

「どの関数を使えばいいの?」と迷ったら、空白の種類で判断しましょう。業務でよく遭遇する3パターンに分けて解説します。

パターン1: 前後の半角スペースが邪魔 → Trim

CSVインポートや基幹システム出力で混入しやすいパターンです。前後の半角スペースだけが問題なら、Trimで十分対応できます。

Sub Pattern1_Trim()
    Dim s As String
    s = "  東京都  "
    Debug.Print "[" & Trim(s) & "]"
    ' 結果: [東京都]
End Sub

固定長フィールドのパディング除去にも、このパターンが当てはまります。まずはTrimを試してみてください。

パターン2: 全角スペースが混ざっている → Replace

日本語入力の切り替え忘れで混入しやすいのが全角スペースです。Trim系では全角スペースを削除できないため、Replaceを使います。

Sub Pattern2_ZenkakuSpace()
    Dim s As String
    s = "東京都 港区"

    ' Trimでは消えない
    Debug.Print "[" & Trim(s) & "]"
    ' 結果: [東京都 港区]

    ' Replaceで全角スペースを削除
    Debug.Print "[" & Replace(s, " ", "") & "]"
    ' 結果: [東京都港区]
End Sub

全角スペースはChr(12288)でも指定できます。日本語データを扱うなら、覚えておくと便利ですよ。

パターン3: 見えない特殊空白(NBSPなど) → Replace + Chr

Webページからのコピペで混入するのが、ノーブレークスペース(NBSP、Chr(160))です。見た目はただの空白ですが、Trimでは消せません。

Sub Pattern3_NBSP()
    Dim s As String
    s = "東京都" & Chr(160) & "港区"

    ' Trimでは消えない
    Debug.Print "[" & Trim(s) & "]"
    ' 結果: [東京都 港区]

    ' Replace + Chr(160)で削除
    Debug.Print "[" & Replace(s, Chr(160), "") & "]"
    ' 結果: [東京都港区]
End Sub

NBSPが混入すると、VLOOKUPで完全一致のはずなのに#N/Aエラーが出る原因になります。目に見えないだけに原因特定が難しいトラブルです。NBSPの詳しい対策は ノーブレークスペース完全対策ガイド で解説しています。

実践コード|セル範囲の空白をまとめて一括削除する

ここからは、実際の業務で使える実践コードを紹介します。セル範囲に対して一括で空白を削除できるマクロです。

指定範囲の前後スペースを一括Trim

選択したセル範囲の前後半角スペースをまとめて削除するマクロです。

Sub TrimSelectedRange()
    Dim rng As Range
    Dim cell As Range

    Set rng = Selection

    For Each cell In rng
        If cell.Value <> "" Then
            cell.Value = Trim(cell.Value)
        End If
    Next cell

    MsgBox rng.Count & "セルのTrim処理が完了しました"
End Sub

セル範囲を選択してからマクロを実行するだけでOKです。For Each文 を応用した書き方になっています。

全角・NBSP対応の汎用クレンジングマクロ

半角スペース・全角スペース・NBSPをまとめて除去する汎用版です。

Sub CleanseSpaces()
    Dim rng As Range
    Dim cell As Range
    Dim tmp As String

    Set rng = Selection

    For Each cell In rng
        If cell.Value <> "" Then
            tmp = cell.Value
            tmp = Replace(tmp, Chr(12288), "")
            tmp = Replace(tmp, Chr(160), "")
            tmp = Trim(tmp)
            cell.Value = tmp
        End If
    Next cell

    MsgBox rng.Count & "セルのクレンジングが完了しました"
End Sub

処理の順番がポイントです。先にReplaceで全角・NBSPを消してから、最後にTrimで前後の半角スペースを仕上げます。

NOTE

マクロを保存するときは、ファイル形式をExcelマクロ有効ブック(.xlsm)にしてください。通常の.xlsx形式で保存すると、マクロが消えてしまいます。

空白の種類と対処法の早見表

業務データに混入しやすい空白を一覧にまとめました。

空白の種類文字コード主な混入経路Trimで消える?Replace削除方法
半角スペースChr(32)CSV末尾、手入力前後のみ消えるReplace(s, " ", "")
全角スペースChr(12288)日本語入力切替忘れ消えないReplace(s, Chr(12288), "")
NBSPChr(160)Webコピペ消えないReplace(s, Chr(160), "")
タブChr(9)TSVインポート消えないReplace(s, Chr(9), "")
改行(LF)Chr(10)セル内改行消えないReplace(s, Chr(10), "")
改行(CR+LF)Chr(13)+Chr(10)他システム連携消えないReplace(s, vbCrLf, "")

困ったときはこの表を見ながら、該当するReplace文をコードに追加してみてください。

よくあるエラーと対処法

空白削除の処理でつまずきやすいポイントをまとめました。

症状原因対処法
Trimしても空白が消えない全角スペースやNBSPが混在Replace + Chr で個別削除
Replace実行でエラーNull値のセルを処理If Not IsNull(cell.Value) で事前チェック
Replaceで文字が欠けるstart引数を指定したstart引数を省略する
VLOOKUPが#N/Aになる見えない空白が不一致の原因Trim + Replaceでクレンジング後にVLOOKUP
ワークシートTrimと結果が違う中間スペースの扱いが異なるWorksheetFunction.Trim を使う

特に注意したいのが、TrimとReplaceのNull耐性の違いです。

Sub NullHandling()
    Dim v As Variant
    v = Null

    Debug.Print IsNull(Trim(v))
    ' 結果: True(Nullが返る=エラーにならない)

    ' Replace(v, " ", "")  ← エラーになる
End Sub

セル範囲を一括処理するときは、If Not IsNull(cell.Value) のチェックを入れておくと安全ですよ。

Trimしても空白が消えない場合の特定方法

「Trimしたのに空白が残っている」ときは、AscW関数で文字のUnicodeコードポイントを調べましょう。

Sub InspectCharCodes()
    Dim s As String
    Dim 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なら全角スペースです。

NOTE

Asc関数はANSIコードを返しますが、AscW関数はUnicodeコードポイントを返します。日本語環境ではAscWを使うのがおすすめです。

文字コードがわかれば、対応するReplace文を書くだけで解決できます。

まとめ

VBAで空白を削除する4つの関数の使い分けをおさらいしましょう。

  • Trim ── 前後の半角スペースを削除。基本はこれでOK
  • LTrim / RTrim ── 先頭・末尾だけ削除したいときに
  • Replace ── 全角スペース・NBSP・タブなど、Trimで消せない空白に対応

データのクレンジングでは、Trim単体ではなくReplaceと組み合わせるのが鉄板パターンです。汎用クレンジングマクロをコピペして、日常業務に役立ててみてください。

関連記事

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