【VBA】LTrim関数の使い方|先頭の空白を削除する方法

スポンサーリンク

手入力やCSVインポートで取り込んだデータに、先頭の空白が紛れ込んでいた経験はありませんか?

見た目は同じなのに、VLOOKUPで「一致なし」が返ってくる。調べてみると、セルの先頭に半角スペースが入っていた――こんなトラブルは意外と多いものです。

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

ExcelのVBAには LTrim関数 という便利なツールがあります。たった1行のコードで、先頭の空白をまとめてクレンジングできます。この記事では、基本的な使い方から業務で使える実践コードまで順を追って解説していきます。

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

VBA LTrimとは?

LTrimは、文字列の 先頭(左側)にある半角スペースだけを削除する VBA関数です。「Left Trim」の略で、左側をトリミングするイメージですね。

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

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

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

LTrim・RTrim・Trimの違い

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

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

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

迷ったらTrimを選べば間違いありません。「先頭だけ消したい」という明確な理由があるときにLTrimを使い分けてみてください。

削除できない空白に注意

LTrimが削除できるのは 半角スペース(Chr(32))のみ です。

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

一部のサイトで「全角スペースも削除される」という情報がありますが、これは誤りです。全角スペースはLTrimの対象外なので注意してください。

全角スペースやNBSPを除去したい場合は、Replace(文字列を置換する関数)で個別に対処しましょう。実践コードのセクションで具体的な方法を紹介しています。

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

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

VBE(Visual Basic Editor)の開き方

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

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

VBEの画面構成について詳しく知りたい方は、VBE画面の見方も参考にしてみてください。

標準モジュールの挿入

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

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

ここまで準備できたら、さっそく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)されない
NBSPChr(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空白削除まとめ で一覧できますよ。

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