8/21/2018

Excel。マクロ33。セル内の不要な空白を消すにはどのようにしたらいいの?【Trim】

Excel。マクロ33。セル内の不要な空白を消すにはどのようにしたらいいの?

<Excel VBA:Trim & Replace>

大量なデータを手入力するということは、あまりないとは思いますが、
大量のデータをインポートしてくるとか、
csvファイルを開いて使っている場合、
データの整合性というか、ちゃんとしたデータでないと、
資料化するにあたり精度が低くなってしまう恐れがあります。

例えば、空白が混じっているとダメなので、
削除したいケースなどがその一例ですね。

少ないデータならば、自力で修正したほうが早いかもしれませんが、
大量なデータとなると時間がかかって非効率ですね。

そこで、Excel VBAでプログラムを作ってみようと思います。

次のデータがあります。

【ExcelのTRIM関数とExcel VBAのTrim関数はちょっと違う】

空白を削除するとなると、Excelの関数では、
TRIM関数というのが頭に思い浮かびます。

Excel VBAにも、Trim関数がありますので、
それを使ってC列を処理してみます。

Sub 空白削除のTrim()
    Dim i As Long
    For i = 2 To 11
        Cells(i, "C").Value = Trim(Cells(i, "C"))
    Next
End Sub

実行してみましょう。

Trimを使うと、
文字列の前後の空白は、全角・半角関係なく削除してくれるのですが、

残念ながら、文字列の中の空白までは、取り除いてくれません。

確かに、TRIM関数も同じ動きをするので、
文字列の中の空白は残ってしまうというのは、
理解しやすいのですが、
もう1つ、ExcelのTRIM関数とExcel VBAのTrim関数は違いがあるのです。

それは、ExcelのTRIM関数は、
文字列の中の空白が2つ以上の場合は、
不要な空白を削除してくれて、1つにしてくれるのですが、
Excel VBAのTrim関数は、全く処理を行いません。

試しに、列を追加して、D2に
=TRIM(B2)
という数式を作って、数式をコピーしてみましょう。

B4の文字列は、半角空白が2文字になっていますので、
TRIM関数を使うと、半角空白が1文字になっていますよね。

このように、違いがありますので、注意が必要です。

では、空白を全部削除したい場合はどのようにしたらいいのでしょうか?

【Excelでは、SUBSTITUTE関数だけど、Replace関数を使う】

挿入した列を削除して、表を元に戻しておきます。
Excel VBAでは、Replace関数で、空白を削除します。

ExcelのREPLACE関数は、どちらかというと、置換というイメージですね。

では、Excel VBAのプログラム文を確認してみましょう。

Sub 空白削除のReplace()
    Dim i As Long
    For i = 2 To 11
        Cells(i, "D").Value = Replace(Cells(i, "D"), " ", "")
        Cells(i, "D").Value = Replace(Cells(i, "D"), " ", "")
    Next
End Sub

実行してみます。

このように、空白を削除することができましたね。

Cells(i, "D").Value = Replace(Cells(i, "D"), " ", "")
Replace関数は置換しますので、
半角空白を文字なしに置換するという構文になっています。

全角も同様に作ることで、空白を削除することができました。

ただ、ExcelのTRIM関数と同じように、文字列の前後は削除して、
文字列の中の空白は1つだけ残してほしい場合は、
Formulaメソッドを使うのがいいのではと考えます。

Sub 空白削除のTRIM関数()
    Dim i As Long
    For i = 2 To 11
        Cells(i, "F").Formula = "=trim(b" & i & ")"
        Cells(i, "F") = Cells(i, "F")
    Next
End Sub

こんな感じでどうでしょうか?

このように、空白を削除する問題は、
Excelでも、Excel VBAでも悩ましいもののひとつですね。