Microsoft VBA Excel 去重小工具

问题简述

在本工作表中,A1:B3单元格样式如下,通过名称管理器B列的单元格被命名为"LinkFile"、"SheetName"、"InputArea",请实现以下功能:读取Excel文件中的数据,去除重复的数据,并记录每个数据项最后一次出现的位置,最后将结果输出到当前工作表中。

A B
1 Link File:
2 Sheet Name:
3 Input Area:

代码描述

第一步:

读取:输入一个xls表格文件的地址到"LinkFile"、该文件内工作表名称到"SheetName"和需要读取数据的范围(例如A2:A102)到"InputArea",根据指定范围在该文件内指定工作表中读取所有数据;
第二步:

去重和获得索引:上一步获取的数据中存在重复,因此只需要保留唯一值,根据唯一值获得该值最后一次出现在读取数据范围的行列位置信息;
第三步:

输出:在本工作表中,在"InputArea"单元格下两行开始输出从上一步得到的单元格数据和对应的行列信息,也就是从A5开始输入单元格数据,B5开始输入对应的行列信息。

vba 复制代码
Sub ProcessData()
    Dim srcWb As Workbook
    Dim ws As Worksheet, srcWs As Worksheet
    Dim linkFile As String, sheetName As String, inputArea As String
    Dim rng As Range, cell As Range
    Dim dict As Object
    Dim outputRow As Long
    
    ' 创建字典来存储唯一值和对应的最后位置
    Set dict = CreateObject("Scripting.Dictionary")
    
    ' 获取当前活动的工作表
    Set ws = ThisWorkbook.ActiveSheet
    
    ' 读取工作表中的相关数据
    linkFile = ws.Range("LinkFile").Value
    sheetName = ws.Range("SheetName").Value
    inputArea = ws.Range("InputArea").Value
    
    ' 打开源数据文件
    Set srcWb = Workbooks.Open(linkFile)
    Set srcWs = srcWb.Sheets(sheetName)
    
    ' 获取指定范围
    Set rng = srcWs.Range(inputArea)
    
    ' 遍历范围,收集数据
    For Each cell In rng
        If Not dict.Exists(cell.Value) Then
            dict.Add cell.Value, cell.Address(False, False)
        Else
            dict(cell.Value) = cell.Address(False, False)  ' 更新为最后出现的位置
        End If
    Next cell
    
    ' 关闭源数据文件
    srcWb.Close False
    
    ' 输出结果
    outputRow = ws.Range("InputArea").Row + 2
    For Each key In dict.Keys
        ws.Cells(outputRow, 1).Value = key
        ws.Cells(outputRow, 2).Value = dict(key)
        outputRow = outputRow + 1
    Next
    
    MsgBox "数据处理完毕!"
End Sub

English:

vba 复制代码
Sub ProcessData()
    Dim srcWb As Workbook
    Dim ws As Worksheet, srcWs As Worksheet
    Dim linkFile As String, sheetName As String, inputArea As String
    Dim rng As Range, cell As Range
    Dim dict As Object
    Dim outputRow As Long
    
    ' Create a dictionary to store unique values and corresponding last positions
    Set dict = CreateObject("Scripting.Dictionary")
    
    ' Get the currently active worksheet
    Set ws = ThisWorkbook.ActiveSheet
    
    ' Read relevant data from the worksheet
    linkFile = ws.Range("LinkFile").Value
    sheetName = ws.Range("SheetName").Value
    inputArea = ws.Range("InputArea").Value
    
    ' Open the source data file
    Set srcWb = Workbooks.Open(linkFile)
    Set srcWs = srcWb.Sheets(sheetName)
    
    ' Get the specified range
    Set rng = srcWs.Range(inputArea)
    
    ' Iterate over the range, collecting data
    For Each cell In rng
        If Not dict.Exists(cell.Value) Then
            dict.Add cell.Value, cell.Address(False, False)
        Else
            dict(cell.Value) = cell.Address(False, False)  ' Update to the last position of occurrence
        End If
    Next cell
    
    ' Close the source data file
    srcWb.Close False
    
    ' Output the results
    outputRow = ws.Range("InputArea").Row + 2
    For Each key In dict.Keys
        ws.Cells(outputRow, 1).Value = key
        ws.Cells(outputRow, 2).Value = dict(key)
        outputRow = outputRow + 1
    Next
    
    MsgBox "Data processed successfully!"
End Sub

总结

相关推荐
VBAMatrix7 小时前
deepseek-v4正式接入Excel,一键生成财务分析报告
word·excel·审计·财务分析·deepseek·会计师事务所·tb工具箱
装杯让你飞起来啊11 小时前
第 2 周 Day 5-6:综合小游戏 —— 学生成绩管理系统
windows·microsoft·kotlin
多年小白12 小时前
2026年5月5日
大数据·人工智能·深度学习·microsoft·机器学习·ai·自动驾驶
前端之虎陈随易14 小时前
为什么今天还会有新语言?MoonBit 想解决什么问题?
大数据·linux·javascript·人工智能·算法·microsoft·typescript
csgo打的菜又爱玩16 小时前
11.JobManager 启动流程总结
大数据·开发语言·qt·microsoft·flink
DogDaoDao18 小时前
【GitHub】Microsoft VibeVoice 深度解析:开源语音AI全家桶,90分钟长语音合成+60分钟语音识别
人工智能·microsoft·开源·github·语音识别·语音处理·vibevoice
专注VB编程开发20年1 天前
傻瓜式Office 功能区插件 / Ribbon开发模板
ribbon·excel·vba·插件·扩展宏
小风吹啊吹~2 天前
vscode的tunnel链接(Linux 服务器 + Windows 本地电脑版本)
服务器·vscode·microsoft·远程工作
专注VB编程开发20年2 天前
Excel 2024 / 365 已经把 “单元格填充效果→图片” 这个按钮删掉了
excel