使用wps js宏处理当前工作簿中所有工作表,工作表表头占4行,跳过每张表的最后一行并合并所有工作表,并将内容输出到一张新表命名为“四好合并”,并在追加一列注明源表名,比较合并后表内第二列数据,将重复数据所在行所有数据输出到一张新表,并命名为“四好重复”,并在最后统计重复数据相关信息
时间: 2025-07-20 14:26:21 浏览: 9
<think>我们需要在WPS JS宏中完成以下任务:
1. 遍历当前工作簿中的所有工作表(除了最后要新建的两个表,但一开始所有表都需要处理)。
2. 每张工作表有4行表头,需要跳过。同时跳过每张工作表的最后一行(即汇总行之类的)。
3. 将每张工作表的数据(跳过表头和最后一行)合并到一个新工作表,命名为“四好合并”,并追加一列注明源表名。
4. 在合并后的表中,比较第二列数据(假设是B列),将重复数据所在行输出到新表“四好重复”,同样要包括源表名列。
5. 在“四好重复”表中,最后还要统计重复数据的信息(比如重复的次数,重复的具体数据等)。
步骤:
1. 创建新工作表“四好合并”和“四好重复”。
2. 遍历所有工作表(跳过“四好合并”和“四好重复”以及可能存在的其他不需要的表?但这里我们假设一开始没有这两个表,所以可以遍历所有表,但要注意在合并过程中避免重复添加自己)。
3. 对于每个工作表,读取数据(从第5行开始到倒数第二行),然后添加一列记录源工作表名称。
4. 将数据写入“四好合并”工作表。
5. 在“四好合并”工作表中,根据第二列(B列)查找重复项。注意:重复项可能来自不同的工作表,所以需要记录所有重复行。
6. 将重复行复制到“四好重复”工作表,并在最后添加统计信息(比如每个重复值出现的次数,以及重复值本身)。
注意:由于WPS JS宏基于Excel的宏,所以API与Excel VBA类似,但使用的是JavaScript语法。
具体实现:
1. 创建新表:
- 合并表:Sheets.Add(null, null, 1, wps.Enum.XlSheetType.xlWorksheet); 并命名为“四好合并”
- 重复表:Sheets.Add(null, null, 1, wps.Enum.XlSheetType.xlWorksheet); 并命名为“四好重复”
2. 遍历工作表:for (let i=1; i<=Sheets.Count; i++) { ... },但要跳过我们新建的两个表?但一开始这两个表不存在,所以可以先创建,然后遍历时跳过这两个表。或者先遍历,再创建?这里我们先创建两个新表,然后遍历所有工作表时跳过这两个表。
3. 读取数据:从第5行开始,直到最后一行(需要跳过最后一行,所以是总行数-1)。
4. 合并表结构:假设每张表的结构相同,但列数可能不一致?这里我们假设表头相同,所以列数相同。但为了安全,我们可以取第一张表(除了表头)的列数作为基准,然后其他表如果列数不一致,则用空值填充?但题目要求跳过表头4行,所以数据从第5行开始。
5. 在合并表中,我们添加一列“源表名”,放在最后一列(假设原表有n列,则新列为n+1列)。
6. 重复数据判断:我们以第二列(即B列)作为判断重复的依据。注意:重复数据可能有多条(超过2条),我们需要找出所有重复的行。
7. 统计重复信息:在“四好重复”表中,除了所有重复行外,我们可以在最后添加一个统计区域,统计每个重复值出现的次数。
实现步骤:
步骤1:创建两个新工作表
步骤2:获取所有工作表,并过滤掉“四好合并”和“四好重复”
步骤3:循环每个工作表,读取数据(跳过表头和最后一行)
步骤4:将数据写入“四好合并”表,并添加源表名列
步骤5:在“四好合并”表中,对第二列进行重复检查
步骤6:将重复行复制到“四好重复”表,并添加统计信息
代码框架:
注意:由于WPS JS宏的API与VBA类似,我们可以使用以下关键对象:
- Application
- Workbook
- Worksheet
- Range
具体代码:
由于代码较长,我们将分步骤编写。</think>下面是一个使用WPS JS宏实现要求的详细解决方案。该宏将处理工作簿中所有工作表,合并数据到新表并标记重复项:
```javascript
function MergeAndFindDuplicates() {
// 创建目标工作表
let wb = Application.ActiveWorkbook;
let mergedSheet = wb.Sheets.Add(null, wb.Sheets[wb.Sheets.Count], 1, wps.Enum.XlSheetType.xlWorksheet);
mergedSheet.Name = "四好合并";
let dupSheet = wb.Sheets.Add(null, wb.Sheets[wb.Sheets.Count], 1, wps.Enum.XlSheetType.xlWorksheet);
dupSheet.Name = "四好重复";
// 准备合并表头
mergedSheet.Range("A1").Value = "源表名"; // 新增列标题
let rowCount = 1; // 当前写入行数
// 遍历所有工作表
for (let i = 1; i <= wb.Sheets.Count; i++) {
let sheet = wb.Sheets.Item(i);
if (sheet.Name === "四好合并" || sheet.Name === "四好重复") continue;
// 获取有效数据范围(跳过4行表头和最后1行)
let lastRow = sheet.UsedRange.Rows.Count;
if (lastRow <= 5) continue; // 无数据行
let dataRange = sheet.Range(`A5:${GetColLetter(sheet.UsedRange.Columns.Count)}${lastRow - 1}`);
// 复制数据到合并表
if (dataRange.Count > 0) {
// 添加源表名列
let sourceCol = mergedSheet.Columns.Item(1);
let targetRange = mergedSheet.Range(`A${rowCount + 1}:A${rowCount + dataRange.Rows.Count}`);
targetRange.Value = sheet.Name;
// 复制主体数据
dataRange.Copy(mergedSheet.Range(`B${rowCount + 1}`));
rowCount += dataRange.Rows.Count;
}
}
// 查找重复数据
FindDuplicateEntries(mergedSheet, dupSheet);
}
// 辅助函数:根据列号获取列字母
function GetColLetter(colNum) {
let letter = "";
while (colNum > 0) {
let remainder = (colNum - 1) % 26;
letter = String.fromCharCode(65 + remainder) + letter;
colNum = Math.floor((colNum - 1) / 26);
}
return letter;
}
// 查找重复项并生成统计信息
function FindDuplicateEntries(srcSheet, destSheet) {
let lastRow = srcSheet.UsedRange.Rows.Count;
if (lastRow <= 1) return; // 无数据
// 准备重复表表头
srcSheet.Rows("1:1").Copy(destSheet.Range("A1"));
destSheet.Columns.AutoFit();
// 检查第二列重复值
let dupCount = 0;
let dupValues = {};
let colB = srcSheet.Range(`B2:B${lastRow}`);
for (let i = 1; i <= colB.Rows.Count; i++) {
let cellValue = colB.Item(i).Value;
if (!cellValue) continue;
// 记录重复值
if (dupValues[cellValue]) {
dupValues[cellValue].count++;
dupValues[cellValue].rows.push(i + 1);
} else {
// 检查是否重复
let matchCount = Application.CountIf(colB, cellValue);
if (matchCount > 1) {
dupValues[cellValue] = { count: matchCount, rows: [i + 1] };
}
}
}
// 复制重复行到新表
let destRow = 2;
for (let value in dupValues) {
if (!dupValues.hasOwnProperty(value)) continue;
dupValues[value].rows.forEach(row => {
srcSheet.Rows(`${row}:${row}`).Copy(destSheet.Range(`A${destRow}`));
destRow++;
dupCount++;
});
}
// 添加统计信息
if (dupCount > 0) {
let statRow = destRow + 2;
destSheet.Range(`A${statRow}`).Value = "重复数据统计";
destSheet.Range(`A${statRow}:B${statRow}`).Merge();
statRow++;
destSheet.Range(`A${statRow}`).Value = "重复值";
destSheet.Range(`B${statRow}`).Value = "出现次数";
let idx = 1;
for (let val in dupValues) {
if (!dupValues.hasOwnProperty(val)) continue;
destSheet.Range(`A${statRow + idx}`).Value = val;
destSheet.Range(`B${statRow + idx}`).Value = dupValues[val].count;
idx++;
}
// 添加边框
let statRange = destSheet.Range(`A${statRow}:B${statRow + idx - 1}`);
statRange.Borders.LineStyle = wps.Enum.XlLineStyle.xlContinuous;
}
}
```
### 代码解释:
1. **主函数 `MergeAndFindDuplicates()`**
- 创建两个新工作表:"四好合并"和"四好重复"
- 遍历除目标表外的所有工作表
- 跳过每张表的4行表头和最后1行
- 添加"源表名"列并填充工作表名称
2. **辅助函数 `GetColLetter()`**
- 将列号转换为Excel列字母(如1→A,27→AA)
3. **重复处理函数 `FindDuplicateEntries()`**
- 复制表头到重复表
- 使用字典`dupValues`记录重复值和出现位置
- 复制所有重复行到"四好重复"表
- 添加统计区域显示:
- 每个重复值出现的次数
- 重复数据汇总统计
4. **关键操作**
- `UsedRange` 获取实际使用区域
- `CountIf` 函数统计重复值
- 行列索引从1开始(WPS JS API特性)
- 自动调整列宽和边框设置
### 使用说明:
1. 在WPS中按`Alt+F11`打开宏编辑器
2. 插入新模块并粘贴完整代码
3. 运行`MergeAndFindDuplicates`宏
4. 结果将生成两个新工作表:
- "四好合并":包含所有合并数据+源表名列
- "四好重复":包含重复行数据+统计信息
### 注意事项:
- 表头必须固定占4行
- 最后1行会被自动跳过
- 第二列作为重复判断依据
- 统计信息包含重复值和出现次数
阅读全文
相关推荐



















