|
本帖最后由 feilanga 于 2022-2-23 09:46 编辑
翻译了一下,共同学习- Sub test()
- Dim d, arr(), st, brr() '定义变量定义数组(可不定义)
- Set d = CreateObject("Scripting.Dictionary") '声明后期引用字典
- arr = Sheet1.Range("a1").CurrentRegion 'sheet1表以单元格A1为顶点的连续区域装入数组arr
- Sheet2.Range("a2:d65536").ClearContents '结果区清空
- For i = 3 To UBound(arr) '去除标题行,从第3行开始循环到最大行
- If arr(i, 1) <> "" And arr(i, 2) <> "" Then '如果材料名称和规格型号不为空
- st = (arr(i, 1) & "|" & arr(i, 2)) '多关键字用符号|连接 材料名称 规格型号
- If Not d.exists(st) Then '如果字典中没有这个关键字(也就是关键字第一次存入字典的时候)
- k = k + 1 '计数器,存入1次记录1次,这里用作记录关键字在结果数组中的行号
- d(st) = k '关键字存入字典的keys 行号K存入字典的items(字典有2个存储位置,分别是关键字keys,和对应的值items)
- ReDim Preserve brr(1 To 4, 1 To k) '定义结果数组brr,大小为(4列,K行)
- brr(1, k) = arr(i, 1) '材料名称
- brr(2, k) = arr(i, 2) '规格型号
- brr(3, k) = arr(i, 3) '单位
- brr(4, k) = arr(i, 4) '数量
- Else '第二次遇到相同关键字的时候 字典特性是遇到相同关键字会合并,所以字典用来去重.
- brr(4, d(st)) = brr(4, d(st)) + arr(i, 4) '遇到相同关键字,关键字合并,items中的值累加
- '数量=字典上次存在items里的数量+本次数量
- End If
- End If
- Next
- Sheet2.Range("a2").Resize(k, 4) = Application.Transpose(brr)
- '结果数组brr通过转置函数输出到以汇总表A2为顶点扩展K行 4列的单元格区域 原来的brr(4列,k行)转置函数转为brr(k行,4列)
- MsgBox "结果已输出在sheet1中" '弹窗提示
- End Sub
复制代码 |
|