VBA の Trim 関数を使ったのに、文字列の途中にある余分なスペースが消えなくて困ったことはありませんか。実は、VBA の標準 Trim 関数は先頭と末尾のスペースしか削除しません。単語の間にある連続スペースを1つにまとめたいときは、WorksheetFunction.Trim を使います。
この記事では、WorksheetFunction.Trim の使い方を、VBA 標準の Trim・LTrim・RTrim との違いとあわせて解説します。4つの空白処理の挙動は、入力と出力の比較表で整理します。CSV やシステム出力のデータクリーニングに使える実務コードも紹介します。最後に、Trim 系をどれだけ使っても消えないノーブレークスペース(Chr(160))の落とし穴と対処法も取り上げます。
VBA の WorksheetFunction.Trim とは?
WorksheetFunction.Trim は、ワークシート関数の TRIM を VBA から呼び出すメソッドです。文字列の先頭と末尾のスペースを削除します。さらに、単語の間にある連続したスペースも1つだけ残して圧縮します。
VBA には標準の Trim 関数もあります。ただし標準の Trim 関数は、中間の連続スペースには手を付けません。「単語間のスペースを1つに詰める」処理は、VBA 標準関数にはない機能です。
そこで WorksheetFunction オブジェクトを経由して、ワークシート関数の TRIM を借りてくるわけです。具体的な挙動を見てみましょう。
result = WorksheetFunction.Trim("A B C")
'--- 結果は "A B C"(単語間スペースが1つに圧縮される)---
入力 "A B C" の単語間には、それぞれ3つのスペースがあります。WorksheetFunction.Trim を通すと、すべて1つにまとめられて "A B C" になります。
NOTE: ワークシート関数を VBA から呼ぶ仕組み全般については、VBAでWorksheetFunctionを使う方法で詳しく解説しています。
WorksheetFunction.Trim の使い方
まずは基本の構文と、実際に動かすための準備を確認します。
WorksheetFunction.Trim(Arg1)
引数は次のとおりです。
| 引数 | 必須/省略 | データ型 | 説明 |
|---|---|---|---|
| Arg1 | 必須 | String | 余分なスペースを削除したい文字列 |
戻り値は String 型です。Application.WorksheetFunction.Trim(Arg1) と書いても同じ動作になります。Application. は省略できます。
VBE の起動と標準モジュールの準備
コードを書くには、まず VBE(Visual Basic Editor)を開きます。Excel で Alt + F11 キーを押すと VBE が起動します。
リボンから開くこともできます。「開発」タブの「Visual Basic」ボタンをクリックする方法です。「開発」タブが表示されていない場合は、次の手順で追加します。
- 「ファイル」→「オプション」を開きます。
- 「リボンのユーザー設定」を選びます。
- 右側の一覧で「開発」にチェックを入れます。
VBE が開いたら、メニューの「挿入」→「標準モジュール」をクリックします。表示されたコード入力欄に、これから紹介するコードを貼り付けてください。
基本コード
実際に WorksheetFunction.Trim を動かす基本コードです。変換前と変換後をメッセージボックスで見比べられるようにしています。
Sub WorksheetFunctionTrimSample()
Dim sBefore As String '変換前の文字列
Dim sAfter As String '変換後の文字列
'--- 変換前の文字列を用意 ---
sBefore = " Excel VBA 入門 "
'--- 連続スペースを1つに圧縮し、先頭末尾も削除 ---
sAfter = WorksheetFunction.Trim(sBefore)
'--- 変換前後を確認 ---
MsgBox "変換前:[" & sBefore & "]" & vbCrLf & _
"変換後:[" & sAfter & "]"
End Sub
このコードを実行すると、変換後は [Excel VBA 入門] と表示されます。先頭と末尾のスペースが消え、単語間の連続スペースも1つに詰まりました。[ ] で囲んでいるのは、両端のスペースが消えたことを目で確認しやすくするためです。
VBA Trim・LTrim・RTrim との違い|4関数の比較表
ここがこの記事の核心です。VBA には空白を扱う関数が複数あります。それぞれ削除する範囲が異なります。
| 関数 | 先頭のスペース | 末尾のスペース | 中間の連続スペース |
|---|---|---|---|
Trim | 削除する | 削除する | 残す |
LTrim | 削除する | 残す | 残す |
RTrim | 残す | 削除する | 残す |
WorksheetFunction.Trim | 削除する | 削除する | 1つに圧縮する |
同じ文字列に4つの関数を通すと、結果は次のように変わります。入力は " A B " とします。先頭に2つ、中間に3つ、末尾に2つのスペースがある文字列です。
| 関数 | 出力結果 |
|---|---|
Trim(" A B ") | "A B" |
LTrim(" A B ") | "A B " |
RTrim(" A B ") | " A B" |
WorksheetFunction.Trim(" A B ") | "A B" |
Trim・LTrim・RTrim はいずれも、中間の連続スペースをそのまま残します。中間スペースを1つに詰めるのは WorksheetFunction.Trim だけです。ここが最大の違いです。
「先頭と末尾だけ消えればいい」場合は VBA 標準の Trim で十分です。「単語間の余分なスペースも整えたい」場合は WorksheetFunction.Trim を選びます。
TIP: 各関数の単体の使い方は、VBA Trim関数・VBA LTrim関数・VBA RTrim関数の各記事で解説しています。空白処理全体の使い分けはVBAで空白を削除する方法まとめも参考にしてください。
WorksheetFunction.Trim が活躍する実務シーン
WorksheetFunction.Trim の出番は、間隔がそろっていないデータを受け取ったときです。代表的なのが、システムから出力されたレポートや CSV ファイルです。項目の区切りが複数スペースになっていることがよくあります。実務で使えるコードを2つ紹介します。
実務コード1: 1つのセルをクレンジングする
A 列のセルに入った文字列を整え、B 列に書き出すコードです。
Sub CleanSingleCell()
Dim sRaw As String '元の文字列
Dim sClean As String '整形後の文字列
'--- A2セルの値を取得 ---
sRaw = Range("A2").Value
'--- 先頭末尾+中間スペースを正規化 ---
sClean = WorksheetFunction.Trim(sRaw)
'--- 整形結果をB2セルに出力 ---
Range("B2").Value = sClean
End Sub
A2 に " 山田 太郎 " のような値が入っていても、B2 には "山田 太郎" ときれいに出力されます。
実務コード2: セル範囲を一括クレンジングする
実務では1セルだけでなく、列全体を一気に処理したい場面が多いはずです。A 列のデータを最終行まで順番に整えるコードです。
Sub CleanRangeWithTrim()
Dim lastRow As Long '最終行の行番号
Dim i As Long '行カウンター
'--- A列の最終行を取得 ---
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
'--- 2行目から最終行まで繰り返す ---
For i = 2 To lastRow
'--- 文字列のセルだけを対象に正規化 ---
If VarType(Cells(i, 1).Value) = vbString Then
Cells(i, 1).Value = WorksheetFunction.Trim(Cells(i, 1).Value)
End If
Next i
MsgBox "クレンジングが完了しました。"
End Sub
VarType でセルの値が文字列かどうかを確認しています。数値や日付のセルに Trim をかけると、意図しない型変換が起きることがあるためです。文字列のセルだけを対象にすると安全です。
ノーブレークスペース(Chr(160))が削除できない落とし穴と対処法
WorksheetFunction.Trim には1つ大きな落とし穴があります。それが「ノーブレークスペース」です。Web ページや一部のシステムからコピーしたデータに混ざっていることがあります。
ノーブレークスペースは、文字コードの値が160の空白文字です。HTML では として使われます。見た目は普通のスペースとそっくりですが、別の文字です。
WorksheetFunction.Trim が削除できるのは、値が32の半角スペース(Chr(32))だけです。これは公式ドキュメントにも明記されています。VBA 標準の Trim・LTrim・RTrim も同じく、ノーブレークスペースには反応しません。
Sub TrimCannotRemoveNbsp()
Dim sText As String '元の文字列
'--- 単語の間にノーブレークスペースを含む文字列 ---
sText = "A" & Chr(160) & Chr(160) & "B"
'--- Trimをかけてもノーブレークスペースは残る ---
MsgBox "[" & WorksheetFunction.Trim(sText) & "]"
End Sub
このコードを実行しても、A と B の間のノーブレークスペースは消えません。「Trim を試したのに空白が消えない」という現象の正体は、たいていこれです。
対処法は、ノーブレークスペースを先に半角スペースへ変換することです。Replace 関数を使います。半角スペースに変えてから WorksheetFunction.Trim を通すと、区切りのスペースを残しつつ正規化できます。
Sub CleanWithNbsp()
Dim sRaw As String '元の文字列
Dim sClean As String '整形後の文字列
'--- A2セルの値を取得 ---
sRaw = Range("A2").Value
'--- ノーブレークスペースを半角スペースに変換 ---
sClean = Replace(sRaw, Chr(160), " ")
'--- 連続スペースを1つに圧縮し先頭末尾も削除 ---
sClean = WorksheetFunction.Trim(sClean)
'--- 整形結果をB2セルに出力 ---
Range("B2").Value = sClean
End Sub
「Chr(160) を半角スペースに変換 → WorksheetFunction.Trim」の順番がポイントです。いきなり全削除すると、本来必要な区切りスペースまで失われることがあります。
NOTE: ノーブレークスペースの正体と消し方は、Excelで消えない空白の正体と消し方でさらに詳しく解説しています。
WorksheetFunction.Trim を使うときの注意点・よくあるエラー
最後に、つまずきやすいポイントを整理します。
1つ目は、タブや改行は削除されないことです。削除対象はあくまで半角スペースだけです。タブ(Chr(9))や改行(Chr(10)、Chr(13))が混じっている場合は、Replace で個別に処理する必要があります。
2つ目は、全角スペースの扱いです。WorksheetFunction.Trim は半角スペースを対象に設計されています。全角スペースを確実に消したいときは、Replace(s, " ", " ") で半角に変換してから処理するのが安全です。
3つ目は、空セルや数値セルへの適用です。空のセルや数値のセルを直接渡すと、思わぬ型変換が起きることがあります。実務コード2のように VarType で文字列かどうかを確認してから渡すと、トラブルを防げます。
| つまずきポイント | 原因 | 対処法 |
|---|---|---|
| 中間スペースが残る | VBA 標準の Trim を使っている | WorksheetFunction.Trim を使う |
| ある空白だけ消えない | ノーブレークスペース(Chr(160)) | Replace で半角スペースに変換してから処理 |
| 全角スペースが残る | 対象は半角スペースのみ | Replace(s, " ", " ") で半角に変換 |
| タブ・改行が残る | 対象は半角スペースのみ | Replace で Chr(9)/Chr(10)/Chr(13) を処理 |
まとめ
WorksheetFunction.Trim は、文字列の先頭・末尾のスペースに加えて、単語間の連続スペースも1つに圧縮できるメソッドです。VBA 標準の Trim 関数が中間スペースを残すのに対し、こちらは中間スペースを詰めてくれます。この違いが両者の最大のポイントです。
システム出力や CSV インポート後のデータで、間隔が不規則な文字列を整えたいときに役立ちます。ただし、ノーブレークスペース(Chr(160))は Trim 系では消せません。Replace で半角スペースに変換してから処理する、という流れを覚えておくと安心です。
空白処理の関数はそれぞれ役割が違います。先頭・末尾だけなら Trim、片側だけなら LTrim/RTrim、中間も整えるなら WorksheetFunction.Trim、と使い分けてみてください。
