用JS宏查找当前工作簿中名称为“合并数据”的工作表中第三列重复的数据所在行中的所有内容,并将其输出在一张新工作表中,命名为”日期重复“,并在最后添加统计重复数据个数
时间: 2025-07-20 15:30:26 浏览: 6
<think>我们将按照以下步骤进行:
1. 获取当前工作簿中名为“合并数据”的工作表。
2. 读取该工作表的数据,假设表头占两行(根据之前的需求),所以数据从第三行开始。
3. 检查第三列(即索引为2的列)的重复值。
4. 将所有重复行(包括重复出现的每一行)复制到新工作表“日期重复”中。
5. 在新工作表的末尾添加统计信息,包括重复的数据内容及其重复次数。
注意:重复数据指的是在第三列中出现两次及以上的值,并且我们将所有重复出现的行都输出。
步骤:
- 读取“合并数据”工作表的数据。
- 使用一个Map来记录每个值出现的次数,同时记录每个值对应的行索引(或行数据)。
- 遍历数据行(跳过表头),将第三列的值作为键,将行数据(或行索引)收集起来。
- 过滤出出现次数大于1的值对应的所有行。
- 创建新工作表“日期重复”,写入表头(与“合并数据”表头相同),然后写入所有重复行。
- 在新工作表的最后,添加统计信息,包括重复的日期和重复次数。
代码实现如下:</think>### 解决方案:查找重复数据并输出统计信息
以下代码实现了在"合并数据"工作表中查找第三列重复数据,并输出到"日期重复"工作表,同时添加重复统计信息:
```javascript
function 查找日期重复数据() {
try {
// 获取当前工作簿
const workbook = ThisWorkbook;
// 查找"合并数据"工作表
const sourceSheet = workbook.Sheets.Item("合并数据");
if (!sourceSheet) {
console.error("找不到名为'合并数据'的工作表");
return;
}
// 获取源数据
const dataRange = sourceSheet.UsedRange;
const allData = dataRange.Value2;
const headers = allData[0];
// 准备存储重复行和统计信息
const duplicateRows = [];
const duplicateStats = new Map();
// 遍历所有数据行(跳过表头)
for (let i = 1; i < allData.length; i++) {
const dateValue = allData[i][2]; // 第三列数据(索引2)
// 初始化统计信息
if (!duplicateStats.has(dateValue)) {
duplicateStats.set(dateValue, {
count: 0,
rows: []
});
}
// 更新统计信息
const stat = duplicateStats.get(dateValue);
stat.count++;
stat.rows.push(i + 1); // 记录实际行号
// 收集重复行(重复次数>1)
if (stat.count > 1) {
duplicateRows.push(allData[i]);
}
}
// 创建"日期重复"工作表
const dupSheet = workbook.Sheets.Add(null, workbook.Sheets(workbook.Sheets.Count));
dupSheet.Name = "日期重复";
// 写入重复数据
if (duplicateRows.length > 0) {
const outputRange = dupSheet.Range("A1").Resize(
duplicateRows.length + 1,
headers.length
);
outputRange.Value2 = [headers, ...duplicateRows];
}
// 添加统计信息
addStatistics(dupSheet, headers.length, duplicateStats);
return "处理完成!";
} catch (error) {
console.error("处理出错: " + error.message);
return "处理失败!";
}
}
// 添加统计信息到工作表
function addStatistics(sheet, colCount, statsMap) {
// 计算统计信息起始行(数据行+2行空白)
const startRow = sheet.UsedRange.Rows.Count + 3;
// 添加统计标题
sheet.Range(`A${startRow}`).Value2 = "日期重复统计";
sheet.Range(`A${startRow}`).Font.Bold = true;
sheet.Range(`A${startRow}`).Font.Size = 14;
// 添加表头
const statHeaders = ["日期值", "重复次数", "出现行号"];
sheet.Range(`A${startRow + 1}`).Resize(1, statHeaders.length).Value2 = statHeaders;
// 添加统计数据
let rowIndex = startRow + 2;
let totalDuplicates = 0;
for (const [dateValue, stat] of statsMap) {
if (stat.count > 1) {
sheet.Range(`A${rowIndex}`).Value2 = dateValue;
sheet.Range(`B${rowIndex}`).Value2 = stat.count;
// 合并行号显示(避免过多列)
const rowNumbers = stat.rows.join(", ");
sheet.Range(`C${rowIndex}`).Value2 = rowNumbers;
// 高亮重复次数多的行
if (stat.count > 2) {
sheet.Range(`A${rowIndex}:C${rowIndex}`).Interior.Color = RGB(255, 200, 200);
}
rowIndex++;
totalDuplicates += stat.count - 1; // 计算总重复行数
}
}
// 添加汇总信息
sheet.Range(`A${rowIndex + 1}`).Value2 = "汇总统计";
sheet.Range(`A${rowIndex + 1}`).Font.Bold = true;
sheet.Range(`A${rowIndex + 2}`).Value2 = "总重复日期数";
sheet.Range(`B${rowIndex + 2}`).Value2 = rowIndex - (startRow + 2);
sheet.Range(`A${rowIndex + 3}`).Value2 = "总重复行数";
sheet.Range(`B${rowIndex + 3}`).Value2 = totalDuplicates;
// 自动调整列宽
sheet.UsedRange.Columns.AutoFit();
}
// 执行函数
查找日期重复数据();
```
### 代码功能详解
#### 1. 主函数 `查找日期重复数据()`
- **定位数据源**:查找名为"合并数据"的工作表
- **数据处理**:
- 读取所有数据到二维数组
- 使用Map对象统计每个日期值的出现次数和行号
- 收集所有重复行(出现次数>1的行)
- **结果输出**:
- 创建"日期重复"工作表
- 写入所有重复数据行
- 添加详细的统计信息
#### 2. 辅助函数 `addStatistics()`
- **布局设计**:
- 在数据区域下方添加3行空白
- 添加统计标题和表头
- **统计内容**:
- 每个重复日期值
- 重复次数
- 出现的所有行号
- **可视化增强**:
- 高亮显示重复次数多的行
- 自动调整列宽
- 添加汇总统计信息
#### 3. 关键处理逻辑
1. **重复数据检测**:
```javascript
// 使用Map统计日期值
const duplicateStats = new Map();
// 更新统计信息
if (!duplicateStats.has(dateValue)) {
duplicateStats.set(dateValue, {count: 0, rows: []});
}
const stat = duplicateStats.get(dateValue);
stat.count++;
stat.rows.push(i + 1);
```
2. **重复行收集**:
```javascript
// 只收集重复行(count > 1)
if (stat.count > 1) {
duplicateRows.push(allData[i]);
}
```
3. **统计信息布局**:
```javascript
// 计算起始行(数据行+3行空白)
const startRow = sheet.UsedRange.Rows.Count + 3;
// 添加统计标题
sheet.Range(`A${startRow}`).Value2 = "日期重复统计";
```
4. **汇总统计**:
```javascript
// 总重复日期数
sheet.Range(`B${rowIndex + 2}`).Value2 = rowIndex - (startRow + 2);
// 总重复行数
sheet.Range(`B${rowIndex + 3}`).Value2 = totalDuplicates;
```
### 输出结果说明
1. **"日期重复"工作表结构**:
- 第一部分:所有重复数据行(保持原表结构)
- 第二部分:详细统计信息(间隔3行)
- 每个重复日期值的统计
- 重复次数
- 出现的所有行号
- 第三部分:汇总统计
- 总重复日期数
- 总重复行数
2. **可视化效果**:
- 统计标题加粗加大
- 高重复次数行标记为浅红色
- 自动调整列宽优化显示
3. **统计信息示例**:
```
日期值 重复次数 出现行号
2023-01-01 3 5, 12, 18
2023-01-05 2 7, 22
汇总统计
总重复日期数: 2
总重复行数: 5
```
### 使用说明
1. 在WPS中打开包含"合并数据"工作表的文件
2. 打开JS宏编辑器,粘贴完整代码
3. 运行`查找日期重复数据()`函数
4. 结果包含:
- "日期重复"工作表:所有重复数据行
- 详细的重复统计信息
- 汇总数据(总重复日期数和行数)
阅读全文
相关推荐















