和風スパゲティのレシピ

日本語でコーディングするExcelVBA

文字列の右側(末尾)をn文字削除する

文字列の右側をn文字削除するコードを解説します。

基本の書き方

右から3文字消した文字列 = Left(元の文字列, Len(元の文字列) - 3)

実行サンプル

商品名 = "愛媛みかん"
産地 = Left(商品名, Len(商品名) - 3)
MsgBox 産地 ' ← 「愛媛」が表示されます。

解説

解説がなくても読めそうですが一応。

右から3文字消す = 左から(文字数-3)文字取ってくる

です。


ちなみに元の文字列が2文字しかない場合はエラーで止まってしまいますので、
それを回避したい場合は

If Len(商品名) >= 3 Then 
    産地 = Left(商品名, Len(商品名) - 3)
Else
    産地 = ""
End If

のように、最初に文字数を調べてIf文で分岐してください。

Len関数の恐ろしい罠

1000000を100万円にするような、「数字の右側を削除したい」場合は、
危険な落とし穴がありますのでご注意ください。

Len関数は文字列以外の変数を渡すと変数が使っているメモリの大きさを返す
というとんでもない仕様があります。


特に数値(Long)を渡したときは何を渡しても4を返すクソ関数化します。


例えば、

Dim 金額 As Long
金額 = 1000000
表示金額 = Left(金額, Len(金額) - 4) & "万円"

このコードは一見「右側の4桁を切り取って単位を(万円)にしている」ように見えますが、実際はLen(金額)が7文字ではなく4バイトを返すため、1文無しになってしまいます。


これを防ぐには、

Dim 金額 As String ' ←数字を入れるつもりでも文字列で宣言
金額 = 1000000
表示金額 = Left(金額, Len(金額) - 4) & "万円"

こうやって変数を文字列で宣言する必要がありますのでご注意ください。

※ Len(Range("A1")) のように、セルを渡すのは大丈夫です。
A1セルに数値が入っていたとしても、ちゃんとその文字数をカウントしてくれます。


あるいは

表示金額 = WorksheetFunction.Round(金額 / 10000, 0) & "万円"

と、数字には素直に「割り算して四捨五入」をやってもいいですし、
 

表示金額 = Left(金額, Len(金額 & "") - 4) & "万円"

と、""をくっつけてLenさんが見に来る前に文字列にしてしまうなんて言う裏技も使えます。


いずれにせよ、Len関数は純粋な数値には使えないことは覚えておきましょう。

おまけ:文字列処理は関数化しておくと便利

文字列を操作するコード全般に言えることなのですが、
式中に「元の文字列」が何度も登場するため、コードが汚くなりやすいです。

例えば「Cells(R + i, C)」のセル値から右3文字を消したいときには、

Cells(R + i, C) = Left(Cells(R + i, C), Len(Cells(R + i, C)) - 3)

みたいになって、ぱっと見なにやってるか分からないコードになります。


ということで、文字列処理を多くやる人は、↓のように汎用関数を作ってみましょう。

' 目的:汎用関数を作って↑のコードをこう書けるようにしたい
Cells(R + i, C) = 右からn文字削除(Cells(R + i, C), 3)

' 用意する汎用関数
Function 右からn文字削除(ByVal 元の文字列 As String, n As Long) As String
    If Len(元の文字列) - n > 0 Then
        右からn文字削除 = Left(元の文字列, Len(元の文字列) - n)
    End If
End Function

' 使用例
MsgBox 右からn文字削除("和歌山みかん",3) ' ←和歌山が表示されます。

劇的に読みやすくなっていますよね?
コピペでも動きますので、持って帰って使ってみてください。


関数と聞くと難しく感じるかもしれませんが、コードを見ればわかる通り、
中身は上で紹介したコードそのままです。

文字列操作は関数化が楽ちんで、その割に関数化の効果が大きいので、
関数づくりの練習にぴったりだと思います。


Functionプロシージャ勉強してみたいけど難しそうだな~って思っている方は、
ちょうどいいのでこの機会に始めて見るといいかもしれません。



今回の「右からn文字削除」や、
他には「文字から文字までを取ってくる(例えばカッコの中身)」など、
私が作成した文字列操作の汎用関数集が下記のページにあります。

関数作成の参考にするなり、中身を見ないでコピーして使うなり、
ご自由にお持ち帰りください。

www.limecode.jp