この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。Microsoft LearnのDictionary object公式資料を確認し、重複集計そのものではなく、前後空白や大文字小文字をどうそろえるかという実務上の「キー正規化」に焦点を当てています。検証ステータス:📘 Microsoft公式確認済み・Excel実機未確認
Excelの重複チェックでは、見た目がほぼ同じデータが別物として数えられることがあります。
たとえば、
ABC abc ABC
末尾空白や大文字小文字の違いを無視したいなら、Dictionaryへ入れる前に「何を同じとみなすか」を決めてキーを正規化します。
まず失敗しやすい例
そのままDictionaryへ入れると、値の違いがキーの違いになります。
Sub CountRawKeys()
Dim d As Object
Dim v As Variant
Set d = CreateObject("Scripting.Dictionary")
For Each v In Array("ABC", "abc", "ABC ")
If d.Exists(CStr(v)) Then
d(CStr(v)) = d(CStr(v)) + 1
Else
d.Add CStr(v), 1
End If
Next v
For Each v In d.Keys
Debug.Print "[" & v & "]", d(v)
Next v
End Sub
この場合、末尾空白付き ABC は別キーです。
前後空白を除く
キー生成を1か所へまとめます。
Private Function NormalizeKey(ByVal value As Variant) As String
' 前後の半角スペースを取り除いて文字列化する
NormalizeKey = Trim$(CStr(value))
End Function
集計側では、
Dim key As String key = NormalizeKey(v)
としてからDictionaryへ入れます。
大文字小文字を同じ扱いにする
CompareMode を vbTextCompare にします。
Set d = CreateObject("Scripting.Dictionary")
' データを追加する前に設定する
d.CompareMode = vbTextCompare
これで ABC と abc を同じキーとして比較できます。
実務向けの最小形
Sub CountNormalizedKeys()
Dim d As Object
Dim v As Variant
Dim key As String
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare
For Each v In Array("ABC", "abc", "ABC ", "XYZ")
key = Trim$(CStr(v))
' 空白だけのデータを数えない例
If Len(key) > 0 Then
If d.Exists(key) Then
d(key) = d(key) + 1
Else
d.Add key, 1
End If
End If
Next v
For Each v In d.Keys
Debug.Print v, d(v)
Next v
End Sub
この例では ABC 系が3件としてまとまります。
正規化は「強くすれば良い」わけではない
たとえば社員コードで abc と ABC が本当に別コードなら、大文字小文字を無視してはいけません。
同様に、
00123と123全角数字と半角数字
ハイフン有り/無し
スペース有り/無し
を同一視してよいかは業務ルール次第です。
flowchart LR A[元データ] --> B[業務ルールを決める] B --> C[NormalizeKey] C --> D[DictionaryのKey] D --> E[重複件数]
仕事でどう使えるか
顧客コードの重複
メールアドレスの前後空白除去
部署名の表記揺れ
CSV取込前チェック
マスタ突合
申請データの重複検査
では、Dictionaryの書き方よりキーをどう作るかの方が品質に効きます。
Excel範囲で使うとき
大量データではセルを1つずつ読むより、一度配列へ取得してから正規化・集計する方が扱いやすくなります。
また、元データを書き換えて正規化するのではなく、Dictionary用のキーだけ別に作れば、元データを保持したまま検査できます。
まとめ
重複判定では「何を同じとするか」を先に決める
Trimで前後空白を除ける
CompareModeで大文字小文字の比較方針を決められる
正規化しすぎると本来別の値を同一視する危険がある
NormalizeKeyを1関数にまとめると実務ルールを管理しやすい
