VBAで文字列処理をしていると、末尾に付いている不要な文字だけを削除したい場面がよくあります。たとえば、商品コードの末尾3文字を除きたい、ファイル名の拡張子だけを外したい、帳票用の識別コードから管理用の枝番を落としたい、といったケースです。こうした処理は一見単純に見えますが、実務では「文字数が足りない」「空白セルが混ざる」「毎回条件が変わる」といった問題が起きやすく、場当たり的な書き方だと後から壊れやすくなります。
この記事では、VBAで文字列から右側のn文字を削除する方法を、基本の考え方から実務で再利用しやすい関数化まで丁寧に整理します。単に動くコードを載せるだけではなく、なぜその書き方にするのか、別の書き方と比べて何が安全なのか、実務で気をつけるべき点は何かも含めて解説します。右側の文字削除は、文字列整形の基礎でありながら、他の処理にも応用しやすい重要なテーマです。ここでしっかり理解しておくと、後続の抽出・分割・判定処理もかなり書きやすくなります。
目次
- ✅ VBA 文字列から右側のn文字を削除する基本の考え方
- ・VBAで右側のn文字を削除するときの基本式
- ・なぜRight関数ではなくLeft関数を使うのか
- ✅ VBA 文字列から右側のn文字を削除する基本コード
- ・文字列変数を使って右側のn文字を削除する基本コード
- ・この書き方を選ぶ理由と別案との違い
- ✅ VBA セルの文字列から右側のn文字を削除する方法
- ・1つのセルを対象に右側のn文字を削除する手順
- ・セルを直接式に入れない方がよい理由
- ・複数行をまとめて処理する実務コード
- ✅ VBA 右側のn文字削除でエラーを防ぐ注意点
- ・文字数より大きいnを指定した場合の問題
- ・空白セルやNull相当の値に注意する
- ・0文字削除や負の数を渡す設計も決めておく
- ✅ VBA 文字列から右側のn文字を削除する処理を関数化する方法
- ・再利用しやすいFunctionの実装例
- ・この関数設計にしている理由
- ・関数を使ってセル処理を書く方法
- ✅ VBA 文字列の右側削除を実務で使う具体例
- ・商品コードの枝番を削除する場面
- ・ファイル名の末尾ルールを除く場面
- ・帳票番号や識別コードの末尾管理番号を落とす場面
- ✅ VBA 文字列から右側のn文字を削除するときの関数選びと設計判断
- ・Replace関数で代用しない方がよい理由
- ・Mid関数よりLeft関数が自然な理由
- ・実務では“目的が見える関数”を選ぶのが大切
- ✅ まとめ:VBA 文字列から右側のn文字を削除する方法を実務で使いこなそう
✅ VBA 文字列から右側のn文字を削除する基本の考え方
右側のn文字を削除する処理は、見た目以上に考え方が大切です。実務では「右から3文字削る」「末尾2桁を除く」といった指示だけを受けることが多く、ついその場しのぎで書いてしまいがちです。しかし、文字列長より大きい数を削ろうとした場合や、空文字・Nullが混ざった場合に、そのコードが一気に不安定になります。特に、あとから別の人が修正する可能性があるマクロでは、処理意図が分かる書き方にしておかないと保守性が落ちます。ここを曖昧にしたまま進めると、「たまたま今回は動いた」コードになりやすく、後で困る原因になります。まずは、なぜこの処理に Left関数 と Len関数 を使うのかを整理していきましょう。
・VBAで右側のn文字を削除するときの基本式
VBAで文字列の右側からn文字を削除する基本式は、次の形になります。
Left(対象文字列, Len(対象文字列) - n)
この考え方はとても重要です。
右側から直接「削除する」関数を使うのではなく、
- 元の文字列の長さを取得する
- そこから削除したい文字数を引く
- 残したい左側の文字数だけ取得する
という流れで処理しています。
たとえば、"ABCDEF" の右側2文字を削除したい場合は、
- 全体の長さ:6
- 削除したい文字数:2
- 残したい文字数:4
となるため、Left("ABCDEF", 4) を実行すれば "ABCD" が返ります。
・なぜRight関数ではなくLeft関数を使うのか
ここは誤解されやすいポイントです。
「右側の処理だからRight関数では」と考えたくなりますが、今回やりたいのは右側の文字を取得することではなく、右側の文字を除いた左側を残すことです。
Right関数は、
- 右から何文字取り出すか
を指定する関数です。
一方で今回必要なのは、
- 左側を何文字残すか
です。
つまり、目的に合っているのは Left関数 です。
この違いを理解していないと、後からコードを見たときに意図が読み取りにくくなります。実務では、関数の選び方そのものが可読性に直結します。
✅ VBA 文字列から右側のn文字を削除する基本コード
この処理は短く書けるため、つい説明なしでコードだけ置いてしまいがちです。しかし、短いコードほど「なぜその形なのか」を分かっていないと応用が利きません。特に文字列処理は、似た処理が多く、Left・Right・Midの使い分けが曖昧なままだと後で混乱しやすくなります。また、最初にシンプルな完成形を押さえておくことで、後から安全性や再利用性を足していく流れが理解しやすくなります。この章では、まず最小構成の基本コードを確認し、そのあとで実務向けに改善していく考え方につなげます。
・文字列変数を使って右側のn文字を削除する基本コード
まずは、最も基本的なサンプルです。
Sub RemoveRightCharactersBasic()
Dim sourceText As String
Dim removeCount As Long
Dim resultText As String
sourceText = "ABCDEF"
removeCount = 2
resultText = Left(sourceText, Len(sourceText) - removeCount)
MsgBox resultText
End Sub
このコードでは、"ABCDEF" の右側2文字を削除し、結果として "ABCD" を表示します。
この書き方の良い点は、処理に必要な意味が変数名から分かることです。
sourceText:元の文字列removeCount:削除したい文字数resultText:加工後の文字列
単発のサンプルであっても、実務を意識するならこうした命名にしておく方が後から流用しやすくなります。
逆に str1 や a のような名前にすると、短期的には楽でも、数週間後に見返したとき理解コストが上がります。
・この書き方を選ぶ理由と別案との違い
この基本コードでは、あえて1行に全部詰め込まず、変数を分けています。理由は、処理の意味が途中で見えるからです。
たとえば次のようにも書けます。
MsgBox Left("ABCDEF", Len("ABCDEF") - 2)
これは動きます。しかし、実務ではおすすめしにくいです。
なぜなら、
- 入力値を差し替えにくい
- デバッグしにくい
- 後で処理を追加しにくい
からです。
実務では、最初は単純でも後から
- 削除文字数をセルから読む
- 結果を別セルへ出す
- 条件によって削除数を変える
といった拡張が入りやすいため、最初から変数ベースで組んでおく方が安定します。
✅ VBA セルの文字列から右側のn文字を削除する方法
実務でよくあるのは、文字列変数ではなくセルに入っている値を加工したいケースです。ここでありがちなのが、サンプルコードをそのままセル処理に流用して、空白セルやエラー値に弱いマクロを作ってしまうことです。特に一覧データを対象にする場合は、すべてのセルがきれいな文字列とは限りません。見た目は文字列でも、実際には数値だったり、空白だったり、数式の結果だったりします。この章では、セル値を扱うときに最低限意識したい書き方を整理します。ここを読まないまま量産処理に進むと、運用中に止まりやすいマクロになってしまいます。
・1つのセルを対象に右側のn文字を削除する手順
- 元データが入っているセルを指定する
- 削除したい文字数を決める
LeftとLenを組み合わせる- 結果を別セルに出力する
基本コードは次のようになります。
Sub RemoveRightCharactersFromCell()
Dim sourceText As String
Dim removeCount As Long
Dim resultText As String
sourceText = Range("A2").Value
removeCount = 3
resultText = Left(sourceText, Len(sourceText) - removeCount)
Range("B2").Value = resultText
End Sub
このコードは、A2セルの文字列から右側3文字を削除し、B2セルへ出力します。
・セルを直接式に入れない方がよい理由
次のように1行で書くこともできます。
Range("B2").Value = Left(Range("A2").Value, Len(Range("A2").Value) - 3)
これも動作自体は問題ありません。
ただし実務では、前段階として値を変数に入れる形の方が安全です。理由は次の通りです。
- 同じセル参照を何度も書かずに済む
- デバッグ時に中身を確認しやすい
- 将来的に入力元セルが変わっても修正箇所が少ない
特に、処理対象が1セルから複数セルへ広がる場合、変数へ受けてから処理する流れにしておくと拡張がしやすくなります。
・複数行をまとめて処理する実務コード
一覧表の整形では、複数行をループで処理することが多いです。
Sub RemoveRightCharactersForList()
Dim targetWorksheet As Worksheet
Dim lastRow As Long
Dim rowIndex As Long
Dim sourceText As String
Dim resultText As String
Dim removeCount As Long
Set targetWorksheet = ActiveSheet
removeCount = 2
lastRow = targetWorksheet.Cells(targetWorksheet.Rows.Count, "A").End(xlUp).Row
For rowIndex = 2 To lastRow
sourceText = CStr(targetWorksheet.Cells(rowIndex, "A").Value)
If Len(sourceText) >= removeCount Then
resultText = Left(sourceText, Len(sourceText) - removeCount)
Else
resultText = ""
End If
targetWorksheet.Cells(rowIndex, "B").Value = resultText
Next rowIndex
End Sub
このコードでは、A列の2行目から最終行まで順番に処理し、右側2文字を削除した結果をB列へ出力します。
この書き方を選んでいる理由は、一覧処理に必要な最低限の安全性を入れているからです。
特に If Len(sourceText) >= removeCount Then を入れている点が重要です。これがないと、文字数不足のデータでエラーや意図しない結果が出る可能性があります。
✅ VBA 右側のn文字削除でエラーを防ぐ注意点
この処理で最も多い失敗は、「文字数が足りないケースを想定していない」ことです。テストデータではうまく動いても、実データでは空白や短い文字列が混ざるため、想定外の動作が起きやすくなります。また、削除文字数が固定ではなく、セルや入力値から渡される場合はなおさらです。実務では、正常系だけでなく異常系をどこまで吸収するかがコード品質を左右します。ここで丁寧に条件を設計しておくと、あとから仕様変更が入っても安定しやすくなります。
・文字数より大きいnを指定した場合の問題
たとえば "AB" から右側3文字を削除しようとすると、
- 元文字列の長さ:2
- 削除したい文字数:3
- 残したい文字数:-1
となります。
このように、Left関数へ負の値を渡す状態を作るのは危険です。
そのため、実務では必ず事前に判定を入れるべきです。
If Len(sourceText) >= removeCount Then
resultText = Left(sourceText, Len(sourceText) - removeCount)
Else
resultText = ""
End If
このように書いておけば、文字数不足の場合も処理が止まりにくくなります。
・空白セルやNull相当の値に注意する
Excelのセル処理では、「空白」もよく混ざります。
また、他システムから取り込んだデータやADO経由の処理ではNull相当の考慮が必要になることもあります。
セルを扱うVBAでは、まず CStr で文字列化してから処理する方が安定しやすいです。
sourceText = CStr(targetWorksheet.Cells(rowIndex, "A").Value)
この1行を入れておくことで、少なくとも「型が違って動かない」場面を減らせます。
もちろん、厳密に空白を判定したいなら Trim と組み合わせる判断もあります。
・0文字削除や負の数を渡す設計も決めておく
見落とされがちですが、削除数が0やマイナスになるケースもあります。
実務では、
- 削除数をセル入力にする
- フォーム入力にする
- 別の計算結果を渡す
といった設計があるためです。
この場合、最初に削除数を検証しておくと安全です。
If removeCount < 0 Then
MsgBox "削除文字数には0以上を指定してください。"
Exit Sub
End If
こうした防御コードは、処理自体よりも運用中に止まりにくいことに価値があります。
✅ VBA 文字列から右側のn文字を削除する処理を関数化する方法
同じ処理を複数の場所で使うなら、関数化しておく方が圧倒的に有利です。ここを毎回ベタ書きすると、仕様変更時に修正漏れが起きやすくなります。また、文字数不足の扱いを統一したい場合も、1か所に処理をまとめておく方が管理しやすくなります。実務での再利用性を高めるうえで、関数化は非常に重要です。ただし、単に関数へ切り出せばよいわけではなく、「何を返すか」「異常値をどう扱うか」まで含めて設計する必要があります。
・再利用しやすいFunctionの実装例
まずは、実務で使いやすい形の関数例です。
Function RemoveRightCharacters(ByVal sourceText As String, ByVal removeCount As Long) As String
If removeCount < 0 Then
RemoveRightCharacters = sourceText
Exit Function
End If
If Len(sourceText) <= removeCount Then
RemoveRightCharacters = ""
Exit Function
End If
RemoveRightCharacters = Left(sourceText, Len(sourceText) - removeCount)
End Function
この関数は、
- 右側から指定文字数を削除する
- 削除数が不正なら元文字列を返す
- 文字数不足なら空文字を返す
という方針で作っています。
・この関数設計にしている理由
ここで大切なのは、関数の戻り方に一貫性を持たせていることです。
たとえば、文字数不足のときにエラーにする設計もあります。
しかし、Excelの一覧処理では1件の不正データで全体を止めたくないことが多いため、ここでは空文字を返す設計にしています。
また、引数を ByVal にしているのも意図があります。
今回は受け取った文字列や削除数を書き換える必要がないため、呼び出し元の値に影響を与えない安全な設計を優先しています。これは実務で再利用する関数ほど重要です。
・関数を使ってセル処理を書く方法
上の関数を使えば、呼び出し側はかなりシンプルになります。
Sub UseRemoveRightCharactersFunction()
Dim targetWorksheet As Worksheet
Dim lastRow As Long
Dim rowIndex As Long
Dim sourceText As String
Set targetWorksheet = ActiveSheet
lastRow = targetWorksheet.Cells(targetWorksheet.Rows.Count, "A").End(xlUp).Row
For rowIndex = 2 To lastRow
sourceText = CStr(targetWorksheet.Cells(rowIndex, "A").Value)
targetWorksheet.Cells(rowIndex, "B").Value = RemoveRightCharacters(sourceText, 3)
Next rowIndex
End Sub
この形にしておくと、後から
- 2文字削除を4文字削除へ変更
- 別シートへ横展開
- 条件別に削除数を変える
といった修正がしやすくなります。
今回紹介したような文字列処理は、関数化しておくことで他の整形処理にもそのまま応用できます。
たとえば「特定の文字から特定の文字までを取り出す」といった処理も、同じ考え方で実装できます。
次の記事では、Mid関数とInStr関数を組み合わせた実務的な抽出方法を詳しく解説しています。
→【VBA】特定の文字から特定の文字までを抽出する方法|Mid・InStrで実務対応
✅ VBA 文字列の右側削除を実務で使う具体例
右側のn文字削除は、単なる練習用の処理ではありません。実務では想像以上に出番があります。しかし、用途を具体的にイメージできていないと、学んでもすぐ忘れてしまいがちです。逆に、「この場面で使える」と分かると、他の文字列処理ともつながって理解が深まります。この章では、業務ファイルで起こりやすい活用パターンを整理します。単なるコード暗記ではなく、処理の使いどころを押さえておきましょう。
・商品コードの枝番を削除する場面
たとえば、商品コードが次のようになっているとします。
A100-01A100-02A100-03
このとき、末尾の -01 などを削除してベースコード A100 だけを取りたいことがあります。
このような処理は、集計前のコード統一やマスタ照合の前段階でよく使われます。
・ファイル名の末尾ルールを除く場面
たとえば、
売上データ_旧在庫一覧_仮報告書_提出前
のような文字列から、末尾2文字や3文字を一律で外したいケースです。
もちろん、拡張子削除のように「特定文字より後ろ」を削るなら別の方法が適切な場合もありますが、末尾文字数が固定されているなら今回の方法がシンプルです。
・帳票番号や識別コードの末尾管理番号を落とす場面
帳票番号に内部管理用の枝番が付いていることがあります。
たとえば INV202504001A の末尾1文字だけを削除して本体番号を作る、といった使い方です。
このような場面では、RightやMidで部分取得するよりも、右側を削るという目的に合わせて関数化しておく方が、意図が伝わりやすくなります。
✅ VBA 文字列から右側のn文字を削除するときの関数選びと設計判断
似た文字列処理はたくさんあるため、「どの関数を使うべきか」が曖昧になりやすいです。特に、Right・Left・Mid・Replaceは役割が近そうに見えるため、なんとなく選んでしまう人も少なくありません。しかし、実務では関数選びそのものが読みやすさや保守性に影響します。ここを感覚で済ませると、後からコードを見た人が意図を理解しづらくなります。この章では、今回の処理でなぜLeft+Lenが適しているのか、他の選択肢と比べながら整理します。
・Replace関数で代用しない方がよい理由
たとえば、末尾の特定文字列が必ず決まっているなら Replace でも対応できる場合があります。
しかし、今回のテーマは「右側のn文字を削除すること」です。
Replaceで考えると、
- 何を消すのか
- 何文字消すのか
が混ざりやすくなります。
つまり、処理の目的と関数の役割がずれるのです。
固定文字列を消すならReplace、固定文字数を削るならLeft+Len。
この切り分けをしておくと、コード全体が読みやすくなります。
・Mid関数よりLeft関数が自然な理由
Mid関数は開始位置と取得文字数を指定する関数です。
柔軟性は高いですが、今回のような「右を削って左を残す」処理では、Leftの方が直感的です。
たとえば、Midで同じことを表現すると、かえって
- 開始位置をどうするか
- 長さをどうするか
を考える必要があり、目的に対して遠回りになります。
・実務では“目的が見える関数”を選ぶのが大切
実務コードでは、最短で書くことよりも目的が読み取れることが重要です。
今回の処理では、
- 右側を削る
- 左側を残す
- 元の長さから差し引く
という構造がそのまま見えるため、Left+Lenの組み合わせが非常に相性が良いです。
文字列処理では、どの関数を選ぶかによってコードの読みやすさや保守性が大きく変わります。
Mid・Left・Rightの違いを改めて整理しておきたい方は、次の記事も参考にしてみてください。
→【VBA】文字列操作関数【Mid・Left・Right】|実務で使い倒す完全ガイド
✅ まとめ:VBA 文字列から右側のn文字を削除する方法を実務で使いこなそう
- VBAで右側のn文字を削除する基本式は
"Left(対象文字列, Len(対象文字列) - n)" - Right関数ではなく、左側を残す目的でLeft関数を使うのが自然
- セル処理では空白や文字数不足に注意する
- 実務では条件判定を入れて止まりにくいコードにすることが重要
- 同じ処理を繰り返すならFunction化して再利用性を高める
- 商品コード、帳票番号、ファイル名整形など実務での出番は多い
- 関数選びでは「短く書けるか」より「意図が伝わるか」を優先する
右側のn文字削除は、VBAの文字列処理の中でも基本的でありながら、実務で非常によく使う処理です。ここを正しく理解しておくと、末尾の整形だけでなく、抽出・分割・比較といった他の処理にも応用しやすくなります。
まずは、単純な1セル処理から試してみてください。
そのうえで、一覧処理や関数化まで広げていくと、実務で使える形としてしっかり身につきます。