【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函数

相关推荐
破茧蝴蝶7 小时前
Python分布式爬虫完整教程
开发语言·python
狗凯之家源码网7 小时前
全新 PHP 轻量客服聊天室源码深度评测
开发语言·php·聊天室系统
远离UE48 小时前
UE5 Substrate Thin Film 源码拆析
开发语言·javascript·ue5
keyipatience8 小时前
JavaScript学习(1)书写位置,变量、数据类型、运算符
开发语言·前端·javascript·css·学习
栈帧之外9 小时前
【C++】STL之set
开发语言·c++
catchadmin9 小时前
免费可商用 PHP 管理后台 CatchAdmin V5.4.1 发布,新增 MCP 支持
开发语言·php
jimy111 小时前
c++的 Type Traits (二、更详细版本)
开发语言·c++
狗凯之家源码网11 小时前
纯 PHP+MySQL 应用市场系统源码实测!
开发语言·mysql·php
dishugj11 小时前
系统架构风险点、敏感点和权衡点的概念和区分
java·开发语言
geovindu11 小时前
rust:Memento Pattern(续)
开发语言·后端·设计模式·rust·行为模式·备忘录模