乐于分享
好东西不私藏

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

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.Count2).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);}
需要源码文件? 关注后回复”20260626″,获取完整 示例文件下载链接。