实例需求:A列为档号数据,由多段数字组成,使用减号作为分隔符,最后一段数字代表页数,注意页数是不连续的,倒数第二段数字是代表档案中的第几本,每个档案都是从1开始。现在需要在B列创建“卷内顺序号”,按照顺序递增,如果A列中最后一段数字(页数)相同,那么序号也相同(如黄色区域所示)。最终效果如下图所示。
示例代码如下。
Sub demo()
arrData = [a1].CurrentRegion.Value
Set dic = CreateObject("scripting.dictionary")
strKey = ""
For i = 2 To UBound(arrData)
strFile = Left(arrData(i, 1), Len(arrData(i, 1)) - 3)
If strKey <> strFile Then
dic.RemoveAll
strKey = strFile
End If
dic(arrData(i, 1)) = ""
arrData(i, 2) = "'" & Format(dic.Count, "00")
Next
[a1].CurrentRegion.Value = arrData
Set dic = Nothing
End Sub
【代码解析】
第2行代码将数据区域读取到数组中。
第3行代码创建字典对象。
第4行代码创建变量用于保存当前档案号(去除后三位数字)。
第5~13行代码序号处理数据。
第6行代码去除档案号的后三位数字,下文简称为档案号标识。
第7行代码判断当前档案号标识是否与strKey
一致,如果不一致,说明当前数据行为一个新档案,第8行代码清空字典对象,第9行代码将档案号标识保存到变量strKey
中。
否则,第11行代码在字典对象中添加键值对。
第12行代码将“卷内顺序号”数据写入数组中,此处利用字典对象的去重功能,dic.Count
获取字典对象中的键值对的个数,即为“卷内顺序号”。
第14行代码将数组中的数据写入单元格区域中。
第15行代码释放对象变量占用的系统资源。