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でも悩ましいもののひとつですね。