最近遇到很多要在两个表之间同步数据的情况,比如在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学习笔记本(二)——两个表格数据匹配相关推荐

  1. 两张表格数据匹配删除

    假如咱们有两张表,其中一张表格存入了学生.科目.成绩的数据,称其为A表格,另一张表格中是学生.科目的数据称其为B表格,我希望从A表格中去匹配B表格的数据,然后将与B表格数据匹配的内容,从A表格中删去. ...

  2. Excel:如何用vlookup函数进行两个表格数据的对比。

    Excel作为职场的重要办公软件,强大的功能给我们提供了很多便利的地方.那么Excel 如何用vlookup函数进行两个表格数据的对比呢,如何从一堆数据中匹配出自己需要的值呢. 工具/原料 Excel ...

  3. excel两张表格数据整合

    今天跟大家分享一下excel两张表格数据整合 1.首先我们打开excel文件,然后点击如下图选项 2.点击[汇总拆分]选择[合并多表] 3.将[表头行数]设置为2 4.勾选[合并后,标注源工作表],并 ...

  4. 【论文阅读】Neural Transformation Learning for Deep Anomaly Detection Beyond Images 异常检测,可学习变换,时间序列,表格数据

    本博客系博主阅读论文之后根据自己理解所写,非逐字逐句翻译,预知详情,请参阅论文原文. 论文标题:Neural Transformation Learning for Deep Anomaly Dete ...

  5. excel两个表格数据对比_快速对比excel表格两个sheet中不同的数据,极大的降低重复工作量...

    两个Excel表格应该比较,公式不会被设置,而vba是一本天书.有简单的方法吗? 有!有!有!!! Excel有一个不是所有人都常用的功能:合并计算.使用它,我们可以快速比较两个表之间的差异. 示例: ...

  6. python处理wps表格数据匹配_两个excel表格数据匹配wps-WPS怎样用VLOOKUP引用另一个表格的数据...

    wps精确匹配,把一个wps表格里面的数据匹配到另一... 材料/工具:wps2016 1.打开匹配个表格,表1和表2. 2.在需要放匹配值的格中输入=vl,就会自动提示vlookup函 3.双击选择 ...

  7. excel两个表格数据对比_Excel表格技巧—如何让两个Excel表格同时显示

    在工作中,Excel表格是我们最常使用的办公软件之一,经常会碰到需要对比两个表格中的数据,可是系统默认是同个文件框,不能同时显示,只能两个交替切换看.如果凭着记忆去对比数据,其实是很容易出错,而且工作 ...

  8. excel两个表格数据对比_Excel表格怎么防止看错数据?阅读模式了解一下

    在我们日常的办公生活当中,使用Excel表格来统计各种数据信息,已经成为很多小伙伴们的工作日常了.而有的小伙伴需要在表格当中录入数据,而有的小伙伴就需要对表格当中的数据进行查看.核对. 而如果Exce ...

  9. excel两个表格数据对比_Office 2010如何在桌面显示两个独立Excel表格

    教大家如何在桌面上同显示两个excel独立文件.在做excel表格的时候,有些数需要去对比,而office 2010打开两个excel表格后,无法同时查两个表格,这时非常让人感到烦脑. 保存此文章,以 ...

最新文章

  1. CVPR 2021 | 基于稠密场景匹配的相机定位学习
  2. mySql完全手册2011031401
  3. windows10下同时安装两个mysql服务的解决办法
  4. kbengine定义实体
  5. 二分答案——烦恼的高考志愿(洛谷 P1678)
  6. double类型转integer类型_边坡支挡类型、构造及设计计算,需要的就转走!
  7. 为参加脱欧协议表决 英国工党女议员将延后剖腹产
  8. 树莓派4烧录系统后黑屏_原创试用 | 树莓派3B+测评(二)ubuntu系统烧录+彩虹屏问题解决...
  9. 苹果悬浮球_手机轻松实现多个系统!安卓手机运行苹果iOS系统?期待!
  10. 学校计算机社团都干些什么,学校计算机社团工作计划
  11. phpstorm误删文件恢复
  12. socket网络编程 poll的简单用法
  13. 惠普笔记本通过系统如何进入BIOS?
  14. mysql怎么命令查看表的数据_查看MySQL数据库表的命令介绍
  15. 用libpcap分析CAIDA的网络流量文件的猝发性
  16. 可解释的AI:深入深度学习黑匣子
  17. 使用php读取大量列的excel数据
  18. 网神防火墙如何启用双因素/双因子认证(2FA/MFA)身份认证
  19. 919 完全二叉树插入器
  20. 航天五院待遇2011zz

热门文章

  1. 2001考研数一真题解析
  2. python语音转文字源码_Python实现自动化语音转文本,彻底解放你的双手
  3. 客户机/服务器体系结构由哪几部分组成?又有什么优点和缺点?
  4. 00001、如何在Windows7(x64)上安装 Sharepoint2010 Fundation
  5. 厂家曝光三星新款可折叠手机,携带更方便
  6. 多元条件高斯分布的均值和方差的数学推导(Bishop: Patten Recognition and Machine Learning 第二章)
  7. 首次曝光!在线视频衣物精确检索技术_开启刷剧败明星同款时代
  8. Python-输入与循环
  9. Mac OS X 映射网络驱动器
  10. java计算机毕业设计足球队管理系统源程序+mysql+系统+lw文档+远程调试