VLOOKUPの検索キーは合っているのに「一致するデータなし」になる――そんな経験はありませんか?原因の多くは、文字列の前後に紛れ込んだ見えない空白です。
手入力のばらつきやシステム出力のデータには、前後に半角・全角スペースが混じりやすいもの。見た目だけでは判断できないのが厄介ですよね。
VBAの Trim関数 を使えば、文字列の前後にある空白をまとめて一括削除できます。この記事では、VBA Trimの基本構文から業務で使える実践コードまで紹介します。
空白削除の全体像を先に把握したい方は、VBA空白削除まとめ|Trim・LTrim・RTrim・Replaceの使い分け方をご覧ください。
VBA Trim関数とは?前後の空白を削除する関数
VBAのTrim関数は、文字列の 先頭と末尾 にある空白を削除して返す関数です。
たとえば、こんなふうに変換されます。
| Before | After |
|---|---|
" Excel " | "Excel" |
" VBA 入門 " | "VBA 入門" |
"データ" | "データ"(変化なし) |
ポイントは、前後の空白だけが消える ということ。文字列の途中にある空白はそのまま残ります。
LTrim・RTrim・Trimの違い
VBAには空白を削除する関数が3つあります。違いをまとめると次のとおりです。
迷ったらTrimを選んでおけば間違いありません。前後どちらかだけ除去したい場面では、LTrimやRTrimを使い分けてみてください。
ワークシート関数TRIMとの違い
ExcelのワークシートTRIM関数(セルの数式で使うほう)と、VBAのTrim関数は名前が同じでも動きが異なります。
| 項目 | VBA Trim | ワークシートTRIM |
|---|---|---|
| 前後の空白削除 | する | する |
| 文字列内部の連続スペース | そのまま残る | 1つに圧縮 |
ワークシート版は内部の連続スペースも整理してくれます。VBAからワークシート版を呼びたい場合は、次のように書きます。
Application.WorksheetFunction.Trim(s)
通常の前後空白削除だけならVBA Trimで十分ですよ。「Trimしたのに内部のスペースが残っている」と感じたら、この違いを思い出してみてください。
ワークシート版の詳しい使い方は ExcelのTRIM関数の使い方 で解説しています。
削除できない空白に注意
Trimが削除できるのは、半角スペース(Chr(32))と全角スペース(ChrW(12288))です。
一方、以下の文字は空白のように見えても Trimでは削除されません。
- タブ文字(Chr(9))
- 改行(Chr(10) / Chr(13))
- ノーブレークスペース(NBSP)(Chr(160))
特にWebページからコピーしたデータには、NBSPが含まれていることがあります。Trimで消えない空白に出くわしたら、Replace 関数で個別に対処しましょう。
Replace(対象文字列, ChrW(160), "")
後述の実践コード3つ目で、Replace併用の一括処理コードを紹介しています。
VBEの起動とコードの書き方
VBAのコードを動かすには、まずVBE(Visual Basic Editor)を開いて、コードを書く場所を用意します。
VBE(Visual Basic Editor)の開き方
Excelを開いた状態で、キーボードの Alt + F11 を押してください。VBEのウィンドウが表示されます。
リボンから開く場合は、「開発」タブ →「Visual Basic」をクリックします。「開発」タブが見当たらないときは、「ファイル」→「オプション」→「リボンのユーザー設定」で「開発」にチェックを入れれば表示されますよ。
VBEの画面構成について詳しく知りたい方は、VBE画面の見方 も参考にしてみてください。
標準モジュールの挿入
VBEが開いたら、コードを書く場所(標準モジュール)を追加します。
- メニューバーの「挿入」→「標準モジュール」をクリック
- 左側のプロジェクトエクスプローラーに「Module1」が追加される
- 右側に表示されるコードウィンドウに、コードを書いていく
ここまで準備できたら、さっそくTrimを使ってみましょう。
VBA Trimの基本コード(コピペで動く)
Trimの構文はとてもシンプルです。
Strings.Trim(string)
引数に文字列を渡すと、前後の空白を取り除いた文字列が返ってきます。
まずは動作確認用のコードを試してみましょう。Module1のコードウィンドウに、以下をそのまま貼り付けてください。
Sub Trimの動作確認()
Dim sBefore As String '--- 変換前の文字列 ---
Dim sAfter As String '--- 変換後の文字列 ---
sBefore = " Excel VBA "
sAfter = Trim(sBefore)
'--- 結果をメッセージボックスで確認 ---
MsgBox "変換前: [" & sBefore & "]" & vbCrLf & _
"変換後: [" & sAfter & "]", vbInformation
End Sub
コードを貼り付けたら、F5キー を押して実行してみてください。メッセージボックスに変換前と変換後の文字列が表示されます。角括弧で囲んでいるので、前後のスペースが消えたことが一目でわかるはずです。
Trim関数の仕組みを深掘りする
基本コードが動いたところで、Trimのポイントをもう少し掘り下げておきましょう。
Strings.TrimとTrimの違い
先ほどの構文で Strings.Trim と書きましたが、サンプルコードでは Trim だけで動いていましたよね。
実はこの2つは同じ関数です。Strings はVBAの標準ライブラリ名で、通常は省略できます。ただし、複数のライブラリを参照設定している場合は注意が必要です。同じ名前の関数が存在すると名前の衝突が起きて、コンパイルエラーになることがあります。
普段は Trim だけで問題ありませんが、エラーが出た場合は Strings.Trim とフル修飾で書くと解決しますよ。
空白がない場合の挙動
前後に空白がない文字列をTrimに渡しても、エラーにはなりません。元の文字列がそのまま返ってきます。
Debug.Print Trim("Excel") '--- 結果: "Excel"(変化なし) ---
「空白があるかどうか事前にチェックしなきゃ」と心配する必要はないので、安心してまとめて処理できますよ。
なお、Nullを渡した場合はNullがそのまま返ります。空文字列を渡した場合は空文字列が返ります。どちらもエラーにはなりません。
対応する空白の種類
あらためて整理しておきます。
| 文字 | コード | Trimで削除 |
|---|---|---|
| 半角スペース | Chr(32) | される |
| 全角スペース | ChrW(12288) | される |
| タブ | Chr(9) | されない |
| 改行(LF) | Chr(10) | されない |
| 改行(CR) | Chr(13) | されない |
| NBSP | Chr(160) | されない |
削除されない空白を含むデータを扱う場合は、Replace 関数を併用するのがおすすめです。
VBA Trimの実践コード3選
ここからは、実際の業務で使えるコードを3つ紹介します。
シート全体の前後空白を一括削除する
実際の業務データでは、空白が混じる列は1つとは限りません。次のコードは、UsedRange全体を走査して、文字列が入っているセルの前後空白をまとめて削除します。
Sub シート全体の前後空白を一括削除()
Dim ws As Worksheet '--- 対象シート ---
Dim rng As Range '--- データ範囲 ---
Dim cell As Range '--- ループ用セル ---
Dim lCount As Long '--- 処理件数カウンタ ---
Set ws = ActiveSheet
Set rng = ws.UsedRange
'--- 各セルの前後空白を削除 ---
For Each cell In rng
If VarType(cell.Value) = vbString Then
cell.Value = Trim(cell.Value)
lCount = lCount + 1
End If
Next cell
MsgBox lCount & " 件のセルから前後の空白を削除しました。", vbInformation
End Sub
VarType(cell.Value) = vbString で文字列セルだけを対象にしているのがポイントです。数値や日付のセルをそのままTrimに渡すと型の不一致が起きる場合があるので、この判定を入れておくと安全ですよ。
LTrimやRTrimのA列限定コードとは違い、「どの列に空白があるか分からない」ときに便利です。
VLOOKUP前にデータを整形する
VLOOKUPの検索がうまくいかない原因の多くは、キー列の空白です。次のコードは、検索キーが入っているA列をTrimで整形してから、VLOOKUPを実行します。
Sub Trim整形してからVLOOKUP()
Dim ws As Worksheet '--- 対象シート ---
Dim lastRow As Long '--- 最終行 ---
Dim i As Long '--- ループカウンタ ---
Dim sKey As String '--- 検索キー ---
Dim vResult As Variant '--- 検索結果 ---
Set ws = ActiveSheet
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
'--- A列の前後空白を除去 ---
For i = 2 To lastRow
If VarType(ws.Cells(i, "A").Value) = vbString Then
ws.Cells(i, "A").Value = Trim(ws.Cells(i, "A").Value)
End If
Next i
'--- VLOOKUPでSheet2のマスタから値を取得 ---
For i = 2 To lastRow
sKey = ws.Cells(i, "A").Value
vResult = Application.VLookup( _
sKey, Sheets("Sheet2").Range("A:B"), 2, False)
If IsError(vResult) Then
ws.Cells(i, "B").Value = "該当なし"
Else
ws.Cells(i, "B").Value = vResult
End If
Next i
MsgBox "VLOOKUP完了", vbInformation
End Sub
先にTrimで整形するひと手間を入れるだけで、「データはあるのに一致しない」というトラブルを防げます。照合先のマスタ側にも空白がある場合は、マスタのA列にも同じTrim処理をかけてくださいね。
Trim + Replaceで見えない空白も一掃する
Trimだけでは取り切れないタブやNBSPもまとめて除去したい場面があります。次のコードは、Trimに加えてReplaceで非対応の空白文字も一掃します。
Sub 見えない空白もまとめて一掃()
Dim ws As Worksheet '--- 対象シート ---
Dim cell As Range '--- ループ用セル ---
Dim sVal As String '--- セルの値 ---
Dim lCount As Long '--- 処理件数カウンタ ---
Set ws = ActiveSheet
For Each cell In ws.UsedRange
If VarType(cell.Value) = vbString Then
sVal = cell.Value
'--- Step1: 前後の半角・全角スペースを削除 ---
sVal = Trim(sVal)
'--- Step2: タブ文字を削除 ---
sVal = Replace(sVal, Chr(9), "")
'--- Step3: NBSP(ノーブレークスペース)を削除 ---
sVal = Replace(sVal, Chr(160), "")
'--- Step4: 改行を削除(必要に応じて) ---
sVal = Replace(sVal, vbCr, "")
sVal = Replace(sVal, vbLf, "")
If cell.Value <> sVal Then
cell.Value = sVal
lCount = lCount + 1
End If
End If
Next cell
MsgBox lCount & " 件のセルから空白・制御文字を削除しました。", vbInformation
End Sub
Webページからコピーしたデータや、外部システムから出力したCSVには、タブやNBSPが混じっていることが多いです。このコードなら、Trimで消せない空白もまとめて対処できますよ。
空白の種類別の対処法をもっと詳しく知りたい方は、VBA空白削除まとめ|Trim・LTrim・RTrim・Replaceの使い分け方もあわせてどうぞ。
よくあるエラーと対処法
Trim自体はシンプルな関数ですが、周辺で引っかかりやすいポイントがあります。
型の不一致(実行時エラー 13)
数値が入っているセルの値を、String型の変数に直接代入しようとすると「型の不一致」エラーが発生することがあります。
'--- これはエラーになる場合がある ---
Dim s As String
s = Range("A1").Value '--- A1が数値だとエラー ---
対策は2つあります。CStr(値を文字列に変換する関数)で明示的に変換するか、VarType で文字列セルだけを処理対象にするかです。
あいまいな名前のコンパイルエラー
複数のライブラリを参照設定していると、Trim という名前が衝突してコンパイルエラーが出ることがあります。「あいまいな名前が検出されました」というメッセージが表示されたら、Strings.Trim とフル修飾で書けば解決しますよ。
マクロ無効・.xlsm保存の注意
VBAマクロを含むファイルは、必ず マクロ有効ブック(.xlsm) 形式で保存してください。通常の .xlsx 形式で保存すると、マクロのコードがすべて失われます。
ファイルを開いたときに「マクロが無効にされました」と表示されたら、「コンテンツの有効化」をクリックしてください。
まとめ
VBA Trim関数のポイントを振り返っておきましょう。
- Trimは前後の空白を両方削除する関数。文字列内部の空白はそのまま残る
- 半角・全角スペースは削除されるが、タブやNBSPは削除されない
- 空白がない文字列を渡してもエラーにならないので、安心してまとめて処理できる
- 業務では
UsedRangeを走査して、シート全体を一括クレンジングするのが定番 - タブやNBSPも消したいときは、TrimとReplace関数を組み合わせる
空白の処理は地味ですが、データの正確性に直結する大事な前処理です。Trimをうまく使って、クリーンなデータを手に入れましょう。
前後どちらかだけ除去したいときは、LTrim(先頭の空白削除)やRTrim(末尾の空白削除)も使い分けてみてください。空白処理の全体像は、VBA空白削除まとめで一覧できます。
