按键精灵去重复表格内容问题

按键精灵去重复表格内容问题

a = 1
b = 2
c = 3
//循环读取表格文档内容
For i = 1 To 999
    a = a + 1
    b = b + 1
    c = c + 1
      //读取规格
      Gug = LazyExcel.ExcelRead(1, i, 1)
      Chf = LazyExcel.ExcelRead(1, a, 1)
      If Gug = Chf Then 
      Call LazyExcel.ExcelRows(1,a,"删除","",Index)
      End If
      If Gug = "" Then 
      Exit For
Next

以上代码如果Gug获取的第一行内容=Chf获取的第二行内容 就删除Chf获取的内容所在行,但是这样只能删除两个重复的保留一个,如果重复的有三行不能删除2个保留一个。

运行前
小明
小明
小红
小红
小红
运行后
小明
小红
小红
怎么修改为
小明
小红

' 打开Excel文件
Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open("C:\test.xlsx")
Set objWorksheet = objWorkbook.Worksheets("Sheet1")
' 获取表格总行数和总列数
intRowCount = objWorksheet.UsedRange.Rows.Count
intColCount = objWorksheet.UsedRange.Columns.Count
' 创建字典对象,用于去重复
Set dict = CreateObject("Scripting.Dictionary")
' 循环读取表格内容,并将不重复的内容保存到字典对象中
For i = 1 To intRowCount
    For j = 1 To intColCount
        ' 获取单元格内容
        strCellValue = objWorksheet.Cells(i, j).Value
        ' 如果字典对象中不存在该内容,则保存到字典对象中
        If Not dict.Exists(strCellValue) Then
            dict.Add strCellValue, 1 ' 将数量初始化为1
        Else
            dict.Item(strCellValue) = dict.Item(strCellValue) + 1 ' 如果存在,则数量加1
        End If
    Next
Next
' 清空表格内容
objWorksheet.UsedRange.ClearContents
' 将去重后的内容写入表格,并将重复项数量写入第二列
intRow = 1
For Each strCellValue In dict.Keys
    objWorksheet.Cells(intRow, 1).Value = strCellValue
    objWorksheet.Cells(intRow, 2).Value = dict.Item(strCellValue)
    intRow = intRow + 1
Next
' 关闭Excel文件
objWorkbook.Close True
objExcel.Quit

GPT 回答

参考GPT和自己的思路:

您可以尝试使用以下代码来实现保留第一个出现的重复行,删除后续重复行的功能:

1. a = 1
2. b = 2
3. c = 3
4. //循环读取表格文档内容
5. For i = 1 To 999
6. a = a + 1
7. b = b + 1
8. c = c + 1
9. //读取规格
10. Gug = LazyExcel.ExcelRead(1, i, 1)
11. Chf = LazyExcel.ExcelRead(1, a, 1)
12. If Gug = Chf Then
13. If i > 1 Then
14.     Pre = LazyExcel.ExcelRead(1, i-1, 1)
15.     If Pre <> Gug Then
16.         Call LazyExcel.ExcelRows(1, a, "删除", "", Index)
17.     End If
18. Else
19.     Call LazyExcel.ExcelRows(1, a, "删除", "", Index)
20. End If
21. End If
22. If Gug = "" Then
23.     Exit For
24. End If
25. Next

通过增加第13 ~ 20行的代码,当Gug和Chf相等时,先判断当前行是否为第一行,如果不是则获取上一行的内容,如果上一行的内容和当前行的内容不相等,则删除当前行。这样就可以保留第一个出现的重复行,删除后续的重复行。希望对您有所帮助!

该回答引用GPTᴼᴾᴱᴺᴬᴵ
可以使用一个哈希表(Hash table)来记录每一行出现的次数,如果次数大于1,就删除该行。

以下是C++的示例代码:

C++代码:

#include <iostream>
#include <string>
#include <unordered_map>
#include "LazyExcel.h"

using namespace std;

int main() {
unordered_map<string, int> countMap;
for (int i = 1; i < 999; ++i) {
string value = LazyExcel.ExcelRead(1, i, 1);
if (value.empty()) break;
++countMap[value];
}
for (int i = 1; i < 999; ++i) {
string value = LazyExcel.ExcelRead(1, i, 1);
if (value.empty()) break;
if (countMap[value] > 1) {
LazyExcel.ExcelRows(1, i, "删除", "", Index);
--countMap[value];
}
}
return 0;
}