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), "") |
| NBSP | Chr(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と組み合わせるのが鉄板パターンです。汎用クレンジングマクロをコピペして、日常業務に役立ててみてください。
