VBA学习笔记本(二)——两个表格数据匹配
最近遇到很多要在两个表之间同步数据的情况,比如在sheet1 为基础表 表中有非常多的字段
姓名 | 学号 | 班级 | 专业 | 性别 | 年龄 | 籍贯 |
---|---|---|---|---|---|---|
张A | 001 | 一班 | 计算机 | 男 | 15 | 北京 |
王B | 002 | 一班 | 物理 | 男 | 30 | 上海 |
张C | 003 | 一班 | 采矿 | 男 | 18 | 北京 |
李E | 004 | 一班 | 软件 | 男 | 20 | 北京 |
秦F | 005 | 一班 | 财会 | 男 | 26 | 北京 |
而在Sheet2中却只有如下数据
姓名 | 学号 | 班级 | 专业 | 性别 | 年龄 | 籍贯 |
---|---|---|---|---|---|---|
张A | 001 | |||||
张C | 003 | |||||
李E | 004 | |||||
秦F | 005 |
Sheet2中的信息不全,需要补充完整,所以就需要VBA进行快速匹配,但是如果为了通用性,不仅仅局限于这个两张表中,就增加了一些功能。首先建立一个窗体增加如下控件:
三个下拉框分别为选取需要匹配的工作表,也就是本立中的Sheet2,另一个作为基准表,也就是本利中的Sheet1,二基准字段为两个表中匹配时作为关联的一个字段,本利中未学号,需要为唯一值。
新建一个模块,用于存放基础方法,共需建立一个窗口一个模块
基础功能模块中算法如下:
Function 获取表头数组(表名)'''本方法作用是输入表名,返回对应表中首行表头组成的数组'''使用了字典的作用是为了去重'关闭页面刷新Application.ScreenUpdating = FalseSheets(表名).SelectWith Sheets(表名)表行数 = Sheets(表名).UsedRange.Rows.Count表列数 = Sheets(表名).UsedRange.Columns.Count表头数组 = Sheets(表名).Range(Cells(1, 1), Cells(1, 表列数)).ValueDim 表头字典 As Object '声明字典对象,亦可通过声明变体型变量完成声明 >>> Dim dSet 表头字典 = CreateObject("Scripting.Dictionary") '声明字典For i = 1 To 表列数表头字典(Sheets(表名).Cells(1, i) & "") = iNext iDim 表数组()表数组 = Sheets(表名).Range(Cells(1, 1), Cells(表行数, 表列数)).Value表数组行数 = UBound(表数组) - LBound(表数组) + 1End With'通过字典转化后可以实现去除的目的表头数组 = 表头字典.KeysApplication.ScreenUpdating = True获取表头数组 = 表头数组
End Function
Function 同步表内容(需同步表, 基准表, 基准字段)'''本方法作用为同步两个表的数据,需输入需同步表,基准表,基准字段三个参数'关闭页面刷新Application.ScreenUpdating = False'加上选中工作表,可以减少一些不必要的错误,比如在数组赋值的时候如果不是选中工作表中就会报错Sheets(需同步表).Select'用with可以减少引用,方便书写,也可以小幅度的提高速度With Sheets(需同步表)'获取表中有数据的行数和列数需同步表行数 = .UsedRange.Rows.Count需同步表列数 = .UsedRange.Columns.Count'将需同步表的表头放入数组需同步表头数组 = .Range(Cells(1, 1), Cells(1, 需同步表列数)).Value'将表头内容存入字典Dim 需同步表头字典 As Object '声明字典对象,亦可通过声明变体型变量完成声明 >>> Dim dSet 需同步表头字典 = CreateObject("Scripting.Dictionary") '声明字典For i = 1 To 需同步表列数需同步表头字典(Sheets(需同步表).Cells(1, i) & "") = iNext i'将需同步表内数据放入数组Dim 需同步表数组()需同步表数组 = .Range(Cells(1, 1), Cells(需同步表行数, 需同步表列数)).Value需同步表数组行数 = UBound(需同步表数组) - LBound(需同步表数组) + 1End WithSheets(基准表).SelectWith Sheets(基准表)基准表行数 = Sheets(基准表).UsedRange.Rows.Count基准表列数 = Sheets(基准表).UsedRange.Columns.Count基准表头数组 = Sheets(基准表).Range(Cells(1, 1), Cells(1, 基准表列数)).ValueDim 基准表头字典 As Object '声明字典对象,亦可通过声明变体型变量完成声明 >>> Dim dSet 基准表头字典 = CreateObject("Scripting.Dictionary") '声明字典For i = 1 To 基准表列数基准表头字典(Sheets(基准表).Cells(1, i) & "") = iNext iDim 基准表数组()基准表数组 = Sheets(基准表).Range(Cells(1, 1), Cells(基准表行数, 基准表列数)).Value基准表数组行数 = UBound(基准表数组) - LBound(基准表数组) + 1End With'将需同步表头的内容字典的所有key,放入数组中需同步表头字典keys = 需同步表头字典.Keys'通过循环来判断是否相等及赋值For i = 2 To 需同步表数组行数For j = 2 To 基准表数组行数If 需同步表数组(i, 需同步表头字典(基准字段)) = 基准表数组(j, 基准表头字典(基准字段)) Then'通过循环,为每一行的每个单元格进行赋值For m = 0 To UBound(需同步表头字典keys) - 1If 基准表头字典.exists(需同步表头字典keys(m)) Then 'exists是用来判断字典中是否存在某个kye,用此方法比循环效率更高Sheets(需同步表).Cells(i, 需同步表头字典(需同步表头字典keys(m))) = 基准表数组(j, 基准表头字典(需同步表头字典keys(m)))End IfNext mEnd IfNext jNext iSheets(需同步表).Select'打开屏幕刷新输出结果Application.ScreenUpdating = True'返回函数值同步表内容 = "数据同步处理完成!"End Function
读取表名按钮方法:
Private Sub 读取表名按钮_Click()'''读取当前工作簿中所有的工作表,并且赋值给对应的下拉框控件'重置下拉框内容ComboBox_需匹配表.ClearComboBox_基准表.Clear'通过循环,获取工作表序号,然后将其名字放入下拉框控件中For i = 1 To Sheets.Count'在下拉框控件中加入内容ComboBox_需匹配表.AddItem (Sheets(i).Name)ComboBox_基准表.AddItem (Sheets(i).Name)Next i
End Sub
在需求匹配表内容选择后,基准字段下拉框中添加对应表头信息
'下拉框变化事件,当某下拉框内容变化后触发此事件
Private Sub ComboBox_需匹配表_change()表头数组 = 基础功能模块.获取表头数组(ComboBox_需匹配表.Text)'Debug.Print (ComboBox_需匹配表.Text & "_" & 表头数组(0))表头数组长度 = UBound(表头数组) - LBound(表头数组)For i = 0 To 表头数组长度'在下拉框控件中加入内容ComboBox_基准字段.AddItem (表头数组(i))Next i
End Sub
匹配内容按钮主要功能是调用函数进行计算
Private Sub 匹配内容按钮_Click()需同步表名 = ComboBox_需匹配表.Text基准表名 = ComboBox_基准表.Text基准字段 = ComboBox_基准字段.Text返回信息 = 基础功能模块.同步表内容(需同步表名, 基准表名, 基准字段)MsgBox (返回信息)
End Sub
综上以上即可实现通用的数据匹配,但是前提是两个工作表的表头字段是一样的,表头顺序无所谓,但是名称一定一样。
示例文件:https://download.csdn.net/download/huaqitaishao/12325721
VBA学习笔记本(二)——两个表格数据匹配相关推荐
- 两张表格数据匹配删除
假如咱们有两张表,其中一张表格存入了学生.科目.成绩的数据,称其为A表格,另一张表格中是学生.科目的数据称其为B表格,我希望从A表格中去匹配B表格的数据,然后将与B表格数据匹配的内容,从A表格中删去. ...
- Excel:如何用vlookup函数进行两个表格数据的对比。
Excel作为职场的重要办公软件,强大的功能给我们提供了很多便利的地方.那么Excel 如何用vlookup函数进行两个表格数据的对比呢,如何从一堆数据中匹配出自己需要的值呢. 工具/原料 Excel ...
- excel两张表格数据整合
今天跟大家分享一下excel两张表格数据整合 1.首先我们打开excel文件,然后点击如下图选项 2.点击[汇总拆分]选择[合并多表] 3.将[表头行数]设置为2 4.勾选[合并后,标注源工作表],并 ...
- 【论文阅读】Neural Transformation Learning for Deep Anomaly Detection Beyond Images 异常检测,可学习变换,时间序列,表格数据
本博客系博主阅读论文之后根据自己理解所写,非逐字逐句翻译,预知详情,请参阅论文原文. 论文标题:Neural Transformation Learning for Deep Anomaly Dete ...
- excel两个表格数据对比_快速对比excel表格两个sheet中不同的数据,极大的降低重复工作量...
两个Excel表格应该比较,公式不会被设置,而vba是一本天书.有简单的方法吗? 有!有!有!!! Excel有一个不是所有人都常用的功能:合并计算.使用它,我们可以快速比较两个表之间的差异. 示例: ...
- python处理wps表格数据匹配_两个excel表格数据匹配wps-WPS怎样用VLOOKUP引用另一个表格的数据...
wps精确匹配,把一个wps表格里面的数据匹配到另一... 材料/工具:wps2016 1.打开匹配个表格,表1和表2. 2.在需要放匹配值的格中输入=vl,就会自动提示vlookup函 3.双击选择 ...
- excel两个表格数据对比_Excel表格技巧—如何让两个Excel表格同时显示
在工作中,Excel表格是我们最常使用的办公软件之一,经常会碰到需要对比两个表格中的数据,可是系统默认是同个文件框,不能同时显示,只能两个交替切换看.如果凭着记忆去对比数据,其实是很容易出错,而且工作 ...
- excel两个表格数据对比_Excel表格怎么防止看错数据?阅读模式了解一下
在我们日常的办公生活当中,使用Excel表格来统计各种数据信息,已经成为很多小伙伴们的工作日常了.而有的小伙伴需要在表格当中录入数据,而有的小伙伴就需要对表格当中的数据进行查看.核对. 而如果Exce ...
- excel两个表格数据对比_Office 2010如何在桌面显示两个独立Excel表格
教大家如何在桌面上同显示两个excel独立文件.在做excel表格的时候,有些数需要去对比,而office 2010打开两个excel表格后,无法同时查两个表格,这时非常让人感到烦脑. 保存此文章,以 ...
最新文章
- CVPR 2021 | 基于稠密场景匹配的相机定位学习
- mySql完全手册2011031401
- windows10下同时安装两个mysql服务的解决办法
- kbengine定义实体
- 二分答案——烦恼的高考志愿(洛谷 P1678)
- double类型转integer类型_边坡支挡类型、构造及设计计算,需要的就转走!
- 为参加脱欧协议表决 英国工党女议员将延后剖腹产
- 树莓派4烧录系统后黑屏_原创试用 | 树莓派3B+测评(二)ubuntu系统烧录+彩虹屏问题解决...
- 苹果悬浮球_手机轻松实现多个系统!安卓手机运行苹果iOS系统?期待!
- 学校计算机社团都干些什么,学校计算机社团工作计划
- phpstorm误删文件恢复
- socket网络编程 poll的简单用法
- 惠普笔记本通过系统如何进入BIOS?
- mysql怎么命令查看表的数据_查看MySQL数据库表的命令介绍
- 用libpcap分析CAIDA的网络流量文件的猝发性
- 可解释的AI:深入深度学习黑匣子
- 使用php读取大量列的excel数据
- 网神防火墙如何启用双因素/双因子认证(2FA/MFA)身份认证
- 919 完全二叉树插入器
- 航天五院待遇2011zz
热门文章
- 2001考研数一真题解析
- python语音转文字源码_Python实现自动化语音转文本,彻底解放你的双手
- 客户机/服务器体系结构由哪几部分组成?又有什么优点和缺点?
- 00001、如何在Windows7(x64)上安装 Sharepoint2010 Fundation
- 厂家曝光三星新款可折叠手机,携带更方便
- 多元条件高斯分布的均值和方差的数学推导(Bishop: Patten Recognition and Machine Learning 第二章)
- 首次曝光!在线视频衣物精确检索技术_开启刷剧败明星同款时代
- Python-输入与循环
- Mac OS X 映射网络驱动器
- java计算机毕业设计足球队管理系统源程序+mysql+系统+lw文档+远程调试