【VBA】Trim関数の使い方|前後の空白を一括削除する方法

スポンサーリンク

VLOOKUPの検索キーは合っているのに「一致するデータなし」になる――そんな経験はありませんか?原因の多くは、文字列の前後に紛れ込んだ見えない空白です。

手入力のばらつきやシステム出力のデータには、前後に半角・全角スペースが混じりやすいもの。見た目だけでは判断できないのが厄介ですよね。

VBAの Trim関数 を使えば、文字列の前後にある空白をまとめて一括削除できます。この記事では、VBA Trimの基本構文から業務で使える実践コードまで紹介します。

空白削除の全体像を先に把握したい方は、VBA空白削除まとめ|Trim・LTrim・RTrim・Replaceの使い分け方をご覧ください。

VBA Trim関数とは?前後の空白を削除する関数

VBAのTrim関数は、文字列の 先頭と末尾 にある空白を削除して返す関数です。

たとえば、こんなふうに変換されます。

BeforeAfter
" Excel ""Excel"
" VBA 入門 ""VBA 入門"
"データ""データ"(変化なし)

ポイントは、前後の空白だけが消える ということ。文字列の途中にある空白はそのまま残ります。

LTrim・RTrim・Trimの違い

VBAには空白を削除する関数が3つあります。違いをまとめると次のとおりです。

関数削除する位置用途
LTrim先頭のみ先頭空白だけ除去したいとき
RTrim末尾のみ末尾空白だけ除去したいとき
Trim前後両方前後どちらの空白も不要なとき

迷ったら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では削除されません

特に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が開いたら、コードを書く場所(標準モジュール)を追加します。

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

ここまで準備できたら、さっそく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)されない
NBSPChr(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に渡すと型の不一致が起きる場合があるので、この判定を入れておくと安全ですよ。

LTrimRTrimの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空白削除まとめで一覧できます。

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