こんにちは、ぐーです!
システムからCSVをダウンロードした際や、Web上のデータをコピーした際、このような「扱いにくいデータ」に遭遇したことはありませんか?
「田中 太郎」
「佐藤 花子」
名前の間のスペースが、全角・半角混在だったり、あるいは連続していたり……。
これらは見た目が不揃いなだけでなく、VLOOKUP関数などでデータを照合する際に「一致なし(#N/A)」エラーを引き起こす大きな要因となります。
本日は、この「バラバラな複数の空白」を「半角スペース1つ」へとスマートに整えるVBAテクニックをご紹介します。
多くの人が陥る「VBAの罠」
「空白削除なら Trim 関数を使えばいいのでは?」と思われた方、非常に鋭い視点をお持ちです。
しかし、VBA標準のTrim関数は「文字の前後」の空白しか削除してくれません。文字の「間」にある余分なスペースは、そのまま残ってしまうのです。
- ExcelのTRIM関数: 文字間の余分なスペースも削除して1つにまとめる(非常に優秀!)
- VBAのTrim関数: 前後のスペースしか削除しない(文字の間には干渉しない)
この違いを理解することが重要です。
そこで今回は、「VBAの中から、優秀なExcelのTRIM関数を呼び出して使う」という、効率的なテクニックを活用します。
コピペで使えるコード
A列に入っているデータを修正し、B列に整形した状態で書き出すマクロです。
Sub CleanSpaces()
' 変数の宣言
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim strTarget As String
' 操作するシートを指定(現在はアクティブなシート)
Set ws = ActiveSheet
' データの最終行を取得(A列のデータがある最後の行を探す)
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
' 2行目から最終行まで繰り返し処理
For i = 2 To lastRow
' A列(1列目)の値を取得
strTarget = ws.Cells(i, 1).Value
' 【重要】ExcelのTRIM関数を使って、連続する空白を1つにまとめる
ws.Cells(i, 2).Value = Application.WorksheetFunction.Trim(strTarget)
Next i
MsgBox "データのクレンジングが完了しました!", vbInformation
End Sub
このコードのポイント
ポイントはApplication.WorksheetFunction.Trimです。
これを使うことで、以下の処理が自動的に実行されます。
- 文字の先頭と末尾にある空白を完全に削除。
- 文字の間にある連続した空白(全角・半角問わず)を「半角スペース1つ」に置換。
例えば「 田中 太郎 」というデータがあれば、「田中 太郎」という最も美しい形式に整えてくれるのです。
正規表現(RegExp)を用いる高度な方法もありますが、現場においては「誰もが理解しやすく、メンテナンスしやすいコード」こそが最適解となります。まずはこの方法からマスターして、実務に役立てていただければと思います。
これからも一緒に、少しずつ「楽」を積み重ねていきましょう!
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

コメント