【EXCEL_VBA_实战】两组数据比对是否一致(字符串数组)

工作背景:比对两组数据是否一致(位置非一一对应

思路构建:两组数据转换为两组字符串数组,比对所包含元素是否相同

问题点:A数组的第一个元素不一定与B数组的第一个元素对应,此时无法通过公式简单对照

注:网上很多方法都是仅考虑位置一一对应的情况,没有考虑数据错位的情况

突破点:利用统一的排序规则,先分别将两个数组作排序,然后再比对。

逐一比对数组内相应位置的元素,若均相同,则两数组相同,即两组数据相同。

参考链接比較不同排列的字符串内容是否相同

目录

范例:图示两行数据的是否一致(M1、M2、M3)

[1. 构建字符串数组,并调用比较函数(主过程)](#1. 构建字符串数组,并调用比较函数(主过程))

[2. 构建排序函数(低版本EXCEL需要,高版本可直接使用EXCEL内置Sort)](#2. 构建排序函数(低版本EXCEL需要,高版本可直接使用EXCEL内置Sort))

[3. 构建比较函数(模块化编程,避免主函数冗杂)](#3. 构建比较函数(模块化编程,避免主函数冗杂))

[其他 VBA StrComp函数](#其他 VBA StrComp函数)


范例:图示两行数据的是否一致(M1、M2、M3)

1. 构建字符串数组,并调用比较函数(主过程)

注1:比对两行的M1、2、3组合是否一致,构建数组元素时要将 材料&板厚 作为一个整体考虑。

注2:执行时需要将1,2,3个代码块同时放在同一个模块下

vbnet 复制代码
Sub Example()
Dim M(), M_Temp(), M1, M2, M3, M1_Temp, M2_Temp, M3_Temp As Variant
Dim i As Boolean

M1 = Sheet3.Range("a32") & Sheet3.Range("b32")
M2 = Sheet3.Range("c32") & Sheet3.Range("d32")
M3 = Sheet3.Range("e32") & Sheet3.Range("f32")
M1_Temp = Sheet3.Range("a33") & Sheet3.Range("b33")
M2_Temp = Sheet3.Range("c33") & Sheet3.Range("d33")
M3_Temp = Sheet3.Range("e33") & Sheet3.Range("f33")

M = Array(M1, M2, M3)
M_Temp = Array(M1_Temp, M2_Temp, M3_Temp)

'结果输出
i = Compare_Combination(M, M_Temp, 3)

Sheet3.Range("b35") = i

End Sub

2. 构建排序函数(低版本EXCEL需要,高版本可直接使用EXCEL内置Sort)

vbnet 复制代码
Function Sort_Array(arr() As Variant) As Variant

Dim i, j As Integer
Dim temp As Variant

'因字符串比较,因此仅能使用StrComp
For i = LBound(arr) To UBound(arr)
    For j = i + 1 To UBound(arr)
        If VBA.StrComp(arr(i), arr(j), vbTextCompare) > 0 Then
        ' 字符顺序由小到大排序
            temp = arr(i)
            arr(i) = arr(j)
            arr(j) = temp
        End If
    Next j
Next i

Sort_Array = arr()

End Function

3. 构建比较函数(模块化编程,避免主函数冗杂)

vbnet 复制代码
Function Compare_Combination(M() As Variant, M_Temp() As Variant, num As Integer)

' M() 基准组合,M_Temp() 待比对组合,num 为元素数量

'比对结果,默认为True
Dim result As Boolean
result = True

Dim T(), T_Temp() As Variant

' 低版本EXCEL自主构建sort函数
T = Sort_Array(M)
T_Temp = Sort_Array(M_Temp)

'高版本EXCEL内置sort函数时可使用
' Sort函数需数组为列存储时方可正确排序(行数据无法正确排序),因此需转置再排序
'T = Excel.Application.WorksheetFunction.Sort(Application.WorksheetFunction.Transpose(M))
'T_Temp = Excel.Application.WorksheetFunction.Sort(Application.WorksheetFunction.Transpose(M_Temp))

Dim i As Integer
For i = 0 To num - 1
    If T(i) <> T_Temp(i) Then
        result = False
        Exit For
    End If
Next

Compare_Combination = result

End Function

其他 VBA StrComp函数

相关推荐
装不满的克莱因瓶19 分钟前
【Java架构师】各个微服务之间有哪些调用方式?
java·开发语言·微服务·架构·dubbo·restful·springcloud
杨筱毅26 分钟前
【穿越Effective C++】条款13:以对象管理资源——RAII原则的基石
开发语言·c++·effective c++
Zz_waiting.1 小时前
统一服务入口-Gateway
java·开发语言·gateway
四维碎片1 小时前
【Qt】大数据量表格刷新优化--只刷新可见区域
开发语言·qt
薛慕昭1 小时前
C语言核心技术深度解析:从内存管理到算法实现
c语言·开发语言·算法
火星数据-Tina2 小时前
Python + WebSocket 实现实时体育比分系统(含数据库设计与前端演示)
开发语言·前端
⑩-2 小时前
浅学Java-设计模式
java·开发语言·设计模式
攻心的子乐2 小时前
软考 关于23种设计模式
java·开发语言·设计模式
qq_479875432 小时前
C++ ODR
java·开发语言·c++
一叶之秋14123 小时前
Qt开发初识
开发语言·qt