ねらい:どんな元データでも「まずはここを通す」クリーニングの型を持つ
現場のExcelって、きれいなデータの方が少ないですよね。
全角・半角が混ざっている、前後にスペースが付いている、「-」が3種類混在している、空行が紛れている…。
クリーニングテンプレのゴールは、こうです。
「どんな元データでも、まずこのマクロを通せば“JOINや集計に耐えられる状態”まで整う」という“前処理の型”を作ることです。
ここでは、実務でよくあるクリーニングを、再利用しやすい部品としてまとめていきます。
全体設計:1シート単位の「クリーニングパイプライン」を作る
クリーニングの考え方
クリーニングは、バラバラにやると抜け漏れが出ます。
なので、「この順番で流す」というパイプラインにしてしまうのがコツです。
例えば、こんな流れです。
不要な空行を削除する
前後スペースを削る(Trim)
全角・半角を統一する
記号やハイフンを統一する
NULL相当(”NULL”、”-” など)を空白に揃える
これを「1シートに対して一気にかける」テンプレを作っておき、
顧客マスタ、商品マスタ、取引データなど、どのシートにも同じ型で適用できるようにします。
コアとなる「シートクリーニングSub」のイメージ
標準モジュールに、こんなSubを用意します。
Sub CleanCustomerSheet()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Customer")
RemoveEmptyRows ws, 1 ' A列を基準に空行削除
TrimRange ws, "A:C" ' A〜C列の前後スペース削除
NormalizeHyphen ws, "A:A" ' 顧客コードのハイフン統一
NormalizeNullLike ws, "B:C" ' 顧客名・備考の「NULL」「-」などを空白に
End Sub
VBポイントは、「やりたいことごとに小さなSub/Functionに分ける」ことです。
RemoveEmptyRows、TrimRange、NormalizeHyphen、NormalizeNullLike が“クリーニング部品”になります。
コア部品1:空行削除テンプレ
基本の「基準列を見て空行を削除する」Sub
一番よく使うのが、「A列が空ならその行を削除」のようなパターンです。
Sub RemoveEmptyRows(ByVal ws As Worksheet, ByVal keyCol As Long)
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, keyCol).End(xlUp).Row
Dim i As Long
For i = lastRow To 2 Step -1
If Trim(CStr(ws.Cells(i, keyCol).Value)) = "" Then
ws.Rows(i).Delete
End If
Next i
End Sub
VB初心者向けにポイントをかみ砕きます。
下から上に向かってループしているのは、「削除で行が詰まる」影響を避けるためです。
keyCol で「どの列を基準にするか」を渡せるようにしておくと、再利用性が高くなります。
Trim で前後スペースを削ってから空かどうかを判定することで、「スペースだけの行」も削除できます。
呼び出し側では、列番号を渡します。
RemoveEmptyRows ThisWorkbook.Worksheets("Customer"), 1 ' A列基準
VB列記号で渡したい場合は、前に作った ColToNumber と組み合わせてもOKです。
コア部品2:前後スペース削除(Trim)テンプレ
指定範囲の全セルに Trim をかけるSub
文字列の前後にスペースが付いていると、JOINや比較で痛い目を見ます。
これを一気に削るテンプレです。
Sub TrimRange(ByVal ws As Worksheet, ByVal addr As String)
Dim rng As Range
Set rng = ws.Range(addr)
Dim c As Range
For Each c In rng.Cells
If Not IsEmpty(c.Value) Then
c.Value = Trim(CStr(c.Value))
End If
Next c
End Sub
VBここでのポイントは、「必ず文字列に変換してから Trim する」ことです。
数値や日付も一応 Trim できますが、CStr を挟んでおくと型の扱いが安定します。
呼び出し側では、こう書きます。
TrimRange ws, "A:C" ' A〜C列の前後スペース削除
TrimRange ws, "E:E" ' E列だけ削除
VBコア部品3:全角・半角・ハイフンなどの統一テンプレ
ハイフンを統一する関数
顧客コードや郵便番号でよくあるのが、「-」「―」「ー」「-」が混ざっている問題です。
これを全部「-」に揃える関数を作ります。
Function NormalizeHyphenText(ByVal s As String) As String
Dim result As String
result = s
result = Replace(result, "-", "-")
result = Replace(result, "―", "-")
result = Replace(result, "ー", "-")
result = Replace(result, "‐", "-")
NormalizeHyphenText = result
End Function
VBこれを列全体に適用するSubがこちらです。
Sub NormalizeHyphen(ByVal ws As Worksheet, ByVal addr As String)
Dim rng As Range
Set rng = ws.Range(addr)
Dim c As Range
For Each c In rng.Cells
If Not IsEmpty(c.Value) Then
c.Value = NormalizeHyphenText(CStr(c.Value))
End If
Next c
End Sub
VB顧客コード列に対しては、こう呼びます。
NormalizeHyphen ws, "A:A"
VB全角英数字を半角にする(簡易版)
本格的な全角→半角変換は少し長くなりますが、よく使う「英数字だけ半角にしたい」程度なら、簡易版でも十分です。
Function ToHalfWidthAscii(ByVal s As String) As String
Dim i As Long
Dim ch As String
Dim code As Long
Dim result As String
result = ""
For i = 1 To Len(s)
ch = Mid$(s, i, 1)
code = AscW(ch)
If code >= &HFF10 And code <= &HFF19 Then
result = result & ChrW(code - &HFEE0) ' 全角数字
ElseIf code >= &HFF21 And code <= &HFF3A Then
result = result & ChrW(code - &HFEE0) ' 全角大文字
ElseIf code >= &HFF41 And code <= &HFF5A Then
result = result & ChrW(code - &HFEE0) ' 全角小文字
Else
result = result & ch
End If
Next i
ToHalfWidthAscii = result
End Function
VBこれも列全体に適用するSubを用意します。
Sub NormalizeAscii(ByVal ws As Worksheet, ByVal addr As String)
Dim rng As Range
Set rng = ws.Range(addr)
Dim c As Range
For Each c In rng.Cells
If Not IsEmpty(c.Value) Then
c.Value = ToHalfWidthAscii(CStr(c.Value))
End If
Next c
End Sub
VB顧客コードや郵便番号など、「英数字は半角に揃えたい」列に対して使います。
コア部品4:「NULLっぽい値」を空白に揃えるテンプレ
「NULL」「-」「N/A」などを空白にする関数
実務データには、「空のつもりで ‘NULL’ や ‘-‘ を入れている」ケースがよくあります。
これを全部「本当の空白」に揃えておくと、後の処理が楽になります。
Function NormalizeNullLikeText(ByVal s As String) As String
Dim t As String
t = UCase$(Trim$(s))
Select Case t
Case "", "NULL", "NULL", "-", "-", "N/A", "N/A"
NormalizeNullLikeText = ""
Case Else
NormalizeNullLikeText = s
End Select
End Function
VBこれを範囲に適用するSubです。
Sub NormalizeNullLike(ByVal ws As Worksheet, ByVal addr As String)
Dim rng As Range
Set rng = ws.Range(addr)
Dim c As Range
For Each c In rng.Cells
If Not IsEmpty(c.Value) Then
c.Value = NormalizeNullLikeText(CStr(c.Value))
End If
Next c
End Sub
VB顧客名や備考など、「空白扱いしたい値が紛れている」列に対して使います。
例題:顧客マスタをクリーニングしてからJOINに回す
想定する流れ
Customer シートを、JOINや集計に使う前に、次のように整えます。
A列(顧客コード)を基準に空行削除
A〜C列の前後スペース削除
A列のハイフンと全角英数字を統一
B〜C列の「NULL」「-」などを空白に
コード例
Sub CleanCustomerSheet()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Customer")
RemoveEmptyRows ws, 1 ' A列基準で空行削除
TrimRange ws, "A:C" ' A〜C列の前後スペース削除
NormalizeHyphen ws, "A:A" ' 顧客コードのハイフン統一
NormalizeAscii ws, "A:A" ' 顧客コードの全角英数字を半角に
NormalizeNullLike ws, "B:C" ' 顧客名・備考のNULLっぽい値を空白に
End Sub
VBJOINマクロの入口では、こう書きます。
Sub JoinCustomer()
Const MODULE_NAME As String = "JoinCustomer"
On Error GoTo ErrHandler
CleanCustomerSheet
' ここからJOIN本処理
Exit Sub
ErrHandler:
LogError MODULE_NAME, "MAIN", Err
End Sub
VB「JOINの前に必ず Clean○○ を通す」というルールを決めておくと、
元データの揺れに悩まされる時間が一気に減ります。
重要ポイントの深掘り:クリーニングテンプレを“現場で回る型”にする
クリーニングは「一度に全部」ではなく「部品を組み合わせる」
いきなり完璧なクリーニングを目指すと、終わりません。
大事なのは、「よく出るパターンを小さな部品にしておく」ことです。
空行削除
Trim
ハイフン統一
全角→半角
NULLっぽい値の統一
このあたりを部品化しておけば、「このシートにはどの部品を組み合わせるか」を考えるだけで済みます。
「どの列に何をかけるか」をコメントで残す
CleanCustomerSheet のようなSubには、できるだけ「なぜそれをしているか」をコメントで残しておくと、未来の自分が助かります。
顧客コードはJOINキーなので、ハイフンと全角半角を統一
顧客名・備考はNULLっぽい値を空白にしておく
こういう“意図”を書いておくと、「このクリーニングを外していいかどうか」の判断がしやすくなります。
クリーニング後に「ざっくりチェック」する癖をつける
クリーニングは便利ですが、「やりすぎて必要な情報まで消してしまう」リスクもあります。
なので、クリーニング後に簡単なチェックを入れておくと安心です。
行数が極端に減っていないか
キー列に空白が増えていないか
想定外の文字が残っていないか
これは、簡単な集計やフィルタで目視確認するだけでも十分です。
まとめ:クリーニングテンプレは「全部の前処理をここに集める」ための型
今回のクリーニングテンプレを一言でまとめると、こうです。
シートごとに Clean○○Sub を用意し、その中で
RemoveEmptyRows
TrimRange
NormalizeHyphen / NormalizeAscii
NormalizeNullLike
といった部品を組み合わせる。
JOINや集計などの本処理の前に、必ず Clean○○ を通す——これを“お約束”にする。
これを一度仕組みとして作ってしまえば、
「この元データ、また変なスペース入ってる…」みたいなイライラが、かなり減ります。

