手入力やCSVインポートで取り込んだデータに、先頭の空白が紛れ込んでいた経験はありませんか?
見た目は同じなのに、VLOOKUPで「一致なし」が返ってくる。調べてみると、セルの先頭に半角スペースが入っていた――こんなトラブルは意外と多いものです。
数件なら手作業で消せますが、数百行のデータを目視チェックするのは現実的ではありませんよね。
ExcelのVBAには LTrim関数 という便利なツールがあります。たった1行のコードで、先頭の空白をまとめてクレンジングできます。この記事では、基本的な使い方から業務で使える実践コードまで順を追って解説していきます。
空白削除の全体像を先に知りたい方は、VBA空白削除まとめ|Trim・LTrim・RTrim・Replaceの使い分け方をご覧ください。
VBA LTrimとは?
LTrimは、文字列の 先頭(左側)にある半角スペースだけを削除する VBA関数です。「Left Trim」の略で、左側をトリミングするイメージですね。
たとえば、こんなふうに変換されます。
| Before | After |
|---|---|
" Excel" | "Excel" |
" VBA 入門 " | "VBA 入門 " |
"データ" | "データ"(変化なし) |
ポイントは、末尾の空白はそのまま残る ということです。先頭だけをピンポイントで処理したい場面で使います。
LTrim・RTrim・Trimの違い
VBAには空白を削除する関数が3つあります。違いをまとめると次のとおりです。
なお、VBAのTrimはワークシート関数の TRIM関数 とは動作が異なります。ワークシートのTRIMは文字列内部の連続スペースも1つに圧縮しますが、VBAのTrimは前後の空白を削除するだけです。内部の空白には手をつけません。
迷ったらTrimを選べば間違いありません。「先頭だけ消したい」という明確な理由があるときにLTrimを使い分けてみてください。
削除できない空白に注意
LTrimが削除できるのは 半角スペース(Chr(32))のみ です。
以下の文字は空白のように見えても LTrimでは削除されません。
- 全角スペース(ChrW(12288))
- タブ文字(Chr(9))
- 改行(Chr(10) / Chr(13))
- ノーブレークスペース(NBSP)(Chr(160))
一部のサイトで「全角スペースも削除される」という情報がありますが、これは誤りです。全角スペースはLTrimの対象外なので注意してください。
全角スペースやNBSPを除去したい場合は、Replace(文字列を置換する関数)で個別に対処しましょう。実践コードのセクションで具体的な方法を紹介しています。
VBEの起動とコードの書き方
VBAのコードを動かすには、まずVBE(Visual Basic Editor)を開いて、コードを書く場所を用意します。
VBE(Visual Basic Editor)の開き方
Excelを開いた状態で、キーボードの Alt + F11 を押してください。VBEのウィンドウが表示されます。
リボンから開く場合は、「開発」タブ →「Visual Basic」をクリックします。「開発」タブが見当たらないときは、「ファイル」→「オプション」→「リボンのユーザー設定」を開いてください。「開発」にチェックを入れれば表示されますよ。
VBEの画面構成について詳しく知りたい方は、VBE画面の見方も参考にしてみてください。
標準モジュールの挿入
VBEが開いたら、コードを書く場所(標準モジュール)を追加します。
- メニューバーの「挿入」→「標準モジュール」をクリック
- 左側のプロジェクトエクスプローラーに「Module1」が追加される
- 右側に表示されるコードウィンドウに、コードを書いていく
ここまで準備できたら、さっそくLTrimを使ってみましょう。
基本コード(コピペで動く)
LTrimの構文はとてもシンプルです。
Strings.LTrim(string)
引数に文字列を渡すと、先頭の半角スペースを取り除いた文字列が返ってきます。
まずは動作確認用のコードを試してみましょう。Module1のコードウィンドウに、以下をそのまま貼り付けてください。
Sub LTrimの動作確認()
Dim sBefore As String '--- 変換前の文字列 ---
Dim sAfter As String '--- 変換後の文字列 ---
sBefore = " Excel VBA"
sAfter = LTrim(sBefore)
'--- 結果をメッセージボックスで確認 ---
MsgBox "変換前: [" & sBefore & "]" & vbCrLf & _
"変換後: [" & sAfter & "]", vbInformation
End Sub
コードを貼り付けたら、F5キー を押して実行してみてください。メッセージボックスに変換前と変換後の文字列が表示されます。角括弧で囲んでいるので、先頭のスペースが消えたことが一目でわかるはずです。
コードの仕組みを理解する
基本コードが動いたところで、LTrimのポイントをもう少し掘り下げておきましょう。
Strings.LTrimとLTrimの違い
先ほどの構文で Strings.LTrim と書きましたが、サンプルコードでは LTrim だけで動いていましたよね。
実はこの2つは同じ関数です。Strings はVBAの標準ライブラリ名で、通常は省略できます。ただし、複数のライブラリを参照設定している場合は注意が必要です。同じ名前の関数が存在すると名前の衝突が起きて、コンパイルエラーになることがあります。
普段は LTrim だけで問題ありません。エラーが出た場合は Strings.LTrim とフル修飾で書くと解決しますよ。
空白がない場合の挙動
先頭に空白がない文字列をLTrimに渡しても、エラーにはなりません。元の文字列がそのまま返ってきます。
Debug.Print LTrim("Excel") '--- 結果: "Excel"(変化なし) ---
「空白があるかどうか事前にチェックしなきゃ」と心配する必要はありません。安心してまとめて処理できますよ。
なお、Nullを渡した場合はNullがそのまま返ります。空文字列を渡した場合も空文字列が返ります。どちらもエラーにはなりません。
対応する空白の種類
あらためて整理しておきます。
| 文字 | コード | LTrimで削除 |
|---|---|---|
| 半角スペース | Chr(32) | される |
| 全角スペース | ChrW(12288) | されない |
| タブ | Chr(9) | されない |
| 改行(LF) | Chr(10) | されない |
| 改行(CR) | Chr(13) | されない |
| NBSP | Chr(160) | されない |
半角スペース以外の空白を含むデータを扱う場合は、Replace(文字列を置換する関数)を併用するのがおすすめです。
実践コード(業務に使えるバージョン)
ここからは、実際の業務で使えるコードを4つ紹介します。
シートのセルを一括クレンジングする
A列に入力されたデータの先頭空白を、まとめて除去するマクロです。VLOOKUPの前処理などに便利ですよ。
Sub A列の先頭空白を一括削除()
Dim ws As Worksheet '--- 対象シート ---
Dim rng As Range '--- データ範囲 ---
Dim cell As Range '--- ループ用セル ---
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 = LTrim(cell.Value)
End If
Next cell
MsgBox "A列の先頭空白を削除しました。", vbInformation
End Sub
VarType(cell.Value) = vbString で文字列セルだけを対象にしています。数値や日付のセルをLTrimに渡すと型の不一致が起きる場合があるので、この判定を入れておくのが安全です。
対象列を変えたいときは、Range("A1:A"...) の「A」を任意の列に書き換えてください。For Eachの詳細はFor Eachの使い方も参考にどうぞ。
CSVインポート後の先頭空白を除去する
CSVファイルから読み込んだ1行分のデータを、カンマで分割して各項目の先頭空白を除去するコードです。
Sub CSV行の先頭空白を除去()
Dim sLine As String '--- CSV1行分のデータ ---
Dim vItems As Variant '--- 分割後の配列 ---
Dim i As Long '--- ループカウンタ ---
'--- サンプルデータ(実務ではファイル読み込み) ---
sLine = " 田中太郎, 営業部, 東京都"
'--- カンマで分割 ---
vItems = Split(sLine, ",")
'--- 各項目の先頭空白を除去 ---
For i = LBound(vItems) To UBound(vItems)
vItems(i) = LTrim(CStr(vItems(i)))
Next i
'--- 結果を確認 ---
MsgBox "1: " & vItems(0) & vbCrLf & _
"2: " & vItems(1) & vbCrLf & _
"3: " & vItems(2), vbInformation
End Sub
Split(文字列を区切り文字で分割する関数)でカンマ区切りにしたあと、For ループで各要素にLTrimをかけています。CSVでよくある「カンマの後にスペースが入っている」パターンに対応できます。
固定長データの先頭パディングを除去する
レガシーシステムから出力された固定長データでは、数値や文字列の先頭にスペースが詰められていることがあります。LTrimで先頭のパディングを除去すれば、数値変換やVLOOKUPの照合がスムーズになります。
Sub 固定長データの先頭パディングを除去()
Dim ws As Worksheet '--- 対象シート ---
Dim lastRow As Long '--- 最終行 ---
Dim lastCol As Long '--- 最終列 ---
Dim i As Long '--- 行カウンタ ---
Dim j As Long '--- 列カウンタ ---
Dim lCount As Long '--- 処理件数 ---
Set ws = ActiveSheet
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
'--- 全セルの先頭パディングを除去 ---
For i = 2 To lastRow
For j = 1 To lastCol
If VarType(ws.Cells(i, j).Value) = vbString Then
ws.Cells(i, j).Value = LTrim(ws.Cells(i, j).Value)
lCount = lCount + 1
End If
Next j
Next i
MsgBox lCount & " 件のセルから先頭パディングを除去しました。", vbInformation
End Sub
1行目をヘッダーとして2行目からループしています。固定長ファイルをExcelにインポートした直後に実行すると、そのまま集計やVLOOKUP照合に進めますよ。
LTrim+Replaceで全角スペースも対応する
LTrimは半角スペースしか削除できません。全角スペースも先頭から除去したい場合は、Replaceを使います。全角スペースを半角に変換してからLTrimをかけるのがおすすめです。
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 = Replace(sVal, ChrW(12288), " ")
'--- Step2: 先頭の半角スペースを削除 ---
sVal = LTrim(sVal)
If cell.Value <> sVal Then
cell.Value = sVal
lCount = lCount + 1
End If
End If
Next cell
MsgBox lCount & " 件のセルから先頭空白を除去しました。", vbInformation
End Sub
ポイントは ReplaceでLTrimの前に全角→半角変換をかける ことです。この順序なら、全角スペースが先頭にあるケースもLTrimでまとめて削除できます。
文字列の途中にある全角スペースも半角に変換される点に注意してください。途中の全角スペースを残したい場合は、先頭の全角スペースだけをループで除去するコードに書き換える必要があります。
よくあるエラーと対処法
LTrim自体はシンプルな関数ですが、周辺で引っかかりやすいポイントがあります。
| エラー | 原因 | 対処法 |
|---|---|---|
| 型の不一致(実行時エラー 13) | 数値セルの値をString型変数に直接代入 | CStr で明示的に変換するか、VarType で文字列セルだけを処理対象にする |
| あいまいな名前が検出されました | 複数ライブラリで LTrim の名前が衝突 | Strings.LTrim とフル修飾で記述 |
| マクロが無効にされました | .xlsx形式で保存、またはセキュリティ設定 | .xlsm形式で保存し、「コンテンツの有効化」をクリック |
型の不一致を防ぐ
数値が入っているセルをLTrimに渡すと、型の不一致エラーが出ることがあります。
'--- これはエラーになる場合がある ---
Dim s As String
s = Range("A1").Value '--- A1が数値だとエラー ---
対策は2つあります。CStr(値を文字列に変換する関数)で明示的に変換するか、VarType で文字列セルだけを対象にするかです。実践コードでは後者の方法を使っています。
変数宣言の漏れを防ぐ
モジュールの先頭に Option Explicit を書いておくと、変数の宣言漏れをコンパイル時に検出できます。スペルミスによるバグ防止にとても効果的です。
Option Explicit
詳しくは Option Explicitの使い方 を参考にしてください。
マクロ無効・.xlsm保存の注意
VBAマクロを含むファイルは、必ず マクロ有効ブック(.xlsm) 形式で保存してください。通常の .xlsx 形式で保存すると、マクロのコードがすべて失われます。
ファイルを開いたときに「マクロが無効にされました」と表示されたら、「コンテンツの有効化」をクリックしてください。
まとめ
VBA LTrim関数のポイントを振り返っておきましょう。
- LTrimは先頭の半角スペースだけを削除する関数。末尾は残る
- 全角スペース・タブ・NBSPは削除されない。全角対応には
Replaceを併用する - 空白がない文字列を渡してもエラーにならないので、安心してまとめて処理できる
- 業務では
For Eachループと組み合わせて、セルの一括クレンジングに使うのが定番
空白の処理は地味ですが、データの正確性に直結する大事な前処理です。LTrimをうまく使って、クリーンなデータを手に入れましょう。
末尾の空白も消したいときは RTrim(末尾の空白削除)、前後まとめて消したいときは Trim(前後の空白削除) を使い分けてみてください。ワークシート上で空白を除去したい場合は、ExcelのTRIM関数の使い方 も参考になります。空白処理の全体像は、VBA空白削除まとめ で一覧できますよ。
