WPS JS宏:一键对多工作簿指定单元格汇总求

// 这个方案为 Dir 方法,但通过一个巧妙的数据结构(数组)来管理待遍历的文件夹路径,从而// 规避了递归调用时 Dir 函数状态冲突的问题。它的原理是维护一个“任务列表”,不断从列表中// 取出文件夹进行处理,并将发现的新子文件夹加入列表,直到所有文件夹处理完毕。function test5() {let intTotal = 0;let strPath = ThisWorkbook.Path;Application.ScreenUpdating = false;let oldCalc = Application.Calculation;Application.Calculation = -4135;// 使用数组模拟一个队列,存储所有待扫描的文件夹路径let foldersToScan = [strPath];// 只要还有文件夹未扫描,就继续循环while (foldersToScan.length > 0) {// 从数组中取出一个文件夹路径let currentFolder = foldersToScan.pop();// --- 1. 处理当前文件夹下的所有 .xlsx 文件 ---let strFileName = Dir(currentFolder + "\\*.xlsx");while (strFileName !== "") {try {let wb = Workbooks.Open(currentFolder + "\\" + strFileName);let ws = wb.Sheets(1);let lastRow = ws.Cells(ws.Rows.Count, 2).End(-4162).Row;let cellValue = ws.Range("B" + lastRow).Value();if (typeof cellValue === "number") {intTotal += cellValue;} else if (typeof cellValue === "string" && cellValue.trim() !== "") {let parsed = parseFloat(cellValue);if (!isNaN(parsed)) {intTotal += parsed;}}wb.Close(false);} catch (e) {alert("处理文件 " + strFileName + " 时出错:" + e.message);}strFileName = Dir(); // 获取下一个文件}// --- 2. 查找当前文件夹下的所有子文件夹,并加入待扫描列表 ---// 注意:这里重新调用 Dir,但这次是查找目录,不会影响上面的文件遍历let strSubFolder = Dir(currentFolder + "\\*", 16);while (strSubFolder !== "") {if (strSubFolder !== "." && strSubFolder !== "..") {// 将找到的子文件夹路径添加到待扫描列表foldersToScan.push(currentFolder + "\\" + strSubFolder);}strSubFolder = Dir(); // 获取下一个子文件夹}}Application.ScreenUpdating = true;Application.Calculation = oldCalc;ActiveSheet.Range("B2").Value2 = intTotal;alert("汇总完成,合计:" + intTotal);}
夜雨聆风