用wps的JS宏处理工作簿,该工作簿中的表中前三行为表头,数据行出现在第四行,现在将该工作簿中所有除最后三行的表格内容合并到一张新工作表中,将其命名为“合并数据”表格,并在最后一列显示数据来源表,并将该列命名为“源表”。第二步,在“合并数据”的表格中将第三列数据重复所在行的数据全部输出到一张命名为“日期重复”的新工作表中,第三步,在“日期重复”的表格中再将第四列内容重复的数据所在行数据输出到命名为“双重重复”的新工作表中。并分别在“合并数据”表中统计合并数据条数,在“日期重复”表与“双重重复”表下方统计重复日期及次数,并高亮显示重复次数大于2次的数据,
时间: 2025-07-20 21:28:50 浏览: 8
<think>我们需要使用WPS的JS宏(实际上是JScript,与Excel VBA宏类似,但语法是JavaScript)来完成以下任务:
1. 合并工作簿中所有工作表(除了最后三行)的数据到一个新工作表“合并数据”,并在最后一列添加数据来源表名,列名为“源表”。
2. 在“合并数据”工作表中,将第三列数据重复的行的所有数据输出到新工作表“日期重复”。
3. 在“日期重复”工作表中,再将第四列内容重复的行的所有数据输出到新工作表“双重重复”。
4. 在“合并数据”表中统计合并数据条数(可以在某个单元格显示,比如A1单元格)。
5. 在“日期重复”和“双重重复”表下方统计重复日期(第三列)及重复次数,并高亮显示重复次数大于2次的数据(这里我们理解为高亮显示重复次数大于2次的日期所在的行?但是题目要求是统计重复日期及次数,并高亮显示重复次数大于2次的数据,这里我们理解为在统计表格中高亮重复次数大于2次的统计行?但题目描述可能是指高亮显示重复数据行?根据上下文,应该是高亮显示重复次数大于2次的日期对应的原始数据行?但题目要求是在表下方统计,所以统计结果放在数据下方,然后对统计结果中重复次数大于2次的行进行高亮?这里我们按照以下步骤:
- 在“日期重复”表的数据下方,统计第三列(日期列)中每个日期出现的次数,然后对统计结果中次数大于2的日期行进行高亮(即统计表格中的行)。
- 同样,在“双重重复”表中,我们也要在数据下方统计第四列(另一列)重复的次数,然后对统计结果中次数大于2的行进行高亮。
但是,注意题目要求第二步和第三步是输出重复行,所以第二步是输出第三列重复的行,第三步是在第二步的基础上输出第四列重复的行。
由于步骤较多,我们将分步实现。
注意:工作簿中每个工作表的前三行是表头,数据从第四行开始。合并时,我们只需要每个工作表的数据部分(从第4行到倒数第4行,因为题目要求“除最后三行”),即每个工作表的数据范围是第4行到倒数第4行(包含倒数第4行)。
步骤:
1. 遍历所有工作表,跳过“合并数据”、“日期重复”、“双重重复”这三个工作表(如果存在的话,在创建新表时先删除旧表?或者先判断删除旧表?)
2. 对于每个工作表,获取数据范围:从第4行开始,到倒数第4行结束(注意:最后三行不要,所以数据行数为总行数-3(表头3行)-3(最后3行)=总行数-6,但实际行号从4开始到总行数-3)。
3. 将每个工作表的数据读取出来(不包含表头,因为我们要自己创建表头),并在最后一列加上当前工作表的名称。
4. 创建一个新工作表“合并数据”,将合并的数据写入,并添加表头(原表头加上“源表”列)。
5. 在“合并数据”工作表中,统计总数据条数,并显示在某个位置(比如A1单元格)。
6. 创建“日期重复”表:筛选“合并数据”表中第三列(即C列,因为第一列是A,第二列B,第三列C)出现重复值的行(注意:重复是指出现次数大于1,但题目要求是重复就输出,所以重复一次以上都算?但通常重复是指至少两次)。我们将所有重复的行(包括重复多次的每一行)都输出到“日期重复”表。
7. 在“日期重复”表的数据区域下方,统计第三列每个日期出现的次数,然后对统计结果中次数大于2的日期行(即统计表格中的行)进行高亮(设置背景色)。
8. 创建“双重重复”表:在“日期重复”表的基础上,再按第四列(D列)重复来筛选行(同样,重复是指出现次数大于1),输出到“双重重复”表。
9. 在“双重重复”表的数据区域下方,统计第四列每个值出现的次数,然后对统计结果中次数大于2的行(统计行)进行高亮。
注意:在统计重复次数时,我们只统计原始数据部分的重复,不包括我们添加的统计部分。
由于WPS JS宏的API与Excel VBA类似,但有一些区别,我们使用JScript。
我们将逐步编写代码,并添加注释。
注意:在操作工作表时,要确保不会重复创建,所以先删除可能存在的旧表。
代码结构如下:
1. 删除已存在的“合并数据”、“日期重复”、“双重重复”工作表(如果存在)。
2. 创建“合并数据”表,并设置表头(包括“源表”列)。
3. 遍历所有工作表,将数据(除最后三行)复制到“合并数据”表,并在最后一列添加工作表名。
4. 在“合并数据”表的A1单元格显示总条数(注意:表头占一行,所以数据行数=总行数-1)。
5. 创建“日期重复”表:
- 从“合并数据”表中获取数据,找出第三列(索引2,因为数组从0开始)重复的行。
- 将重复的行复制到“日期重复”表,包括表头。
6. 在“日期重复”表的数据下方(从数据最后一行+2行开始)统计第三列每个日期的重复次数,并高亮重复次数>2的统计行。
7. 创建“双重重复”表:
- 从“日期重复”表中获取数据(注意:只取原始数据部分,不包括下面的统计),找出第四列(索引3)重复的行。
- 将重复的行复制到“双重重复”表,包括表头。
8. 在“双重重复”表的数据下方统计第四列每个值的重复次数,并高亮重复次数>2的统计行。
注意:在统计重复行时,我们使用字典(Scripting.Dictionary)来记录每个值出现的次数和行号。
由于WPS JS宏不支持Scripting.Dictionary,我们可以用JavaScript对象模拟字典。
我们将分步骤写函数,但注意WPS宏中不能使用ES6语法,所以用传统写法。
开始编写代码:</think>下面是一个使用WPS JS宏的完整解决方案,用于处理工作簿中的数据合并、重复项筛选和统计操作:
```javascript
function Main() {
// 步骤1:合并所有工作表数据到新表
const mergedSheet = MergeAllSheets();
if (!mergedSheet) return;
// 步骤2:创建日期重复表并统计
const dateDupSheet = CreateDateDuplicateSheet(mergedSheet);
// 步骤3:创建双重重复表并统计
CreateDoubleDuplicateSheet(dateDupSheet);
}
function MergeAllSheets() {
const wb = Application.ActiveWorkbook;
const newSheetName = "合并数据";
// 删除已存在的同名表
try { wb.Sheets.Item(newSheetName).Delete(); } catch(e) {}
const mergedSheet = wb.Sheets.Add(undefined, wb.Sheets.Item(wb.Sheets.Count));
mergedSheet.Name = newSheetName;
// 添加表头
const headers = ["源表"];
for (let col = 1; col <= wb.Sheets.Item(1).UsedRange.Columns.Count; col++) {
headers.unshift(`列${col}`);
}
mergedSheet.Range("A1").Resize(1, headers.length).Value = [headers];
let rowIndex = 2; // 数据起始行
// 遍历所有工作表
for (let i = 1; i <= wb.Sheets.Count; i++) {
const sheet = wb.Sheets.Item(i);
if (sheet.Name === newSheetName) continue;
const lastRow = sheet.UsedRange.Rows.Count;
if (lastRow <= 3) continue; // 跳过无数据的工作表
// 获取数据范围(第4行到倒数第3行)
const dataRange = sheet.Range(`A4:${GetColLetter(sheet.UsedRange.Columns.Count)}${lastRow - 3}`);
const data = dataRange.Value;
// 添加数据到新表
for (let r = 1; r <= data.length; r++) {
const rowData = data[r - 1];
rowData.push(sheet.Name); // 添加源表名称
mergedSheet.Range(`A${rowIndex}`).Resize(1, rowData.length).Value = [rowData];
rowIndex++;
}
}
// 统计总条数
const totalCount = rowIndex - 2;
mergedSheet.Range("A1").Value = `总数据条数: ${totalCount}`;
mergedSheet.Range("A1").Font.Bold = true;
return mergedSheet;
}
function CreateDateDuplicateSheet(sourceSheet) {
const wb = Application.ActiveWorkbook;
const newSheetName = "日期重复";
// 删除已存在的同名表
try { wb.Sheets.Item(newSheetName).Delete(); } catch(e) {}
const dupSheet = wb.Sheets.Add(undefined, wb.Sheets.Item(wb.Sheets.Count));
dupSheet.Name = newSheetName;
// 复制表头
sourceSheet.UsedRange.Rows.Item(1).Copy(dupSheet.Range("A1"));
const sourceData = sourceSheet.UsedRange.Value;
const dateCounts = {};
let rowIndex = 2;
// 收集日期重复的数据
for (let r = 2; r <= sourceData.length; r++) {
const dateValue = sourceData[r - 1][2]; // 第三列数据
if (!dateValue) continue;
// 统计日期出现次数
dateCounts[dateValue] = (dateCounts[dateValue] || 0) + 1;
// 如果是重复日期则复制到新表
if (dateCounts[dateValue] > 1) {
dupSheet.Range(`A${rowIndex}`).Resize(1, sourceData[r - 1].length).Value = [sourceData[r - 1]];
rowIndex++;
}
}
// 添加统计信息
const statRow = rowIndex + 2;
dupSheet.Range(`A${statRow}`).Value = "重复日期统计:";
dupSheet.Range(`A${statRow}`).Font.Bold = true;
let statIndex = 0;
for (const [date, count] of Object.entries(dateCounts)) {
if (count > 1) {
dupSheet.Range(`A${statRow + statIndex + 1}`).Value = date;
dupSheet.Range(`B${statRow + statIndex + 1}`).Value = count;
// 高亮重复次数>2的日期
if (count > 2) {
dupSheet.Range(`A${statRow + statIndex + 1}:B${statRow + statIndex + 1}`).Interior.Color = 0xFFCC99; // 橙色高亮
}
statIndex++;
}
}
return dupSheet;
}
function CreateDoubleDuplicateSheet(sourceSheet) {
const wb = Application.ActiveWorkbook;
const newSheetName = "双重重复";
// 删除已存在的同名表
try { wb.Sheets.Item(newSheetName).Delete(); } catch(e) {}
const dupSheet = wb.Sheets.Add(undefined, wb.Sheets.Item(wb.Sheets.Count));
dupSheet.Name = newSheetName;
// 复制表头
sourceSheet.UsedRange.Rows.Item(1).Copy(dupSheet.Range("A1"));
const sourceData = sourceSheet.UsedRange.Value;
const valueCounts = {};
let rowIndex = 2;
// 收集双重重复的数据
for (let r = 2; r <= sourceData.length; r++) {
const dateValue = sourceData[r - 1][2]; // 第三列
const targetValue = sourceData[r - 1][3]; // 第四列
if (!dateValue || !targetValue) continue;
const key = `${dateValue}|${targetValue}`;
// 统计出现次数
valueCounts[key] = (valueCounts[key] || {
count: 0,
date: dateValue,
value: targetValue
});
valueCounts[key].count++;
// 如果是重复值则复制到新表
if (valueCounts[key].count > 1) {
dupSheet.Range(`A${rowIndex}`).Resize(1, sourceData[r - 1].length).Value = [sourceData[r - 1]];
rowIndex++;
}
}
// 添加统计信息
const statRow = rowIndex + 2;
dupSheet.Range(`A${statRow}`).Value = "双重重复统计:";
dupSheet.Range(`A${statRow}`).Font.Bold = true;
let statIndex = 0;
for (const key in valueCounts) {
const {date, value, count} = valueCounts[key];
if (count > 1) {
dupSheet.Range(`A${statRow + statIndex + 1}`).Value = date;
dupSheet.Range(`B${statRow + statIndex + 1}`).Value = value;
dupSheet.Range(`C${statRow + statIndex + 1}`).Value = count;
// 高亮重复次数>2的数据
if (count > 2) {
dupSheet.Range(`A${statRow + statIndex + 1}:C${statRow + statIndex + 1}`).Interior.Color = 0x99CCFF; // 蓝色高亮
}
statIndex++;
}
}
}
// 辅助函数:列索引转字母
function GetColLetter(colIndex) {
let letter = "";
while (colIndex > 0) {
const remainder = (colIndex - 1) % 26;
letter = String.fromCharCode(65 + remainder) + letter;
colIndex = Math.floor((colIndex - 1) / 26);
}
return letter || "A";
}
```
### 代码解释:
#### 1. 主函数 `Main()`
- 控制整个处理流程:数据合并 → 日期重复处理 → 双重重复处理
#### 2. 数据合并函数 `MergeAllSheets()`
- 创建"合并数据"工作表
- 遍历所有工作表(跳过前三行和最后三行)
- 添加"源表"列标记数据来源
- 在A1单元格显示总数据条数
#### 3. 日期重复处理 `CreateDateDuplicateSheet()`
- 从"合并数据"表筛选第三列重复的数据
- 创建"日期重复"工作表
- 在表格下方添加日期重复统计
- 对重复次数>2的日期进行橙色高亮
#### 4. 双重重复处理 `CreateDoubleDuplicateSheet()`
- 从"日期重复"表筛选第四列重复的数据
- 创建"双重重复"工作表
- 在表格下方添加双重重复统计
- 对重复次数>2的数据进行蓝色高亮
#### 5. 辅助函数 `GetColLetter()`
- 将列索引转换为Excel字母标识(如1→A,28→AB)
### 使用说明:
1. 打开需要处理的WPS工作簿
2. 按 `Alt+F11` 打开宏编辑器
3. 插入新模块并粘贴完整代码
4. 按 `F5` 运行 `Main` 函数
5. 查看生成的三个新工作表:
- "合并数据":包含所有合并数据
- "日期重复":包含第三列重复的数据及统计
- "双重重复":包含第三列和第四列都重复的数据及统计
### 注意事项:
1. 前三行自动识别为表头
2. 每个工作表的最后三行数据会被忽略
3. 重复统计结果直接显示在对应工作表底部
4. 高亮规则:重复次数>2的数据会着色标记
---
阅读全文
相关推荐



















