Microsoft VBA Excel 去重+自动化配对信息

【Excel VBA 从入门到出门】一、Excel VBA 是个啥? VBA代表Visual Basic for A applications。它是一种编程语言,用于自动执行 Microsoft Office 产品(包括 Excel、Word 和 Outlook)中的任务。使用 VBA Excel,您可以编写代码来自动执行任务、创建自定义函数,甚至在 Office 程序之间移动数据。 阅读详情

问题场景

A列数据中存在很多特别的情况:

  1. 中间分隔符为“/”,但是分隔符前后可能存在空格
  2. 一个编号可能出现多次,例如示例中6003出现了5次
  3. 可能为空,虽然节选的这部分没出现这种情况

B和C列数据中,会出现空格。

ABC
6003AAAL7
6003/ 6007/6001AAL6
6000/6003/6009AL1
6000 / 6003AAL8
6003L9

现在需要在新的Sheet中对原先的Sheet有以下操作:

  1. 从不重复的提取出所有编号,例如该节选数据结果是6003、6007、6001、6000、6009
  2. 对于提取的编号给予最后一次出现的行号,例如1中对应结果是5,2,2,4,3
  3. 根据编号最后一次出现的行号提取B和C的信息,如果不为空则填入想同行的B和C列的信息,如果为空则寻找上一次出现的内容,例如最后一次6003为空,则找到上一次是第4行,输出AA

根据以上信息,示例数据的结果应该是:

ABC
6003AAL9
6007AAL6
6001AAL6
6000AAL8
6009AL1

代码描述

  1. 分析和提取每个单元格中的编号。
  2. 记录每个编号最后出现的行号以及对应的B和C列数据。
  3. 填充新Sheet中的数据,如果B或C列为空,则查找之前的非空数据。

中文版

Sub ProcessData()
    Dim wsControl As Worksheet
    Dim WbSource As Workbook
    Dim wsSource As Worksheet, wsDest As Worksheet
    Dim i As Long, j As Long, k As Long
    Dim codes() As String, code As String
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary") ' 创建字典来存储信息
    Dim tempData As Variant
    
    ' 获取当前活动的工作表
    Set wsControl = ThisWorkbook.ActiveSheet

    ' 读取工作表中的相关数据
    linkFile = wsControl.Range("LinkFile").Value
    sheetName = wsControl.Range("SheetName").Value
    inputName = wsControl.Range("InputName").Value
    inputStart = wsControl.Range("InputStart").Value
    inputEnd = wsControl.Range("InputEnd").Value
    
    ' 设置源和目标工作表
    Set WbSource = Workbooks.Open(linkFile)
    Set wsSource = srcWb.Sheets(sheetName)
    Set wsDest = ThisWorkBook.Worksheets.Add
    wsDest.Name = inputName
    
    ' 定义数据的起始行和结束行
    Dim startRow As Long, endRow As Long
    startRow = inputStart
    endRow = inputEnd
    
    ' 遍历所有数据行
    For i = startRow To endRow
        If Trim(wsSource.Cells(i, 1).Value) <> "" Then
            codes = Split(Replace(wsSource.Cells(i, 1).Value, " ", ""), "/")
            For j = LBound(codes) To UBound(codes)
                code = Trim(codes(j))
                ' 更新字典中的信息
                dict(code) = Array(i, Trim(wsSource.Cells(i, 2).Value), Trim(wsSource.Cells(i, 3).Value))
            Next j
        End If
    Next i
    
    ' 将结果写入新的工作表
    k = 5
    For Each key In dict.Keys
        tempData = dict(key)
        ' 检查B和C列是否为空,如果为空,向上查找非空值
        If tempData(1) = "" Or tempData(2) = "" Then
            For j = tempData(0) - 1 To startRow Step -1
                If wsSource.Cells(j, 2).Value <> "" And tempData(1) = "" Then tempData(1) = Trim(wsSource.Cells(j, 2).Value)
                If wsSource.Cells(j, 3).Value <> "" And tempData(2) = "" Then tempData(2) = Trim(wsSource.Cells(j, 3).Value)
                If tempData(1) <> "" And tempData(2) <> "" Then Exit For
            Next j
        End If
        wsDest.Cells(k, 1).Value = key
        wsDest.Cells(k, 2).Value = tempData(1)
        wsDest.Cells(k, 3).Value = tempData(2)
        k += 1
    Next key
    
    ' 关闭源工作簿(如果不需要保存,则不保存)
    WbSource.Close SaveChanges:=False
    ' 自动调整列宽
    wsDest.Columns("A:C").AutoFit
End Sub

英文版

Sub ProcessData()
    Dim wsControl As Worksheet
    Dim WbSource As Workbook
    Dim wsSource As Worksheet, wsDest As Worksheet
    Dim i As Long, j As Long, k As Long
    ' Variables to hold codes and dictionaries
    Dim codes() As String, code As String
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary") ' Create dictionary to store information
    
    ' Set the control worksheet to the currently active sheet
    Set wsControl = ThisWorkbook.ActiveSheet

    ' Read necessary data from the control worksheet
    Dim linkFile As String, sheetName As String, inputName As String
    Dim inputStart As Long, inputEnd As Long
    linkFile = wsControl.Range("LinkFile").Value
    sheetName = wsControl.Range("SheetName").Value
    inputName = wsControl.Range("InputName").Value
    inputStart = wsControl.Range("InputStart").Value
    inputEnd = wsControl.Range("InputEnd").Value
    
    ' Open the source workbook and set the source and destination worksheets
    Set WbSource = Workbooks.Open(linkFile)
    Set wsSource = WbSource.Sheets(sheetName)
    Set wsDest = ThisWorkbook.Worksheets.Add
    wsDest.Name = inputName
    
    ' Define the data's start and end rows
    Dim startRow As Long, endRow As Long
    startRow = inputStart
    endRow = inputEnd
    
    ' Iterate through all rows in the data range
    For i = startRow To endRow
        ' Check if the cell in column A is not empty
        If Trim(wsSource.Cells(i, 1).Value) <> "" Then
            ' Split the cell content by "/", removing spaces
            codes = Split(Replace(wsSource.Cells(i, 1).Value, " ", ""), "/")
            For j = LBound(codes) To UBound(codes)
                code = Trim(codes(j))
                ' Update dictionary with new information
                dict(code) = Array(i, Trim(wsSource.Cells(i, 2).Value), Trim(wsSource.Cells(i, 3).Value))
            Next j
        End If
    Next i
    
    ' Write the results to the new worksheet
    k = 5 ' Start writing from row 5
    For Each key In dict.Keys
        tempData = dict(key)
        ' Check if columns B and C are empty, if so, look upwards for non-empty values
        If tempp(1) = "" Or tempData(2) = "" Then
            For j = tempData(0) - 1 To startRow Step -1
                If wsSource.Cells(j, 2).Value <> "" And tempData(1) = "" Then tempData(1) = Trim(wsSource.Cells(j, 2).Value)
                If wsSource.Cells(j, 3).Value <> "" And tempData(2) = "" Then tempData(2) = Trim(wsSource.Cells(j, 3).Value)
                If tempData(1) <> "" And tempData(2) <> "" Then Exit For
            Next j
        End If
        wsDest.Cells(k, 1).Value = key
        wsDest.Cells(k, 2).Value = tempData(1)
        wsDest.Cells(k, 3).Value = tempData(2)
        k += 1
    Next key
    
    ' Close the source workbook without saving changes
    WbSource.Close SaveChanges:=False
    ' AutoFit columns to content
    wsDest.Columns("A:C").AutoFit
End Sub
掌握Excel 259个常用宏:自动化与提升效率 本文还有配套的精品资源,点击获取 简介:Excel中的宏利用VBA代码自动化重复性任务,提高工作效率。本资源详细介绍了宏的基本概念、安全性、录制与播放方法、VBA编程基础及259个实例分类,如数据处理、自动化工作表格式、图表操作等。学习宏的步骤和注意事项被强调,以帮助用户在各个领域实现Excel数据处理自动化。 1. 宏的定义与基本概念 宏是什么? 宏... 阅读详情

相关推荐

VBA实战练习解答集:掌握Excel自动化

VBA,即Visual Basic for Applications,是一种嵌入在Microsoft Office套件中的编程语言。它允许用户自动化任务和操作,提高工作效率。VBA的使用跨越了Excel、Word、Access等多个应用程序,但其在Excel中的应用尤为广泛,特别是在数据处理和分析任务中。Visual Basic for Applications(VBA)是一种事件驱动编程语言,它由微软公司开发,主要集成在Microsoft Office套件中,允许开发者编写宏来自动化各种任务。

weixin_30765637的博客 1148

VBA Aplication函数之 Vlookup的运用

因为自己最近接手了很多公司的数据分析的工作,其中由许多的重复性的操作,自己都想要通过编写VBA代码简化工作。之前陆续编写过一些Python代码和SQL代码,后续将和大家分享。今天自己做了一个在工作中VBA自动运用excel 的Aplication函数的程序。介绍如下。

m0_55341949的博客 5587

VBA学习笔记本(二)——两个表格数据匹配_DEMO

VBA学习笔记本(二)——两个表格数据匹配_DEMO 将excel中两个工作表中,数据进行一键同步的通用方法

excel粘贴 粘贴值 使用VBA宏匹配目标格式

当您按下键盘上的Ctrl + V键时,也可以使用VBA宏始终默认设置黏贴模式为匹配目标格式。只需执行以下步骤: 步骤1:打开您的Excel工作簿,然后单击开发工具选项卡下的“Visual Basic”命令,或者只需按“ALT + F11”快捷方式。 步骤2:然后将出现“Visual Basic编辑器”窗口。 步骤3:单击“插入” – >“模块”以创建新模块。 步骤4:将以下VBA代码粘贴到代码窗口中。然后单击“保存”按钮。 变为这个,出现问题range的PasteSpec..

tanghuan0827的博客 6056

自制VBA多列相同字段匹配程序

自制VBA多列相同字段匹配程序.从数据源匹配取数的问题,写了个小的VBA程序。请参考和指正!o(∩_∩)o...

EXCEL自动匹配程序

VBA 编写的 自动匹配程序,很实用

vba实现单列/多列分类合并

在excel中,vba实现单列/多列分类合并,中间用逗号隔开,方便发通知等场合使用,在一定程度上减少工作量。

lianhun1hao的博客 1102

挑战第七天:Llamaindex RAG 实践

安装python 依赖包,并安装 Llamaindex和相关包以及Sentence Transformer 模型。进入开发机后,创建新的conda环境,命名为。镜像,然后在资源配置中,使用。的选项,然后立即创建开发机器。后,点击 选择镜像 使用。然后安装相关基础依赖。

weixin_53579823的博客 728

一分钟掌握 Excel VBA 技巧,轻松批量生成工资条,提高工作效率!

可能大家忽视了一点,Excel是我们日常办公中使用最多的工具,所以,学好Excel并加以运用,一定能提升你的工作效率,比如Excel VBA可以用代码实现自动化办公,下面举一个Excel VBA批量生成工资条的办公小案例。接下来,我将使用Excel VBA编写代码批量生成员工工资条,在 Excel 中点击 "开发工具" 选项卡,点击 "Visual Basic" 按钮,打开 VBA 编辑器,VBA代码都是写在VBA 编辑器运行。如下即为VBA 编辑器的操作界面。VBA代码在模块里面编写和运行。

weixin_42684533的博客 1415

【报错】sqli-labs靶场搭建出现“Unable to connect to the database: security”

搭建sqli-labs靶场时,“Unable to connect to the database: security”报错解决

九芒星的博客 2996

QMI8658姿态传感器实战:从校准到自检的完整避坑指南

本文详细解析了QMI8658姿态传感器的校准与自检流程,提供了从硬件环境搭建到高级功能开发的完整避坑指南。通过真实案例揭示电源设计、接口优化、温度补偿等关键细节,帮助开发者提升传感器精度和可靠性,适用于工业级应用场景。

weixin_29184075的博客 456

EXCEL VBA 入门与实用例子

VBA这个以前用过,放下很久了,最近因需要用Excel处理数据,用到了它,使用了其它一些方式,对比一下,感到VBA还是有些长处的。故将以前的学习笔记,重新整理了一下,发表到这里,供有需要的人借鉴。...............

cnds123的专栏 7万+

ADS 2024实战:手把手教你搞定2.3-3.5GHz宽带Doherty功放仿真与版图(附源文件)

本文详细解析了在ADS 2024环境中实现2.3-3.5GHz宽带Doherty功放的全流程设计,包括仿真与版图实现。从软件环境搭建、器件模型导入到核心电路设计、匹配网络优化,再到系统集成与版图生成,提供了实战技巧和关键参数设置。特别针对5G通信和卫星应用中的高效率需求,展示了如何通过ADS 2024的新功能提升设计效率。

weixin_42639246的博客 462

Excel VBA学习

首先,第一个问题,什么是 VBA?Visual Basic for Applications(VBA)是 VisualBasic 的一种宏语言,是微软开发出来在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。主要能用来扩展 Windows 的应用程序功能,特别是Microsoft Office软件。以上是 VBA 的百科定义,说简单点,VBA 是运行在 Microsoft Office 软件之上,可以用来编写非软件自带的功能的编程语言。

qq_45303968的博客 1万+

FMC/FSMC/EXMC总线NORFlash/PSRAM接口(异步-复用-不突发/同步-复用-突发)

目录 1 简介 1.1 框图 1.2 接口定义 1.3 读写时序图、时序配置参数 1.4 PSRAM控制器异步工作模式分类 1.5 PSRAM寄存器配置 1.5.1 控制寄存器BCR 1.5.2 片选时序寄存器BTR 1.5.3 写入时序寄存器BWTR 2 FPGA接口设计 2.1 实际配置的时序 2.2 接口信号处理 3 参考文献 1 简介 使...

leixj的博客 2万+

TI单芯片毫米波雷达1642demo代码走读(一)

今天我们来实际看下代码。 首先使用CCS软件导入demo工程,工程有两个,一个是ARM的工程,工程名是mmw_mss_16xx;另一个是DSP的工程,工程名为mmw_dss_16xx。我们将这两个工程的主函数打开,分别位于mss_main.c和dss_main.c文件中。 先看mss的主函数,代码如下。我为每行代码都加了中文注释和自己的理解。 int main (void) { Task_Params taskPara...

1万+

Excel VBA入门教程

简单介绍vba是什么,和编写第一个vba程序

m0_61961937的博客 6万+

彻底解析 DDIC_TYPE_INCONSISTENCY:从 ABAP ST22 连环 Dump 到 SE14 一键修复

听上去像内核级的致命故障,实则更多源于日常运维的细枝末节。只要掌握的排查三板斧,结合严格的变更流程与周期性的字典体检,再严重的 Dump 也能化险为夷。希望本文的案例与步骤能帮助读者在下一次遇到类似问题时,既能快速止血,也能追根溯源,避免重蹈覆辙。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 629

Microsoft VBA Excel 单元格 重复元素 去重

啦啦啦

RandPython的博客 1641

【Unity 反向运动学插件】Final IK 一套完整的IK解决方案

Final IK是Unity中一套完整的反向运动学解决方案,提供多种IK算法(CCD、FABRIK等)和功能模块,包括全身IK、VR驱动、武器瞄准、视线跟随等。其核心是通过数学方法计算关节旋转,使末端骨骼精确到达目标位置。系统支持多约束求解、旋转限制、动画烘焙及交互系统,采用模块化设计,兼顾性能与扩展性,适用于动作游戏、VR等需要高质量角色控制的场景,是Unity生态中最成熟的IK工具链之一。

2403_88403568的博客 1008

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Microsoft VBA Excel 去重小工具

啦啦啦

RandPython的博客 814

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【大模型实战】3个实操案例,学会用DeepSeek做VBA开发,实现Excel自动化

Excel一定是每一个办公人绕不过去的坎——不论现在的AI有多牛逼、产品多有逼格,最终落到实操环节都离不开Excel。但Excel的操作本身就比较繁琐,更不用说大量重复性操作的场景,就令人很烦。 此时,我们可以借助VBA的工具,通过AI写代码的方式完成Excel自动化处理

2401_85327249的博客 2208

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

excel去重怎么操作_这些年,为了在 Excel 中给序列去重,不知道坑死了多少人

老铁们应该已经非常熟悉罗叔给出的这个公式:PowerBI = ( Excel + PPT )²= Excel² + 2·Excel·PPT + PPT²请大家熟记这个公式,并记住来自罗叔的正确解释:第一,Excel 很重要。第二,PPT 很重要。第三,PowerBI 更重要。而我们为了在数据时代领先一步,你需要的不仅仅是有局限的学习 Excel 或者 PPT,而是三者。任何一个只强调一者...

weixin_39929259的博客 4563

Excel VBA简单语法

摘要: 该文为想要学习VBA编程的会计和编程同学有一定的个性化定制Excel操作提供参考 1. VBA编程是什么 VBA 究竟是什么?更确切地讲,它是一种自动化语言,它可以使常用的程序自动化,可以创建自定义的解决方案.90 年代早期,微软决定让它开发出来的应用程序共享一种通用的自动化语言--------Visual Basic For Application(VBA),而这种语言使EXCEL的用宏...

Master_Shifu_的博客 1万+

VBA读取其他Excel内容

VBA读取其他Excel内容AccessDataBaseEngine安装Excel内容读取 采用Microsoft于2020/8/11新出的AccessDataBaseEngine(Microsoft Access 2016 数据库引擎可再发行程序包)在VBA中读取Excel内容。 AccessDataBaseEngine安装 如何选择安装32位或64位AccessDataBaseEngine?打开Excel,点击文件 > 账户 > 关于Excel 查看。下载AccessDataBaseEngi

weixin_47342231的博客 7358
上一篇: Microsoft VBA Excel 去重小工具
下一篇: Microsoft VBA Excel 操控 Access资料表和查询代码进行搬运操作
偷心伊普西隆
博客等级 码龄7年 511粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值