|
楼主 |
发表于 2015-10-8 11:09
|
显示全部楼层
代码及注释。
- Option Base 1
- Sub test()
- Dim ar, dic, i&, k1&, k2&, k3&, k4&, m&, t$, tr, tms#
- tms = Timer
-
- [d1].CurrentRegion.Offset(1) = "" '清空输出区域
-
- m1 = [a65536].End(3).Row - 1 '获取A列最大行数m1
- ar = [a2].Resize(m1) '读取A列数据到数组ar
- m2 = [b65536].End(3).Row - 1 '获取B列最大行数m2
- ReDim br1(m1, 1), br2(m2, 1), br3(m1, 1), br4(m1 + m2, 1)
- '建立存放结果的数组br1、br2、br3、br4 (不超过可能个数)
- Set dic = CreateObject("Scripting.Dictionary") '建立字典dic
- For i = 1 To m1 '遍历A列数据
- t = ar(i, 1): If Len(t) Then If Not dic.Exists(t) Then dic(t) = t: k4 = k4 + 1: br4(k4, 1) = t
- '如不为空则检查是否已经存入字典、并将第1次结果存入br4 即【A+B合成】(A or B)
- Next
-
- ar = [b2].Resize(m2) '读取B列数据到数组ar (数组ar重复使用)
- For i = 1 To m2 '遍历B列数据
- t = ar(i, 1)
- If Len(t) Then '如不为空
- If dic.Exists(t) Then '如字典存在 则A1B1 即AB都有
- If Len(dic(t)) Then dic(t) = "": k3 = k3 + 1: br3(k3, 1) = t
- '如字典Item结果不为空则属于第1次出现,标记Item为空 并记入br3【AB都有】
- '如Item为空 则为标记已重复 不用统计【重要技巧】
- Else '如字典不存在 A0B1 即B有A没有
- k2 = k2 + 1: br2(k2, 1) = t '记入br2【B有A没有】
- k4 = k4 + 1: br4(k4, 1) = t '记入br4【A+B合成】(A or B)
- dic(t) = "" '该值Item标记为空 防止重复统计【重要技巧】
- End If
- End If
- Next
- '以上检查完毕,但A有B没有结果只存在于字典中,还需要检查输出
- tr = dic.items '提取字典中结果(A有B有时为空、B有时为空、仅A有B没有才是结果)
- For i = 0 To UBound(tr) '遍历字典结果
- t = tr(i): If Len(t) Then k1 = k1 + 1: br1(k1, 1) = t
- '如果Item不为空才是仅A有B没有的正确结果 输出到br1
- Next
-
- '以下为输出
- [d2].Resize(k1) = br1
- [e2].Resize(k2) = br2
- [f2].Resize(k3) = br3
- [g2].Resize(k4) = br4
- MsgBox Format(Timer - tms, "0.00s")
- End Sub
复制代码 |
|