使用VBA快速比对数据

实例需求:第一行是全系列数据集合,现在需要对比第一行数据,查找第2行数据中缺失的数字,保存在第3行中。

具备VBA初步使用经验的同学,都可以使用双重循环实现这个需求,这里给大家提供另一种实现思路,如何快速找到这些缺失数字。

复制代码
Sub Demo()
    Dim res(), arrData1, arrData2
    Dim sNumlist, iCnt, iIdx, i
    arrData1 = Range([B1], [B1].End(xlToRight))
    arrData2 = Application.Transpose(Application.Transpose(Range([A2], [B2].End(xlToRight).Offset(0, 1))))
    sNumlist = Join(arrData2, "|")
    iCnt = UBound(arrData1, 2)
    ReDim res(0, 1 To iCnt)
    iIdx = 1
    For i = 1 To iCnt
        If InStr(1, sNumlist, "|" & arrData1(1, i) & "|", vbTextCompare) = 0 Then
            res(0, iIdx) = arrData1(1, i)
            iIdx = iIdx + 1
        End If
    Next
    [B3].Resize(1, iCnt).Value = res
End Sub

【代码解析】

第4行代码将工作表中第1行数据加载到数组中。

第5行代码将工作表中第2行数据加载到数组中,请注意与第4行的不同之处在于,数据区域从A列到最后一个数据(J列)之后一列(K列)结束,也就是数组中的第一个和最后一个元素都是空值。经过两次Transpose,使得结果为单维数组,便于后续代码进行合并。

第6行代码调用Join函数将数组arrData2合并为一个字符串,使用竖线作为分隔符,本示例中结果如下,由于第5代码中的特殊处理,使得此处获得了起始处和结尾处的竖线,而不需要使用字符串合并单独处理。

|7|8|9|10|1|2|14|15|6|

第7行代码获取数据的个数。

第8行代码创建动态数据保存结果。

第10~15行代码使用For循环结构查找数据。

第11行代码调用Instr查找对比数据,这里的小技巧在于:如何避免将数组14或者15中的十位数字匹配数字1。在被查找数字两侧增加竖线,也就是查找|1|,这就有效的避免了上述误判,并且不需要循环遍历数组进行逐个对比。

第12行代码将缺失数字保存在结果数组中。

第13行代码保存位置序号加一。

第16行代码将结果写入到工作表中。

相关推荐
Tisfy1 天前
LeetCode 3637.三段式数组 I:一次遍历(三种实现)
算法·leetcode·题解·模拟·数组·遍历·moines
2401_841495642 天前
【Python高级编程】近似串匹配
python·算法·动态规划·字符串·数组·时间复杂度·空间复杂度
沉默-_-9 天前
力扣hot100普通数组(1)--C++
java·数据结构·算法·leetcode·数组
CappuccinoRose10 天前
React框架学习文档(三)
前端·react.js·ui·数组·标签·属性·jsx
Tisfy14 天前
LeetCode 3507.移除最小数对使数组有序 I:纯模拟
算法·leetcode·题解·模拟·数组
星火开发设计15 天前
C++ 数组:一维数组的定义、遍历与常见操作
java·开发语言·数据结构·c++·学习·数组·知识
Tisfy16 天前
LeetCode 3314.构造最小位运算数组 I:今日先简单题简单做-到II再优化
算法·leetcode·题解·模拟·数组
汉克老师20 天前
GESP2025年9月认证C++三级真题与解析(单选题9-15)
c++·算法·数组·string·字符数组·gesp三级·gesp3级
Tisfy21 天前
LeetCode 2943.最大化网格图中正方形空洞的面积:小小思维
算法·leetcode·题解·数组·思维·排序·连续
闻缺陷则喜何志丹1 个月前
【C++动态规划 状压dp】1879. 两个数组最小的异或值之和|2145
c++·算法·动态规划·力扣·数组·最小·动态规范