Microsoft VBA Excel 去重小工具

news/2024/9/24 21:17:27/

问题简述

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

AB
1Link File:
2Sheet Name:
3Input Area:

代码描述

第一步:
读取:输入一个xls表格文件的地址到"LinkFile"、该文件内工作表名称到"SheetName"和需要读取数据的范围(例如A2:A102)到"InputArea",根据指定范围在该文件内指定工作表中读取所有数据;
第二步:
去重和获得索引:上一步获取的数据中存在重复,因此只需要保留唯一值,根据唯一值获得该值最后一次出现在读取数据范围的行列位置信息;
第三步:
输出:在本工作表中,在"InputArea"单元格下两行开始输出从上一步得到的单元格数据和对应的行列信息,也就是从A5开始输入单元格数据,B5开始输入对应的行列信息。

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

English:

Sub ProcessData()Dim srcWb As WorkbookDim ws As Worksheet, srcWs As WorksheetDim linkFile As String, sheetName As String, inputArea As StringDim rng As Range, cell As RangeDim dict As ObjectDim outputRow As Long' Create a dictionary to store unique values and corresponding last positionsSet dict = CreateObject("Scripting.Dictionary")' Get the currently active worksheetSet ws = ThisWorkbook.ActiveSheet' Read relevant data from the worksheetlinkFile = ws.Range("LinkFile").ValuesheetName = ws.Range("SheetName").ValueinputArea = ws.Range("InputArea").Value' Open the source data fileSet srcWb = Workbooks.Open(linkFile)Set srcWs = srcWb.Sheets(sheetName)' Get the specified rangeSet rng = srcWs.Range(inputArea)' Iterate over the range, collecting dataFor Each cell In rngIf Not dict.Exists(cell.Value) Thendict.Add cell.Value, cell.Address(False, False)Elsedict(cell.Value) = cell.Address(False, False)  ' Update to the last position of occurrenceEnd IfNext cell' Close the source data filesrcWb.Close False' Output the resultsoutputRow = ws.Range("InputArea").Row + 2For Each key In dict.Keysws.Cells(outputRow, 1).Value = keyws.Cells(outputRow, 2).Value = dict(key)outputRow = outputRow + 1NextMsgBox "Data processed successfully!"
End Sub

总结


http://www.ppmy.cn/news/1464554.html

相关文章

ffpmeg windows WSl 编译so

1.NDK 环境变量配置 2.git clone ffpmeg 3.创建脚本(需先下载gcc编译器) 64位脚本如下 #!/bin/bashexport NDK/home/test/ndk20 #这里配置先你的 NDK 路径 TOOLCHAIN$NDK/toolchains/llvm/prebuilt/linux-x86_64function build_android {./configure \ …

内存函数<C语言>

前言 前面两篇文章介绍了字符串函数,不过它们都只能用来处理字符串,C语言中也内置了一些内存函数来对不同类型的数据进行处理,本文将介绍:memcpy()使用以及模拟实现,memmove()使用以及模拟实现,memset()使用…

解决文件传输难题:如何绕过Gitee的100MB上传限制

引言 在版本控制和代码托管领域,Gitee作为一个流行的平台,为用户提供了便捷的服务。然而,其对单个文件大小设定的100MB限制有时会造成一些不便。 使用云存储服务 推荐理由: 便捷性:多数云存储服务如: Dro…

0.1 视频简介

0.1 视频简介 视频泛指将动态影像以电信号方式加以捕捉、纪录、处理、存储、发送与重现的各种技术。视频系统在显示分辨率、宽高比、刷新率、色彩功能和其他质量方面各不相同。存在模拟和数字变体,并且可以在多种媒体上承载,包括无线电广播、磁带、光盘…

高并发处理

高并发处理是对系统在同时处理大量请求能力的一种考验。在设计高并发系统时,通常会涉及到多个层面的优化,包括应用程序、数据库、服务器和网络架构等方面的优化。以下是一些建议如何设计和优化高并发系统: 应用程序层面 : 异步处…

数据库基础+增删查改初阶

数据库基础增删查改初阶 一。数据库操作 1.概念: 一个mysql服务器上有很多的表,把有关系的表放在一起就构成了一个数据集合,此时称为“数据库”,一个mysql1服务器上可以有多个这样的数据库 2.创建数据库: create …

程序猿转型做项目经理一定要注意这 5 个坑

前言 国内的信息系统项目经理,很多都是从技术骨干转型的,我就是这样一路走过来的,这样有很多好处,比如技术过硬容易服众、熟悉开发流程更容易把控项目进度和质量、开发过程中碰到难题时更好组织攻坚等等,但是所谓成也…

Kata Containers零基础学习从零到一

文章目录 docker和Kata Containers的区别Docker容器共享宿主机内核每个容器实例运行在轻量级虚拟机(MicroVM)总结 通俗例子Kata Containers架构实际Kata Containers架构图解容器技术栈总结 agent和shim家长(shim进程)的角色保姆&a…