|
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
- Sub ykcbf()
- ' 定义变量
- Dim arr, brr(1 To 10000, 1 To 14), d
- ' 创建字典对象
- Set d = CreateObject("scripting.dictionary")
- ' 设置目标工作表
- Set Sh = Sheet9
- ' 遍历所有工作表
- For Each sht In Sheets
- ' 排除目标工作表
- If sht.Name <> Sh.Name Then
- ' 获取当前工作表的数据范围
- arr = sht.UsedRange
- ' 遍历数据范围的行
- For i = 2 To UBound(arr)
- ' 将第4列和第5列的值拼接为键,将第3列的值作为子键
- s = arr(i, 4) & "|" & arr(i, 5)
- ss = arr(i, 3)
- ' 判断第2列是否为空
- If arr(i, 2) <> Empty Then
- ' 如果键不存在,则创建新的字典对象
- If Not d.exists(s) Then Set d(s) = CreateObject("Scripting.Dictionary")
- ' 将第7列的值累加到对应的子键上
- d(s)(ss) = d(s)(ss) + arr(i, 7)
- End If
- Next
- End If
- Next
- ' 将字典中的键值对复制到二维数组中
- For Each k In d.keys
- m = m + 1
- brr(m, 1) = m
- brr(m, 2) = Split(k, "|")(0)
- brr(m, 3) = Split(k, "|")(1)
- Next
- ' 在目标工作表上进行操作
- With Sh
- ' 清除偏移量为5的范围内的内容
- .UsedRange.Offset(5).Clear
- ' 将二维数组的值复制到指定范围
- .[a6].Resize(m, 3) = brr
- ' 设置指定范围的边框样式
- .[a6].Resize(m, 14).Borders.LineStyle = 1
- ' 获取最后一行的行号
- r = .Cells(.Rows.Count, "a").End(3).Row
- ' 获取数据范围(从第3行开始)的值
- arr = .[a3].Resize(r - 2, 14)
- ' 遍历数据范围的行
- For i = 4 To UBound(arr)
- ' 将第2列和第3列的值拼接为键
- s = arr(i, 2) & "|" & arr(i, 3)
- Sum = 0
- ' 遍历第5列到第12列
- For j = 5 To 12
- ' 将字典中对应键和子键的值赋给数据范围的对应位置
- ss = arr(2, j)
- arr(i, j) = d(s)(ss)
- ' 累加求和
- Sum = Sum + arr(i, j)
- Next
- ' 将求和结果赋给第13列
- arr(i, 13) = Sum
- Next
- ' 将修改后的数组值赋回数据范围
- With .[a3].Resize(r - 5, 14)
- .Value = arr
- ' 设置边框样式
- .Borders.LineStyle = 1
- ' 水平居中对齐
- .HorizontalAlignment = xlCenter
- ' 垂直居中对齐
- .VerticalAlignment = xlCenter
- ' 自动调整列宽
- .EntireColumn.AutoFit
- End With
- End With
- End Sub
复制代码 |
评分
-
1
查看全部评分
-
|