【VBA】RTrim関数の使い方|末尾の空白を一括削除する方法

スポンサーリンク

手入力やデータベースから取り込んだデータに、末尾の空白が紛れ込んでいた経験はありませんか?

見た目は同じなのに、文字列比較で「不一致」が返ってくる。原因を調べてみると、セルの末尾に半角スペースが入っていた――こんなトラブルは意外と多いものです。

数件なら手作業で直せますが、数百行・数千行のデータとなると目視チェックは現実的ではありませんよね。

そんなときに活躍するのが、VBAの RTrim関数 です。たった1行のコードで、末尾の空白をまとめてクレンジングできます。この記事では、VBA RTrimの基本的な使い方から業務で使える実践コードまで、順を追って解説していきます。

VBA RTrim関数とは?末尾の空白を削除する関数

RTrimは、文字列の 末尾(右側)にある空白だけを削除する VBA関数です。「Right Trim」の略で、右側をトリミングするイメージですね。

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

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

ポイントは、先頭の空白はそのまま残る ということです。末尾だけをピンポイントで処理したい場面で使いますよ。

LTrim・RTrim・Trimの違い

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

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

3つの使い分けをもっと詳しく知りたい方は、VBA 空白削除まとめで比較表つきで解説しています。

なお、VBAのTrimはワークシート関数の TRIM関数 とは動作が異なります。ワークシートのTRIMは文字列内部の連続スペースも1つに圧縮しますが、VBAのTrimは前後の空白を削除するだけです。内部の空白には手をつけません。

削除できない空白に注意

RTrimが削除できるのは、半角スペース(Chr(32))と全角スペース(ChrW(12288))です。

一方、以下の文字は空白のように見えても RTrimでは削除されません

特にWebページからコピーしたデータには、NBSP(Chr(160))が含まれていることがあります。NBSPを除去したい場合は、Replace 関数で個別に対処しましょう。

Replace(対象文字列, ChrW(160), "")

この点は LTrimTrim でも同じです。

VBEの起動とコードの書き方

VBAのコードを動かすには、まずVBE(Visual Basic Editor)を開いて、コードを書く場所を用意する必要があります。

VBE(Visual Basic Editor)の開き方

Excelを開いた状態で、キーボードの Alt + F11 を押してください。VBEのウィンドウが表示されます。

リボンから開く場合は、「開発」タブ →「Visual Basic」をクリックします。「開発」タブが見当たらないときは、リボンのカスタマイズから追加できますよ。「ファイル」→「オプション」→「リボンのユーザー設定」で「開発」にチェックを入れてください。

VBEの画面構成についてもっと知りたい方は、VBE画面の見方ガイドを参考にしてみてください。

標準モジュールの挿入

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

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

ここまで準備できたら、さっそくRTrimを使ってみましょう。

VBA RTrimの基本コード(コピペで動く)

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

Strings.RTrim(string)

引数に文字列を渡すと、末尾の空白を取り除いた文字列が返ってきます。

まずは動作確認用のコードを試してみましょう。Module1のコードウィンドウに、以下をそのまま貼り付けてください。

Sub RTrimの動作確認()

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

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

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

End Sub

コードを貼り付けたら、F5キー を押して実行してみてください。メッセージボックスに変換前と変換後の文字列が表示されます。角括弧で囲んでいるので、末尾のスペースが消えたことが一目でわかるはずです。

RTrim関数の仕組みを深掘りする

基本コードが動いたところで、VBA RTrimのポイントをもう少し掘り下げておきましょう。

Strings.RTrimとRTrimの違い

先ほどの構文で Strings.RTrim と書きましたが、サンプルコードでは RTrim だけで動いていましたよね。

実はこの2つは同じ関数です。Strings はVBAの標準ライブラリ名で、通常は省略して書けます。ただし、複数のライブラリを参照設定している場合は注意が必要です。同じ名前の関数が存在すると名前の衝突が起きて、コンパイルエラーになることがあります。

普段は RTrim だけで問題ありません。エラーが出た場合は Strings.RTrim とフル修飾で書くと解決しますよ。

空白がない場合の挙動

末尾に空白がない文字列をRTrimに渡しても、エラーにはなりません。元の文字列がそのまま返ってきます。

Debug.Print RTrim("Excel") '--- 結果: "Excel"(変化なし) ---

「空白があるかどうか事前にチェックしなきゃ」と心配する必要はないので、安心してまとめて処理できますよ。

なお、Nullを渡した場合はNullがそのまま返ります。こちらもエラーにはなりません。

対応する空白の種類

あらためて整理しておきます。

文字コードRTrimで削除
半角スペースChr(32)される
全角スペースChrW(12288)される
タブChr(9)されない
改行(LF)Chr(10)されない
改行(CR)Chr(13)されない
NBSPChr(160)されない

削除されない空白を含むデータを扱う場合は、Replace 関数を併用するのがおすすめです。具体的なコードはこのあとの実践コードで紹介します。

VBA RTrimの実践コード3選

ここからは、実際の業務で使えるコードを紹介します。

セルの末尾空白を一括クレンジングする

A列に入力されたデータの末尾空白を、まとめて除去するマクロです。データ整形の前処理に便利ですよ。

Sub A列の末尾空白を一括削除()

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

    Set ws = ThisWorkbook.Sheets(1)
    Set rng = ws.Range("A1:A" & ws.Cells(ws.Rows.Count, 1).End(xlUp).Row)

    '--- 各セルの末尾空白を削除 ---
    For Each cell In rng
        If VarType(cell.Value) = vbString Then
            cell.Value = RTrim(cell.Value)
            lCount = lCount + 1
        End If
    Next cell

    MsgBox lCount & "件のセルを処理しました。", vbInformation

End Sub

VarType(cell.Value) = vbString で文字列セルだけを対象にしています。数値や日付のセルをそのままRTrimに渡すと型の不一致が起きる場合があるので、この判定を入れておくのが安全です。

対象列を変えたい場合は、Range("A1:A"...) の「A」を任意の列に書き換えてください。For Eachの基本を押さえておくと、このパターンの応用が広がります。

固定長データの末尾空白を除去する

RTrimが特に活躍するのが、固定長データの処理です。COBOL系システムやデータベースのCHAR型フィールドでは、文字数が足りない部分を空白で埋める「パディング」が行われます。こうしたデータをExcelに取り込むと、各項目の末尾に大量のスペースが付いてきます。

以下は、固定長レコードを項目ごとに切り出して、末尾のパディングを除去するコードです。

Sub 固定長データの末尾空白を除去()

    Dim sRecord As String   '--- 固定長レコード1行分 ---
    Dim sName As String     '--- 氏名(20文字固定) ---
    Dim sDept As String     '--- 部署名(15文字固定) ---
    Dim sArea As String     '--- 地域(10文字固定) ---

    '--- サンプルデータ(実務ではファイル読み込み) ---
    sRecord = "田中太郎            営業部            東京都       "

    '--- 固定長で切り出し ---
    sName = Mid(sRecord, 1, 20)
    sDept = Mid(sRecord, 21, 15)
    sArea = Mid(sRecord, 36, 10)

    '--- 末尾のパディング空白を除去 ---
    sName = RTrim(sName)
    sDept = RTrim(sDept)
    sArea = RTrim(sArea)

    '--- 結果を確認 ---
    MsgBox "氏名: [" & sName & "]" & vbCrLf & _
           "部署: [" & sDept & "]" & vbCrLf & _
           "地域: [" & sArea & "]", vbInformation

End Sub

Mid(文字列の指定位置から指定文字数を切り出す関数)で固定長の位置を指定して切り出し、RTrim で末尾の空白を除去しています。先頭には空白が入らないデータなので、LTrimTrim ではなくRTrimだけで十分です。

このパターンは、基幹システムからのデータ移行や帳票出力のときに重宝しますよ。

RTrim + Replaceで見えない空白も一掃する

RTrimだけでは取り切れないタブやNBSPも末尾からまとめて除去したい場面があります。次のコードは、RTrimに加えて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

            '--- 末尾のタブ・改行を除去 ---
            Do While Right(sVal, 1) = vbTab Or _
                     Right(sVal, 1) = vbLf Or _
                     Right(sVal, 1) = vbCr
                sVal = Left(sVal, Len(sVal) - 1)
            Loop

            '--- NBSPを除去 ---
            sVal = Replace(sVal, ChrW(160), "")

            '--- 通常の末尾空白を除去 ---
            sVal = RTrim(sVal)

            If cell.Value <> sVal Then
                cell.Value = sVal
                lCount = lCount + 1
            End If
        End If
    Next cell

    MsgBox lCount & "件のセルを修正しました。", vbInformation

End Sub

処理の流れは3ステップです。まず Do While ループ(Do Loopの基本)で末尾のタブ・改行を1文字ずつ削り取ります。次に Replace でNBSPを除去。最後に RTrim で通常の半角・全角スペースを仕上げます。

Webページからコピーしたデータや、複数システムを経由したデータにはいろいろな空白文字が混在しがちです。このコードを使えば、まとめてクリーニングできますよ。

よくあるエラーと対処法

RTrim自体はシンプルな関数ですが、周辺で引っかかりやすいポイントがあります。

型の不一致(実行時エラー 13)

数値が入っているセルの値を、String型の変数に直接代入しようとすると「型の不一致」エラーが発生することがあります。

'--- これはエラーになる場合がある ---
Dim s As String
s = Range("A1").Value  '--- A1が数値だとエラー ---

対策は2つあります。CStr(値を文字列に変換する関数)で明示的に文字列に変換するか、VarType で文字列セルだけを処理対象にするかです。実践コードでは VarType による判定を入れているので、そのまま使えば安心です。

コンパイルエラー(あいまいな名前が検出されました)

複数のライブラリを参照設定していると、RTrim という名前が衝突してコンパイルエラーが出ることがあります。この場合は Strings.RTrim とフル修飾で書けば解決します。

VBEの参照設定はローカルウィンドウの活用ガイドでも触れていますので、参考にしてみてください。

マクロ無効・.xlsm保存の注意

VBAマクロを含むファイルは、必ず マクロ有効ブック(.xlsm) 形式で保存してください。通常の .xlsx 形式で保存すると、マクロのコードがすべて失われます。

ファイルを開いたときに「マクロが無効にされました」と表示されたら、「コンテンツの有効化」をクリックしてください。これでマクロが有効になりますよ。

まとめ

VBA RTrim関数のポイントを振り返っておきましょう。

  • RTrimは末尾の空白だけを削除する関数。先頭は残る
  • 半角・全角スペースは削除されるが、タブやNBSPは削除されない
  • 空白がない文字列を渡してもエラーにならないので、安心してまとめて処理できる
  • 固定長データの末尾パディング除去に特に活躍する
  • タブやNBSPも除去したい場合は、Replace関数と組み合わせる

空白の処理は地味ですが、データの正確性に直結する大事な前処理です。RTrimをうまく使って、クリーンなデータを手に入れましょう。

用途に応じて、LTrim(先頭の空白削除)Trim(前後の空白削除)も使い分けてみてください。空白処理をもっと詳しく知りたい方は、VBA 文字列の空白を削除する方法まとめもあわせてどうぞ。

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