VBA 如何多 sheet 数据按列值对齐合计
汇总某年 12 个月的员工绩效数据,按人汇总到 Year 表中,然后计算各 Project 的绩效总和,写入最后一行,相关的数据与汇总表如下:
下面为其中一个月的数据:
汇总表 Year,希望点按 SUM 按钮后就能自动计算。麻烦的是每页的人员次序和人数都不一定。
可以使用集算器, 完成对齐汇总后再被 VBA 调用。
我们将上述事例实现步骤:
1. 在集算器中编写脚本 sheets.dfx:
A | B | |
1 | =file(arg1).xlsopen() | / 打开 Excel 文件 |
2 | =A1.xlsimport@t(;1,3:17).(Employee) | / 获取 year 下的用户列表 |
3 | =to(2,A1.len()).conj(A1.xlsimport@t(;~,2:15).select(A2.contain(Employee))) | / 合并 12 个月表数据 |
4 | =A3.groups(Employee; sum(#3):'Project 1',sum(#4):'Project 2',sum(#5):'Project 3',sum(#6):'Project 4') | / 按员工分组汇总绩效 |
5 | >A4.insert(0, "TOTAL", A4.sum(#2),A4.sum(#3),A4.sum(#4),A4.sum(#5)) | / 汇总各个 Project |
6 | =A4.align@s(A2, Employee) | / 对齐处理 |
7 | >A1.xlsclose() | / 关闭文件 |
8 | return A6 |
A1 | stname | nrows | ncols |
year | 100262 | 2 | |
month_1 | 785 | 6 | |
month_2 | 604 | 6 | |
… | … | … |
A3 | _1 | Employee | Project 1 | Project 2 | Project 3 | Project 4 |
(null) | M | 2639 | 3879 | 3293 | 2214 | |
(null) | K | 2721 | 2335 | 1136 | 1115 | |
(null) | F | 2247 | 2096 | 2893 | 1539 | |
… | … | … |
A6 | Employee | Project 1 | Project 2 | Project 3 | Project 4 |
A | 16595 | 15262 | 12234 | 15783 | |
B | 16112 | 17383 | 20242 | 14323 | |
C | 26194 | 25824 | 30384 | 31480 | |
… | … | … | |||
TOTAL | 285603 | 273582 | 282986 | 283191 |
A3:to(2, A1.len()) 获取月数据 sheet 的序号,xlsimport() 将每个 sheet 的数据导入,合并数据后再过滤。
A4: 按员工分组,计算每个员工的绩效之和。
A5:将各个 Project 的汇总追加到序表。
A6:按用户列表顺序对齐。
在 Excel 下,若还没有加载集算器插件 ExcelRaq.xll,则需要加载它。ExcelRaq.xll 存放在集算器安装目录 raqsoft\esProc\bin 下。
在 Excel 中通过菜单的文件 --> 选项 --> 加载项 --> 转到 --> 浏览 --> 选择 ExcelRaq.xll 文件, 加载项中勾选 EsprocXll, 此时就启用了 ExcelRaq 插件了。
vba脚本函数为 merge(),其中 (nStart,nEnd) 为填充表格的开始位置 (3, 3),程序会自动计算要填充表格的大小,只需要设置初始位置即可。Application.Run() 中的参数分别是 SPL 接口函数 esproc, 要调用的 d:/app/sheets.dfx 脚本及 Excel 文件。
Sum按钮关联函数 merge(),点击按钮执行脚本,生成效果如下:
跟题目似乎不一致,没有对齐