关于本文
本文是通过利用生成式 AI 的自动生成流程创建的。在确认了 Microsoft Learn 的 Dictionary object 官方资料后,重点关注的不是重复统计本身,而是如何在实际业务中统一前后空格和大小写的“键标准化”。验证状态:📘 已通过微软官方确认・未在 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 是不同的键。
去除前后空格
将键的生成集中到一处。
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 单元格区域中使用时
面对大量数据时,与其逐个单元格读取,不如先将数据获取到数组中再进行标准化和统计会更容易处理。
此外,与其修改并标准化原始数据,不如单独为 Dictionary 创建键,这样就能在保留原始数据的同时进行检查。
总结
在重复判断中,首先要确定“什么算作相同”
可以使用 Trim 去除前后空格
可以通过 CompareMode 决定大小写的比较策略
过度标准化存在将原本不同的值视作相同的风险
将 NormalizeKey 集中到一个函数中可以更方便地管理业务规则
