|
原帖由 lomen222 于 2011-6-14 18:10 发表
理由?erp中存在数据因为已经匹配,为了管理方便,把all item里面可以clear的data,清理至cleared item,剩下的就是open item。
其实这个东西我已早就知道是用公式出不来的,就算出来了,机器也承受不起。把这个贴 ...
楼主你好。
第一步,用vba做了个一对一注释的按钮。
使用字典核对功能,遍历,并反复遍历直至结果无变化时停止。
顺便做了个清除注释,恢复数据原状的按钮。- Sub test()
- Dim d
- Set d = CreateObject("Scripting.Dictionary") '定义字典
-
- n = [b1].End(4).Row - 1
- [a1] = "No"
- [a2].Resize(n, 1) = "=row()-1"
- [a2].Resize(n, 1).Value = [a2].Resize(n, 1).Value 'A列中写入自然序号
- [c1] = "注释"
- a = [a2].Resize(n, 3) '读入数据到数组a中。
-
- Chk: '反复检查核对。
- For i = 1 To n
- If a(i, 3) = "" And Not d.exists(a(i, 2)) Then '如果注释为空,且到目前为止该值尚未加入字典时(即无重复值时)
- If Not d.exists(-a(i, 2)) Then '并且如果字典中到目前为止也没有相反数存在时,
- d.Add a(i, 2), i '符合上述条件则可加入字典作为新元素,并且该字典键值注释为行号值。
- Else '如果已知字典中已经存在相反数,则:
- c = c + 1 '注释序号+1
- a(i, 3) = "1对1#" & c '当前值添加1对1注释
- a(d(-a(i, 2)), 3) = "1对1#" & c '已存在的相反数也添加1对1注释
- d.Remove (-a(i, 2)) '从字典中移除该相反数
- End If
- End If
- Next
- If k < c Then k = c: GoTo Chk '检查比对成功注释次数是否有增加,如果有增加则可能有相同数未全部检查,回到前面再次遍历
- [a2].Resize(n, 3) = a '如果比对次数没有增加,则表明上一次检查已经无新增1对1成功配对,可以结束遍历检查。
-
- [a1].CurrentRegion.Sort Key1:=[c2], Header:=xlYes '按注释顺序排序。
- End Sub
复制代码 请看附件效果。 |
|