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

问题场景

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 WorksheetDim WbSource As WorkbookDim wsSource As Worksheet, wsDest As WorksheetDim i As Long, j As Long, k As LongDim codes() As String, code As StringDim dict As ObjectSet dict = CreateObject("Scripting.Dictionary") ' 创建字典来存储信息Dim tempData As Variant' 获取当前活动的工作表Set wsControl = ThisWorkbook.ActiveSheet' 读取工作表中的相关数据linkFile = wsControl.Range("LinkFile").ValuesheetName = wsControl.Range("SheetName").ValueinputName = wsControl.Range("InputName").ValueinputStart = wsControl.Range("InputStart").ValueinputEnd = wsControl.Range("InputEnd").Value' 设置源和目标工作表Set WbSource = Workbooks.Open(linkFile)Set wsSource = srcWb.Sheets(sheetName)Set wsDest = ThisWorkBook.Worksheets.AddwsDest.Name = inputName' 定义数据的起始行和结束行Dim startRow As Long, endRow As LongstartRow = inputStartendRow = inputEnd' 遍历所有数据行For i = startRow To endRowIf Trim(wsSource.Cells(i, 1).Value) <> "" Thencodes = 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 jEnd IfNext i' 将结果写入新的工作表k = 5For Each key In dict.KeystempData = dict(key)' 检查B和C列是否为空,如果为空,向上查找非空值If tempData(1) = "" Or tempData(2) = "" ThenFor j = tempData(0) - 1 To startRow Step -1If 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 ForNext jEnd IfwsDest.Cells(k, 1).Value = keywsDest.Cells(k, 2).Value = tempData(1)wsDest.Cells(k, 3).Value = tempData(2)k += 1Next key' 关闭源工作簿(如果不需要保存,则不保存)WbSource.Close SaveChanges:=False' 自动调整列宽wsDest.Columns("A:C").AutoFit
End Sub

英文版

Sub ProcessData()Dim wsControl As WorksheetDim WbSource As WorkbookDim wsSource As Worksheet, wsDest As WorksheetDim i As Long, j As Long, k As Long' Variables to hold codes and dictionariesDim codes() As String, code As StringDim dict As ObjectSet dict = CreateObject("Scripting.Dictionary") ' Create dictionary to store information' Set the control worksheet to the currently active sheetSet wsControl = ThisWorkbook.ActiveSheet' Read necessary data from the control worksheetDim linkFile As String, sheetName As String, inputName As StringDim inputStart As Long, inputEnd As LonglinkFile = wsControl.Range("LinkFile").ValuesheetName = wsControl.Range("SheetName").ValueinputName = wsControl.Range("InputName").ValueinputStart = wsControl.Range("InputStart").ValueinputEnd = wsControl.Range("InputEnd").Value' Open the source workbook and set the source and destination worksheetsSet WbSource = Workbooks.Open(linkFile)Set wsSource = WbSource.Sheets(sheetName)Set wsDest = ThisWorkbook.Worksheets.AddwsDest.Name = inputName' Define the data's start and end rowsDim startRow As Long, endRow As LongstartRow = inputStartendRow = inputEnd' Iterate through all rows in the data rangeFor i = startRow To endRow' Check if the cell in column A is not emptyIf Trim(wsSource.Cells(i, 1).Value) <> "" Then' Split the cell content by "/", removing spacescodes = Split(Replace(wsSource.Cells(i, 1).Value, " ", ""), "/")For j = LBound(codes) To UBound(codes)code = Trim(codes(j))' Update dictionary with new informationdict(code) = Array(i, Trim(wsSource.Cells(i, 2).Value), Trim(wsSource.Cells(i, 3).Value))Next jEnd IfNext i' Write the results to the new worksheetk = 5 ' Start writing from row 5For Each key In dict.KeystempData = dict(key)' Check if columns B and C are empty, if so, look upwards for non-empty valuesIf tempp(1) = "" Or tempData(2) = "" ThenFor j = tempData(0) - 1 To startRow Step -1If 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 ForNext jEnd IfwsDest.Cells(k, 1).Value = keywsDest.Cells(k, 2).Value = tempData(1)wsDest.Cells(k, 3).Value = tempData(2)k += 1Next key' Close the source workbook without saving changesWbSource.Close SaveChanges:=False' AutoFit columns to contentwsDest.Columns("A:C").AutoFit
End Sub

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/18237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript--作用域是什么

作用域是什么 编译原理 在传统的编译语言中&#xff0c;程序中的一段源代码在执行之前会经历三个步骤。成为编译 分词/词法分析 这个过程由字符组成的字符串分解成有意义的代码块&#xff0c;这些代码块成为词法单元。 分词和词法分析之间的主要差异在于词法单元的识别是有…

实战指南:Vue 2基座 + Vue 3 + Vite + TypeScript微前端架构实现动态菜单与登录共享

实战指南&#xff1a;Vue 2基座 Vue 3 Vite TypeScript子应用vue2微前端架构实现动态菜单与登录共享 导读&#xff1a; 在当今的前端开发中&#xff0c;微前端架构已经成为了一种流行的架构模式。本文将介绍如何结合Vue 2基座、Vue 3子应用、Vite构建工具和TypeScript语言…

基于Docker的ROS开发

本文主要介绍如何使用Docker在Windows和Linux环境中部署并使用ROS&#xff0c;通过Docker Container运行ROS&#xff0c;可以方便我们在一个本地环境中运行多个ROS版本。 更多内容&#xff0c;访问专栏目录获取实时更新。 关于ROS的版本 参考ROS1 Distribution Wiki和ROS2 Dis…

nginx源码阅读理解 [持续更新,建议关注]

文章目录 前述一、nginx 进程模型基本流程二、源码里的小点1.对字符串操作都进行了原生实现2.配置文件解析也是原生实现待续 前述 通过对 nginx 的了解和代码简单阅读&#xff0c;发现这个C代码的中间件确实存在过人之处&#xff0c;使用场景特别多&#xff0c;插件模块很丰富…

10款AI工具,让工作生活学习更高效

我看大家都推荐的差不多了&#xff0c;常见好用的PC软件就那些&#xff0c;我不想反复“咀嚼”了&#xff0c;我想另辟蹊径推荐点不一样的&#xff0c;比如10款PC端的AI网站。AI已经全方位“侵入”我们的生活&#xff0c;从AI写作到AI绘画&#xff0c;从AI视频到AI语音&#xf…

ROS 节点node和包package

ROS 节点Node和包package node&#xff1a;ros中最基本的程序单元 package&#xff1a;节点的组织形式 节点Node 在 ROS&#xff08;Robot Operating System&#xff09;中&#xff0c;节点&#xff08;Node&#xff09;是一个运行中的进程&#xff0c;它是 ROS 应用程序的…

【申博分享】对自己过去一年申博的总结

大约是在23年春节后的时候有了读博的想法&#xff0c;到今天刚好一年多一点&#xff0c;之所以申博受多方面因素影响吧&#xff0c;同时自己也没觉得读博很难怎么样的&#xff0c;也还年轻感觉还学得动&#xff0c;唯一难受的就是读博时间成本太高&#xff0c;综合考虑之下还是…

华纳云:怎么限制docker容器的资源使用量?

限制Docker容器的资源使用量可以通过设置容器的资源限制参数来实现。以下是一些常用的资源限制方法&#xff1a; 1. CPU资源限制 通过--cpu参数可以限制容器对CPU的使用量。可以指定容器可以使用的CPU核心数&#xff0c;或者指定CPU配额和周期(quota and period)来限制CPU使用…

Thingsboard规则链:Switch节点详解

在物联网&#xff08;IoT&#xff09;领域&#xff0c;数据的高效处理与自动化决策是构建智能系统的核心。作为一款强大的物联网平台&#xff0c;Thingsboard通过其规则引擎为开发者提供了高度灵活的工具&#xff0c;其中Switch节点是实现消息条件路由的关键组件。本文将全方位…

【深度学习】Transformer梳理

零、前言 对于transformer&#xff0c;网上的教程使用记号、术语不一 。 最关键的一点&#xff0c;网上各种图的简化程度不一 &#xff08;画个图怎么能这么偷懒&#xff09; &#xff0c;所以我打算自己手画一次图。 看到的最和善&#xff08;但是不是那么靠谱&#xff0c;我…

Rust语言实现的去中心化AI网络节点

一、概述 去中心化和人工智能&#xff08;AI&#xff09;是两个极具潜力的发展方向。Gaia项目正是将这两者结合起来&#xff0c;创造了一个去中心化的AI网络节点。本文将深入探讨Gaia项目的技术细节&#xff0c;通过丰富的示例和详细描述&#xff0c;帮助读者全面理解并掌握该…

SRS Simple-RTMP-Server 全面介绍、教程与指南

本文全面介绍了SRS&#xff08;Simple Real-Time Media Server&#xff09;的功能、技术细节、安装部署、使用方法以及社区支持。涵盖了SRS的多种协议支持、性能优化、高级功能配置&#xff0c;以及如何在不同操作系统上搭建和使用SRS服务器。 文章目录 SRS简介SRS的定义和功能…

黑龙江某市数字孪生地下水监测系统平台项目建设经验

项目背景 地下水是一种特殊而珍贵的资源&#xff0c;它具有不可替代性&#xff0c;与经济发展及人民生活息息相关&#xff0c;针对日趋严峻的水资源危机&#xff0c;如何合理利用有限的水资源&#xff0c;保障国民经济的可持续发展是一个迫切需要解决的问题。 黑龙江某市积极…

eclipse启动时间过长的问题

项目场景&#xff1a; 由于我用eclipse比较习惯&#xff0c;虽然IDEA很好&#xff0c;但是因为收费&#xff0c;所以在个人开发学习过程中一直还是使用eclipse&#xff0c;本文不讨论eclipse与IDEA孰优孰劣问题。 开发环境&#xff1a; 操作系统&#xff1a;Windows 11 22631…

代码随想录 day21

二叉搜索树 二叉搜索树的最小绝对差 题意&#xff1a;求树中任意两不同节点值之间的最小差值 。 思路&#xff1a;这回要使用前后指针了。 使用两个指针&#xff08;前指针和后指针&#xff09;&#xff0c;对指向的结点的值进行相减&#xff0c;如果值大于maxlen就更新这个值…

【小呆的力学笔记】连续介质力学的知识点回顾一:运动和变形

文章目录 1. 运动的描述2. 拉格朗日描述下的变形2.1 线元的变化2.2 体元的变化2.3 面元的变化 1. 运动的描述 在连续介质力学中&#xff0c;存在着两种对运动的描述&#xff0c;一种为拉格朗日描述&#xff0c;即通过描述每个物质点的运动来描述整个变形体的运动&#xff0c;也…

如何将音频中的人声分离出来?

想要把一段视频中的人声跟背景音乐分离开来&#xff0c;找个好一点的音频处理软件就能把声音分离了&#xff0c;常见的有以下方法&#xff0c;一起来看看吧。 pr 打开软件&#xff0c;然后将电脑上的音频文件&#xff0c;上传到软件中&#xff0c;然后按住[ctrla]选择所有音频…

【数据结构】 排序算法 ~ 总结篇

文章目录 1. 排序几个重点概念的理解2. 排序算法的分析&#x1f427; 1. 排序几个重点概念的理解 2. 排序算法的分析&#x1f427;

Git学习篇

目录 使用命令导入项目 使用命令导入项目 1. 使用git init 命令初始化一个新的Git仓库。 git init 是 Git 命令&#xff0c;用于初始化一个新的 Git 仓库。当您想要开始跟踪一个新项目的版本控制时&#xff0c;可以运行 git init 命令来初始化一个空的 Git 仓库。 如果出现以下…

6-继承

6-继承 1、基本语法和方式2、继承的基本特点2.1 三种继承方式相同的基本点2.2 三种继承方式的差别2.3 公有继承的独有特点 3、子类的构造、析构3.1 子类的构造3.2 子类的析构3.3 子类的拷贝构造函数3.4 子类的拷贝赋值 4、多重继承4.1 内存布局4.2 类型转换4.3 名字冲突问题 5、…