百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

用VBA代码查询两列数据差异 vba对比两列找不同

bigegpt 2024-12-25 10:23 8 浏览

今天和大家分享的内容是如何用VBA代码查询两列数据差异。

打个响指,举个栗子。

如上图所示,查询A列和C列的数据,提取出相同值、A列存在C列不存在的值、A列不存在C列存在的值……

查询结果如下图所示。

当然,这事儿并不是一定得用VBA,函数和Power Query都可以的。但我们是VBA公众号嘛,所以还是讲VBA的方法……

代码如下

Sub CheckTwoClnData()
??? Dim d As Object
??? Dim i As Long, n1 As Long, n2 As Long, n3 As Long, m As Long
??? Dim strTemp As String
??? Dim arr1 As Variant, arr2 As Variant, brr As Variant, kr As Variant
??? Dim rng1 As Range, rng2 As Range, rng As Range
??? Set d = CreateObject("scripting.dictionary")
??? On Error Resume Next
??? Set rng1 = Application.InputBox("请选择需要核对差异的第一列数据", Type:=8)
??? '用户选取第一列数据
??? If rng1.Columns.Count > 1 Then MsgBox "请选择单列数据。": Exit Sub
??? If rng1.Rows.Count = 1 Then MsgBox "不能选择单个单元格。": Exit Sub
??? Set rng1 = Intersect(rng1.Parent.UsedRange, rng1)
??? '防止用户选取整列造成运算量虚大效率低下
??? If Not rng1 Is Nothing Then arr1 = rng1.Value
??? '将第一列数据装入arr1
??? Set rng2 = Application.InputBox("请选择需要核对差异的第二列数据", Type:=8)
??? '用户选取第二列数据
??? If rng2.Columns.Count > 1 Then MsgBox "请选择单列数据。": Exit Sub
??? If rng2.Rows.Count = 1 Then MsgBox "不能选择单个单元格。": Exit Sub
??? Set rng2 = Intersect(rng2.Parent.UsedRange, rng2)
??? If Not rng2 Is Nothing Then arr2 = rng2.Value
??? For i = 2 To UBound(arr1) '扣除标题行
??????? If Len(arr1(i, 1)) Then
??????????? d("'" & arr1(i, 1)) = "不存在"
??????????? '将数据统一强制转换为字符串格式
??????????? '数据装入字典,先统一设置item为不存在
??????? End If
??? Next
??? If UBound(arr1) > UBound(arr2) Then
??? '计算两列最大行数
??????? m = UBound(arr1)
??? Else
??????? m = UBound(arr2)
??? End If
??? ReDim brr(0 To m, 1 To 3)
??? '结果数组
??? '第一列放AB均存在的数据
??? '第二列放A有B没有的数据
??? '第三列放B有A没有的数据
??? For i = 2 To UBound(arr2)
??????? If Len(arr2(i, 1)) Then
??????????? strTemp = "'" & arr2(i, 1)
??????????? If d.exists(strTemp) Then '如果A有B也有
??????????????? n1 = n1 + 1
??????????????? brr(n1, 1) = strTemp
??????????????? d(strTemp) = "存在"
??????????????? '将AB均有的数据item修改为存在
??????????? Else '如果B有A没有
??????????????? n3 = n3 + 1
??????????????? brr(n3, 3) = strTemp
??????????? End If
??????? End If
??? Next
??? kr = d.keys
??? For i = 0 To UBound(kr)
??????? If d(kr(i)) = "不存在" Then '如果A有B没有
??????????? n2 = n2 + 1
??????????? brr(n2, 2) = kr(i)
??????? End If
??? Next
??? Err.Clear
??? Set rng = Application.InputBox("请选择放置查询结果的单元格,例如C1", Type:=8)
??? rng.Parent.Select
??? rng.Select
??? If Err.Number = 0 Then
??????? brr(0, 1) = "两列均存在的数据有" & n1 & "条"
??????? brr(0, 2) = "A有B没有的数据有" & n2 & "条"
??????? brr(0, 3) = "B有A没有的数据有" & n3 & "条"
??????? With rng(1).Resize(UBound(brr) + 1, 3)
??????????? .ClearContents '打扫房间
??????????? .NumberFormatLocal = "@"
??????????? '设置文本格式,防止文本数值变形
??????????? .Value = brr
??????? End With
??????? MsgBox "核对完成。" & vbLf & brr(0, 1) & vbLf & brr(0, 2) & vbLf & brr(0, 3)
??? End If
??? Set d = Nothing
??? Set rng = Nothing
??? Set rng1 = Nothing
??? Set rng2 = Nothing
??? Erase arr1: Erase arr2: Erase brr
End Sub

代码运行动画:

小贴士:

1,代码使用了字典对象,首先将第一列的数据装入字典,并将item统一设置为“不存在”,然后判断第二列的数据是否在字典中存在,如果存在,则将条目对应的item修改为“存在”,最后遍历字典,查询item仍然为“不存在”的数据。

2,代码允许用户选取整列数据,使用了Intersect方法避免运算量虚大效率低下的问题,但不允许用户选取多列或单个单元格。

3,代码无视空格,不区分文本值和数值。

图文作者:看见星光

相关推荐

得物可观测平台架构升级:基于GreptimeDB的全新监控体系实践

一、摘要在前端可观测分析场景中,需要实时观测并处理多地、多环境的运行情况,以保障Web应用和移动端的可用性与性能。传统方案往往依赖代理Agent→消息队列→流计算引擎→OLAP存储...

warm-flow新春版:网关直连和流程图重构

本期主要解决了网关直连和流程图重构,可以自此之后可支持各种复杂的网关混合、多网关直连使用。-新增Ruoyi-Vue-Plus优秀开源集成案例更新日志[feat]导入、导出和保存等新增json格式支持...

扣子空间体验报告

在数字化时代,智能工具的应用正不断拓展到我们工作和生活的各个角落。从任务规划到项目执行,再到任务管理,作者深入探讨了这款工具在不同场景下的表现和潜力。通过具体的应用实例,文章展示了扣子空间如何帮助用户...

spider-flow:开源的可视化方式定义爬虫方案

spider-flow简介spider-flow是一个爬虫平台,以可视化推拽方式定义爬取流程,无需代码即可实现一个爬虫服务。spider-flow特性支持css选择器、正则提取支持JSON/XML格式...

solon-flow 你好世界!

solon-flow是一个基础级的流处理引擎(可用于业务规则、决策处理、计算编排、流程审批等......)。提供有“开放式”驱动定制支持,像jdbc有mysql或pgsql等驱动,可...

新一代开源爬虫平台:SpiderFlow

SpiderFlow:新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。-精选真开源,释放新价值。概览Spider-Flow是一个开源的、面向所有用户的Web端爬虫构建平台,它使用Ja...

通过 SQL 训练机器学习模型的引擎

关注薪资待遇的同学应该知道,机器学习相关的岗位工资普遍偏高啊。同时随着各种通用机器学习框架的出现,机器学习的门槛也在逐渐降低,训练一个简单的机器学习模型变得不那么难。但是不得不承认对于一些数据相关的工...

鼠须管输入法rime for Mac

鼠须管输入法forMac是一款十分新颖的跨平台输入法软件,全名是中州韵输入法引擎,鼠须管输入法mac版不仅仅是一个输入法,而是一个输入法算法框架。Rime的基础架构十分精良,一套算法支持了拼音、...

Go语言 1.20 版本正式发布:新版详细介绍

Go1.20简介最新的Go版本1.20在Go1.19发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。一如既往,该版本保持了Go1的兼容性承诺。我们期望几乎所...

iOS 10平台SpriteKit新特性之Tile Maps(上)

简介苹果公司在WWDC2016大会上向人们展示了一大批新的好东西。其中之一就是SpriteKitTileEditor。这款工具易于上手,而且看起来速度特别快。在本教程中,你将了解关于TileE...

程序员简历例句—范例Java、Python、C++模板

个人简介通用简介:有良好的代码风格,通过添加注释提高代码可读性,注重代码质量,研读过XXX,XXX等多个开源项目源码从而学习增强代码的健壮性与扩展性。具备良好的代码编程习惯及文档编写能力,参与多个高...

Telerik UI for iOS Q3 2015正式发布

近日,TelerikUIforiOS正式发布了Q32015。新版本新增对XCode7、Swift2.0和iOS9的支持,同时还新增了对数轴、不连续的日期时间轴等;改进TKDataPoin...

ios使用ijkplayer+nginx进行视频直播

上两节,我们讲到使用nginx和ngixn的rtmp模块搭建直播的服务器,接着我们讲解了在Android使用ijkplayer来作为我们的视频直播播放器,整个过程中,需要注意的就是ijlplayer编...

IOS技术分享|iOS快速生成开发文档(一)

前言对于开发人员而言,文档的作用不言而喻。文档不仅可以提高软件开发效率,还能便于以后的软件开发、使用和维护。本文主要讲述Objective-C快速生成开发文档工具appledoc。简介apple...

macOS下配置VS Code C++开发环境

本文介绍在苹果macOS操作系统下,配置VisualStudioCode的C/C++开发环境的过程,本环境使用Clang/LLVM编译器和调试器。一、前置条件本文默认前置条件是,您的开发设备已...