|

楼主 |
发表于 2014-9-5 14:13
|
显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
实例二,这个例子较为复杂了
一词典多列、多表去重输出
Sub 遍历多表固定列不重复wzsy2_mrf()
Dim sht As Worksheet, sh As Worksheet, arr, j&, k&, rend&, mkey
Set sh = Sheets("汇总")
ReDim brr(1 To 70000, 1 To Sheets.Count + 1) '定义目标数组brr
sh.Range("A1").CurrentRegion.ClearContents '清除内容
Set d = CreateObject("scripting.dictionary")
For Each sht In Worksheets '遍历所有工作表
With sht
rend = .Cells(.Rows.Count, 1).End(3).Row
If .Name <> sh.Name And rend > 1 Then '不等于汇总工作表及不是空表时!
k = k + 1
arr = .Range("A2:A" & rend)
brr(1, k) = "只在" & .Name & "中出现"
For j = 1 To UBound(arr)
If arr(j, 1) <> "" Then
If Not d.exists(arr(j, 1) & "") Then
d(arr(j, 1) & "") = k & "~~" '将关键字arr(j,1) 对应的项目标志对应经历有表的索引,加上"~"符是必要的,目的是将使"1"与"13"不存在包含关系。
Else
If InStr(d(arr(j, 1) & ""), k & "~~") = 0 Then d(arr(j, 1) & "") = d(arr(j, 1) & "") & "|" & k & "~~" '将经历过的表的索引都记录下来
End If
End If
Next
End If
End With
Next
ReDim arr(1 To k + 2) '总共经历了k张表,因为每张表的单独出现的关键字个数不一样,所以将arr重新定义为brr每列长度的控制数组,这时原arr数组已经没有用了
For j = 1 To k + 2
arr(j) = 2 '从第二行开始
Next
brr(1, k + 1) = "各表都有" '总共经历k张表,目标数组有k+2列
brr(1, k + 2) = "全部"
For Each mkey In d.keys
If UBound(Split(d(mkey), "|")) = 0 Then '当只有一组数的时候
j = Val(Left(d(mkey), Len(d(mkey)) - 2))
brr(arr(j), j) = mkey
arr(j) = arr(j) + 1
ElseIf UBound(Split(d(mkey), "|")) = k - 1 Then '全部经历的时候
brr(arr(k + 1), k + 1) = mkey
arr(k + 1) = arr(k + 1) + 1
End If
brr(arr(k + 2), k + 2) = mkey '全部数
arr(k + 2) = arr(k + 2) + 1
Next
sh.Range("A1").Resize(d.Count + 1, UBound(brr, 2)) = brr
End Sub
|
评分
-
2
查看全部评分
-
|