手入力やデータベースから取り込んだデータに、末尾の空白が紛れ込んでいた経験はありませんか?
見た目は同じなのに、文字列比較で「不一致」が返ってくる。原因を調べてみると、セルの末尾に半角スペースが入っていた――こんなトラブルは意外と多いものです。
数件なら手作業で直せますが、数百行・数千行のデータとなると目視チェックは現実的ではありませんよね。
そんなときに活躍するのが、VBAの RTrim関数 です。たった1行のコードで、末尾の空白をまとめてクレンジングできます。この記事では、VBA RTrimの基本的な使い方から業務で使える実践コードまで、順を追って解説していきます。
VBA RTrim関数とは?末尾の空白を削除する関数
RTrimは、文字列の 末尾(右側)にある空白だけを削除する VBA関数です。「Right Trim」の略で、右側をトリミングするイメージですね。
たとえば、こんなふうに変換されます。
| Before | After |
|---|---|
"Excel " | "Excel" |
" VBA 入門 " | " VBA 入門" |
"データ" | "データ"(変化なし) |
ポイントは、先頭の空白はそのまま残る ということです。末尾だけをピンポイントで処理したい場面で使いますよ。
LTrim・RTrim・Trimの違い
VBAには空白を削除する関数が3つあります。違いをまとめると次のとおりです。
3つの使い分けをもっと詳しく知りたい方は、VBA 空白削除まとめで比較表つきで解説しています。
なお、VBAのTrimはワークシート関数の TRIM関数 とは動作が異なります。ワークシートのTRIMは文字列内部の連続スペースも1つに圧縮しますが、VBAのTrimは前後の空白を削除するだけです。内部の空白には手をつけません。
削除できない空白に注意
RTrimが削除できるのは、半角スペース(Chr(32))と全角スペース(ChrW(12288))です。
一方、以下の文字は空白のように見えても RTrimでは削除されません。
- タブ文字(Chr(9))
- 改行(Chr(10) / Chr(13))
- ノーブレークスペース(NBSP)
特にWebページからコピーしたデータには、NBSP(Chr(160))が含まれていることがあります。NBSPを除去したい場合は、Replace 関数で個別に対処しましょう。
Replace(対象文字列, ChrW(160), "")
VBEの起動とコードの書き方
VBAのコードを動かすには、まずVBE(Visual Basic Editor)を開いて、コードを書く場所を用意する必要があります。
VBE(Visual Basic Editor)の開き方
Excelを開いた状態で、キーボードの Alt + F11 を押してください。VBEのウィンドウが表示されます。
リボンから開く場合は、「開発」タブ →「Visual Basic」をクリックします。「開発」タブが見当たらないときは、リボンのカスタマイズから追加できますよ。「ファイル」→「オプション」→「リボンのユーザー設定」で「開発」にチェックを入れてください。
VBEの画面構成についてもっと知りたい方は、VBE画面の見方ガイドを参考にしてみてください。
標準モジュールの挿入
VBEが開いたら、コードを書く場所(標準モジュール)を追加します。
- メニューバーの「挿入」→「標準モジュール」をクリック
- 左側のプロジェクトエクスプローラーに「Module1」が追加される
- 右側に表示されるコードウィンドウに、コードを書いていく
ここまで準備できたら、さっそく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) | されない |
| NBSP | Chr(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 で末尾の空白を除去しています。先頭には空白が入らないデータなので、LTrim や Trim ではなく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 文字列の空白を削除する方法まとめもあわせてどうぞ。
